Heim > Artikel > Backend-Entwicklung > Wie teste ich „os.Exit'-Szenarien in Go, ohne die Testsuite zu unterbrechen?
Die Abdeckung verschiedener Testszenarien ist für eine robuste Softwareentwicklung von entscheidender Bedeutung. In Go stellt das Testen von Funktionen, die os.Exit aufrufen, eine einzigartige Herausforderung dar. Wie können wir Exit-Szenarien testen, ohne die gesamte Testsuite zu beeinträchtigen?
Betrachten Sie die folgende Funktion als zum Scheitern verurteilt:
func doomed() { os.Exit(1) }
Um effektiv zu testen, ob der Aufruf dieser Funktion einen Exit auslöst, werden Sie Folgendes tun Sie müssen eine Strategie anwenden, die den os.Exit-Aufruf innerhalb des Tests einschränkt und verhindert, dass er sich auf andere Tests auswirkt.
Andrew Gerrand, ein Kernmitglied des Go-Teams, bietet in seinem Vortrag einen genialen Ansatz für dieses Problem. Lassen Sie uns diese Lösung implementieren:
main.go (Programm mit zu testender Funktion)
package main import ( "fmt" "os" ) func Crasher() { fmt.Println("Going down in flames!") os.Exit(1) }
main_test.go (Test auf Crasher-Funktion)
package main import ( "os" "os/exec" "testing" ) func TestCrasher(t *testing.T) { // Check if "BE_CRASHER" environment variable is set. if os.Getenv("BE_CRASHER") == "1" { Crasher() return } // Invoke the test again with "BE_CRASHER=1" to trigger the Crasher call. cmd := exec.Command(os.Args[0], "-test.run=TestCrasher") cmd.Env = append(os.Environ(), "BE_CRASHER=1") err := cmd.Run() // Validate exit code. if e, ok := err.(*exec.ExitError); ok && !e.Success() { return } t.Fatalf("process ran with err %v, want exit status 1", err) }
Ausführung:
Diese Lösung funktioniert wie folgt:
Mit diesem Ansatz können Sie Exit-Szenarien in Go sicher testen, ohne den zu unterbrechen Rest Ihrer Testsuite.
Das obige ist der detaillierte Inhalt vonWie teste ich „os.Exit'-Szenarien in Go, ohne die Testsuite zu unterbrechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!