Test des scénarios os.exit dans Go
Dans Go, la fonction os.Exit arrête l'exécution du programme et quitte le système d'exploitation. Mais comment tester des scénarios impliquant os.Exit dans une suite de tests sans affecter les autres tests ?
Considérez le code suivant :
func doomed() { os.Exit(1) }
Pour tester que l'appel voué à l'échec entraîne une sortie, nous Je ne peux pas simplement l'appeler dans le test, car cela mettrait également fin au programme d'exécution du test. Explorons plutôt l'approche démontrée par Andrew Gerrand.
La méthode de Gerrand consiste à exécuter le test dans un processus distinct. Cela nous permet d'encapsuler l'appel os.Exit dans le processus séparé, garantissant qu'il n'a pas d'impact sur le lanceur de test principal.
Voici comment cela fonctionne :
// main_test.go package main import ( "os" "os/exec" "testing" ) func TestCrasher(t *testing.T) { if os.Getenv("BE_CRASHER") == "1" { Crasher() return } cmd := exec.Command(os.Args[0], "-test.run=TestCrasher") cmd.Env = append(os.Environ(), "BE_CRASHER=1") err := cmd.Run() if e, ok := err.(*exec.ExitError); ok && !e.Success() { return } t.Fatalf("process ran with err %v, want exit status 1", err) }
Ce test invoque go testez à nouveau dans un processus distinct, ciblant uniquement le test TestCrasher. Il définit une variable d'environnement (BE_CRASHER) que le sous-processus vérifie. S'il est défini, le sous-processus appelle Crasher et se termine immédiatement pour éviter une récursion infinie.
Pendant ce temps, le processus de test d'origine peut alors valider le code de sortie du sous-processus, garantissant qu'il se termine comme prévu.
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!