Maison > développement back-end > Golang > Comment pouvons-nous tester efficacement les fonctions génériques en Go sans instancier les paramètres de type ?

Comment pouvons-nous tester efficacement les fonctions génériques en Go sans instancier les paramètres de type ?

DDD
Libérer: 2024-12-04 11:09:10
original
880 Les gens l'ont consulté

How Can We Effectively Table Test Generic Functions in Go Without Instantiating Type Parameters?

Test des fonctions génériques dans Go

Défi :

Go 1.18 introduit les génériques, mais comment tester efficacement les génériques fonctionne lorsque l'instanciation n'est pas possible pour les valeurs T ?

Problème Déclaration :

Les méthodes de test actuelles nécessitent de redéclarer la logique de test pour chaque fonction en raison de l'incapacité d'instancier les valeurs T.

Approche :

L'approche de test doit se concentrer sur la réutilisation d'une logique commune tout en tenant compte de la nature spécifique des systèmes génériques. fonctions.

Solution :

1. Logique de test réutilisable :

Créez une fonction de test générique, telle que runTestCase[T Item](tc testCase[T]), qui encapsule les opérations courantes telles que la configuration des tests et la vérification des résultats.

2. Considération d'instanciation :

Les fonctions génériques doivent éventuellement être instanciées avec des types spécifiques. Cependant, il n'est pas nécessaire de tester tous les paramètres de type possibles.

3. Concentrez-vous sur le comportement spécifique au type :

Concentrez-vous sur le test des fonctions pour des types spécifiques uniquement si leurs comportements diffèrent en fonction de la sémantique des opérateurs. Par exemple, l'opérateur pour les nombres et les chaînes, ou les opérateurs de comparaison pour les nombres et les chaînes.

Exemple :

Ce code de test utilise la fonction générique runTestCase pour tester différents types de valeurs dans une carte de magasin :

func TestStore(t *testing.T) {
    t.Run("ints", testInt)
    t.Run("strings", testString)
}

func testString(t *testing.T) {
    t.Parallel()
    tests := []testCase[string]{
        {
            start:    store[string]{},
            key:      123,
            val:      "test",
            expected: store[string]{123: "test"},
        },
        // ...
    }
    for _, tc := range tests {
        t.Run(tc.name, runTestCase(tc))
    }
}

func testInt(t *testing.T) {
    t.Parallel()
    tests := []testCase[int]{
        {
            start:    store[int]{},
            key:      123,
            val:      456,
            expected: store[int]{123: 456},
        },
        // ...
    }
    for _, tc := range tests {
        t.Run(tc.name, runTestCase(tc))
    }
}
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:php.cn
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