Heim > Artikel > Backend-Entwicklung > Wie teste ich Funktionen, die os.Exit() in Go aufrufen?
OS.Exit-Szenarien in Go testen
Beim Schreiben von Tests, bei denen Funktionen aufgerufen werden, die das Programm mit os.Exit() beenden, ist es Es ist notwendig, ihre Auswirkungen auf den Rest der Testsuite zu isolieren. Um dieser Herausforderung zu begegnen, können wir den folgenden Ansatz nutzen, der von einer Präsentation von Andrew Gerrand, einem Kernmitglied des Go-Teams, inspiriert ist.
Angenommen eine Funktion, die das Programm über os.Exit() beendet:
package main import ( "fmt" "os" ) func Crasher() { fmt.Println("Going down in flames!") os.Exit(1) }
Erstellen Sie einen entsprechenden Testfall:
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) }
Dieser Testfall ruft go test in einem separaten Prozess erneut auf und isoliert die Ausführung von TestCrasher vom Rest der Suite. Außerdem wird eine Umgebungsvariable (BE_CRASHER=1) festgelegt, nach der der aufgerufene Prozess sucht und, falls vorhanden, die zu testende Funktion aufruft. Dadurch vermeiden wir Endlosschleifen und stellen sicher, dass der richtige Exit-Code validiert wird.
Das obige ist der detaillierte Inhalt vonWie teste ich Funktionen, die os.Exit() in Go aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!