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!