Testen auf Panik in Go
Beim Schreiben von Tests in Go kann die Prüfung auf Panik eine nützliche Technik sein. Im Gegensatz zu Java verfügt Go jedoch nicht über eine explizite Syntax zur selektiven Behandlung von Paniken.
Betrachten Sie das folgende Beispiel:
func f(t *testing.T) { defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) } }() OtherFunctionThatPanics() t.Errorf("The code did not panic") }
Dieser Code versucht, mithilfe der Wiederherstellungsfunktion eine Panik in OtherFunctionThatPanics zu beheben . Es kann jedoch schwierig sein, festzustellen, ob die Funktion überhaupt in Panik geraten ist oder ob keine Panik aufgetreten ist.
Lösung
Der empfohlene Ansatz besteht darin, sich auf das Testen auf Abwesenheit zu konzentrieren einer Panik. Dies kann erreicht werden, indem die Logik umgekehrt wird und sichergestellt wird, dass eine Panik auftritt, wenn sie erwartet wird:
func TestPanic(t *testing.T) { defer func() { if r := recover(); r == nil { t.Errorf("The code did not panic") } }() // Code under test OtherFunctionThatPanics() }
Darüber hinaus bieten fortgeschrittenere Test-Frameworks wie Ginkgo oder Gomega integrierte Matcher zur Feststellung des Auftretens von Paniken:
Expect(OtherFunctionThatPanics).To(Panic())
Hilfsfunktionen
Der Einfachheit halber können Sie erstellen eine generische Funktion zur Geltendmachung von Panik:
func assertPanic(t *testing.T, f func()) { defer func() { if r := recover(); r == nil { t.Errorf("The code did not panic") } }() f() }
Diese Funktion kann wie folgt verwendet werden:
func TestPanic(t *testing.T) { assertPanic(t, OtherFunctionThatPanics) }
Das obige ist der detaillierte Inhalt vonWie kann ich in Go effektiv auf Panik testen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!