Maison >développement back-end >Golang >Comment puis-je tester efficacement les paniques en Go ?

Comment puis-je tester efficacement les paniques en Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-05 15:19:09445parcourir

How Can I Effectively Test for Panics in Go?

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!

Déclaration:
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