Lorsque vous testez plusieurs fonctions avec des signatures et des valeurs de retour similaires, il est fastidieux d'écrire des tests individuels pour chaque fonction. Dans Go, la réflexion peut fournir une solution pour tester ces fonctions collectivement.
Considérons un ensemble de fonctions (Func1, Func2, ...) avec la signature suivante :
func YourFunction() (int, error)
Objectif : Écrivez un test qui parcourt cet ensemble de fonctions, appelle chacune d'elles et teste leurs valeurs de retour pour des conditions spécifiques.
Reflection nous permet d'accéder et de manipuler des valeurs et des fonctions au moment de l'exécution. En créant un objet réflexion.Value pour le récepteur, nous pouvons trouver la fonction correspondante et l'appeler en utilisant réflexion.Value.MethodByName. L'exactitude de la valeur renvoyée peut ensuite être examinée.
Voici un exemple de test qui utilise la réflexion pour tester toutes les fonctions avec l'interface spécifiée :
<code class="go">func TestFunc(t *testing.T) { var funcNames = []string{"Func1", "Func2", "Func3"} stype := reflect.ValueOf(s) // receiver for _, fname := range funcNames { sfunc := stype.MethodByName(fname) ret := sfunc.Call([]reflect.Value{}) val := ret[0].Int() err := ret[1] if val < 1 { t.Error(fname + " should return positive value") } if !err.IsNil() { // checks for a nil error t.Error(fname + " shouldn't err") } } }</code>
Gardez à l'esprit que l'appel d'une fonction inexistante à l'aide de la réflexion provoquera une panique. Pour gérer cela, nous pouvons utiliser des fonctions différées et récupérer pour attraper la panique et fournir des messages d'erreur plus informatifs.
En utilisant la réflexion et en gérant les exceptions de manière appropriée, nous pouvons créer un test unique qui teste efficacement plusieurs fonctions avec un comportement similaire, réduisant ainsi le besoin de code de test répétitif et garantissant la robustesse de nos tests.
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!