Test des scénarios os.Exit dans Go
Lors de l'écriture de tests impliquant l'appel de fonctions qui quittent le programme à l'aide de os.Exit(), il devient nécessaire d’isoler leur impact sur le reste de la suite de tests. Pour relever ce défi, nous pouvons tirer parti de l'approche suivante inspirée d'une présentation d'Andrew Gerrand, un membre principal de l'équipe Go.
Étant donné une fonction qui termine le programme via os.Exit() :
package main import ( "fmt" "os" ) func Crasher() { fmt.Println("Going down in flames!") os.Exit(1) }
Créez un scénario de test correspondant :
package main import ( "os" "os/exec" "testing" ) func TestCrasher(t *testing.T) { // Check if the BE_CRASHER environment variable is set to 1. if os.Getenv("BE_CRASHER") == "1" { Crasher() return } // Construct a command to re-run the test binary, limiting its execution to TestCrasher. cmd := exec.Command(os.Args[0], "-test.run=TestCrasher") // Set additional environment variables. cmd.Env = append(os.Environ(), "BE_CRASHER=1") // Execute the command. err := cmd.Run() // Verify the exit status of the command. if e, ok := err.(*exec.ExitError); ok && !e.Success() { return } // Report failure if the command ran with an unexpected exit code. t.Fatalf("process ran with err %v, want exit status 1", err) }
Ce scénario de test ré-appelle go test dans un processus séparé, isolant l'exécution de TestCrasher du reste de la suite. Il définit également une variable d'environnement (BE_CRASHER=1) que le processus invoqué vérifie et, si elle est présente, appelle la fonction testée. Ainsi, nous évitons les boucles infinies et veillons à ce que le bon code de sortie soit validé.
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!