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 ?
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)) } }
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!