Test de panique dans Go
Lors de l'écriture de tests dans Go, la vérification des paniques peut être une technique utile. Cependant, contrairement à Java, Go n'a pas de syntaxe explicite pour gérer les paniques de manière sélective.
Considérez l'exemple suivant :
func f(t *testing.T) { defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) } }() OtherFunctionThatPanics() t.Errorf("The code did not panic") }
Ce code tente de récupérer de toute panique dans OtherFunctionThatPanics à l'aide de la fonction de récupération. . Cependant, il peut être difficile de déterminer si la fonction a paniqué ou si aucune panique ne s'est produite.
Solution
L'approche recommandée consiste à se concentrer sur les tests d'absence d'une panique. Ceci peut être réalisé en inversant la logique et en garantissant qu'une panique se produit si prévu :
func TestPanic(t *testing.T) { defer func() { if r := recover(); r == nil { t.Errorf("The code did not panic") } }() // Code under test OtherFunctionThatPanics() }
De plus, des cadres de tests plus avancés tels que Ginkgo ou Gomega fournissent des matchers intégrés pour affirmer l'apparition de paniques :
Expect(OtherFunctionThatPanics).To(Panic())
Fonctions utilitaires
Pour plus de commodité, vous pouvez créer un générique fonction d'affirmation de panique :
func assertPanic(t *testing.T, f func()) { defer func() { if r := recover(); r == nil { t.Errorf("The code did not panic") } }() f() }
Cette fonction peut être utilisée comme suit :
func TestPanic(t *testing.T) { assertPanic(t, OtherFunctionThatPanics) }
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!