OS.exit-Szenarien in Go testen
In Go stoppt die os.Exit-Funktion die Programmausführung und beendet das Betriebssystem. Aber wie testen wir Szenarien mit os.Exit innerhalb einer Testsuite, ohne andere Tests zu beeinträchtigen?
Betrachten Sie den folgenden Code:
func doomed() { os.Exit(1) }
Um zu testen, dass der Aufruf von „doomed“ zu einem Exit führt, haben wir kann es nicht einfach innerhalb des Tests aufrufen, da dies auch den Testläufer beenden würde. Lassen Sie uns stattdessen den von Andrew Gerrand demonstrierten Ansatz untersuchen.
Gerrands Methode besteht darin, den Test in einem separaten Prozess auszuführen. Dadurch können wir den os.Exit-Aufruf innerhalb des separaten Prozesses kapseln und sicherstellen, dass er keine Auswirkungen auf den Haupttestläufer hat.
So funktioniert es:
// 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) }
Dieser Test ruft go auf Testen Sie erneut in einem separaten Prozess und zielen Sie nur auf den TestCrasher-Test ab. Es legt eine Umgebungsvariable (BE_CRASHER) fest, nach der der Unterprozess sucht. Wenn festgelegt, ruft der Unterprozess Crasher auf und wird sofort beendet, um eine unendliche Rekursion zu vermeiden.
In der Zwischenzeit kann der ursprüngliche Testprozess dann den Exit-Code des Unterprozesses validieren und so sicherstellen, dass er wie erwartet beendet wurde.
Das obige ist der detaillierte Inhalt vonWie teste ich „os.Exit'-Szenarien in Go, ohne dass Ihre Testsuite abstürzt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!