Maison > développement back-end > Golang > Écriture de tests unitaires pour les fonctions génériques dans Golang

Écriture de tests unitaires pour les fonctions génériques dans Golang

WBOY
Libérer: 2024-02-11 09:42:09
avant
974 Les gens l'ont consulté

在 golang 中为泛型函数编写单元测试

éditeur php Banana vous propose un article sur l'écriture de tests unitaires pour les fonctions génériques dans Golang. Golang est un langage de programmation fortement typé, cependant, sa prise en charge des génériques est relativement faible. Par conséquent, l’écriture de tests unitaires pour des fonctions génériques peut présenter certains défis. Cet article vous expliquera comment écrire efficacement des tests unitaires pour les fonctions génériques dans Golang afin de garantir la qualité et la fiabilité de votre code. Que vous soyez débutant ou développeur expérimenté, cet article vous fournira des conseils pratiques et des méthodes pour vous aider à gérer facilement les tests unitaires de fonctions génériques. Nous allons jeter un coup d'oeil!

Contenu de la question

J'ai cette fonction générique simple qui récupère une clé de map

// getmapkeys returns the keys of a map
func getmapkeys[t comparable, u any](m map[t]u) []t {
    keys := make([]t, len(m))
    i := 0
    for k := range m {
        keys[i] = k
        i++
    }
    return keys
}
Copier après la connexion

J'essaie d'écrire un test unitaire piloté par table comme ceci :

var testunitgetmapkeys = []struct {
    name     string
    inputmap interface{}
    expected interface{}
}{
    {
        name:     "string keys",
        inputmap: map[string]int{"foo": 1, "bar": 2, "baz": 3},
        expected: []string{"foo", "bar", "baz"},
    },
    {
        name:     "int keys",
        inputmap: map[int]string{1: "foo", 2: "bar", 3: "baz"},
        expected: []int{1, 2, 3},
    },
    {
        name:     "float64 keys",
        inputmap: map[float64]bool{1.0: true, 2.5: false, 3.1415: true},
        expected: []float64{1.0, 2.5, 3.1415},
    },
}
Copier après la connexion

Cependant, le code suivant échoue

func (us *unitutilsuite) testunitgetmapkeys() {
    for i := range testunitgetmapkeys {
        us.t().run(testunitgetmapkeys[i].name, func(t *testing.t) {
            gotkeys := getmapkeys(testunitgetmapkeys[i].inputmap)
        })
    }
}
Copier après la connexion

et

type interface{} of testunitgetmapkeys[i].inputmap does not match map[t]u (cannot infer t and u)
Copier après la connexion

Ceci a été corrigé avec une conversion explicite

gotKeys := getMapKeys(testUnitGetMapKeys[i].inputMap.(map[string]string))
Copier après la connexion

Existe-t-il un moyen d'automatiser ces tests sans avoir à effectuer des conversions explicites pour chaque variable de test d'entrée ?

Solution de contournement

Veuillez noter qu'à moins que votre fonction générique n'exécute une logique spécifique à un type en plus de la logique générique, vous ne gagnerez rien en testant la fonction avec différents types. La logique générale de la fonction est la même pour tous les types du jeu de types du paramètre type, elle peut donc être entièrement exécutée en utilisant un seul type.

Mais si vous souhaitez exécuter des tests sur différents types, vous pouvez simplement faire :

var testUnitGetMapKeys = []struct {
    name string
    got  any
    want any
}{
    {
        name: "string keys",
        got:  getMapKeys(map[string]int{"foo": 1, "bar": 2, "baz": 3}),
        want: []string{"foo", "bar", "baz"},
    },
    {
        name: "int keys",
        got:  getMapKeys(map[int]string{1: "foo", 2: "bar", 3: "baz"}),
        want: []int{1, 2, 3},
    },
    {
        name: "float64 keys",
        got:  getMapKeys(map[float64]bool{1.0: true, 2.5: false, 3.1415: true}),
        want: []float64{1.0, 2.5, 3.1415},
    },
}

// ...

func (us *UnitUtilSuite) TestUnitGetMapKeys() {
    for _, tt := range testUnitGetMapKeys {
        us.T().Run(tt.name, func(t *testing.T) {
            if !reflect.DeepEqual(tt.got, tt.want) {
                t.Errorf("got=%v; want=%v", tt.got, tt.want)
            }
        })
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal