Beim Schreiben von Go-Funktionen, die log.Fatal() verwenden, kann deren Test aufgrund der sofortigen Beendigung eine Herausforderung darstellen des Programms. Um dies zu überwinden, benötigen wir eine Lösung, die es uns ermöglicht, das gewünschte Protokollierungsverhalten zu testen, ohne die Testausführung anzuhalten.
Ein Ansatz besteht darin, einen benutzerdefinierten Logger zu erstellen, der die Standardfunktion log.Fatal() durch eine solche überschreibt zeichnet die Protokollmeldung auf, ohne das Programm zu verlassen. Dieser benutzerdefinierte Logger kann dann im Testkontext verwendet werden und ermöglicht die Überprüfung erwarteter Protokollnachrichten.
Angenommen, wir haben eine Funktion, die ein „Hallo!“ protokolliert. Nachricht und eine weitere, die ein „Auf Wiedersehen!“ protokolliert. Nachricht mit log.Fatal().
package main import ( "log" ) func hello() { log.Print("Hello!") } func goodbye() { log.Fatal("Goodbye!") } func init() { log.SetFlags(0) } func main() { hello() goodbye() }
Um diese Funktionen zu testen, können wir einen benutzerdefinierten Pufferlogger erstellen:
package main import ( "bytes" "log" "testing" ) type BufferLogger struct { buf bytes.Buffer } func (l *BufferLogger) Println(v ...interface{}) { l.buf.WriteString(fmt.Sprintln(v...)) } func TestHello(t *testing.T) { l := &BufferLogger{} log.SetOutput(l) hello() wantMsg := "Hello!\n" msg := l.buf.String() if msg != wantMsg { t.Errorf("%#v, wanted %#v", msg, wantMsg) } }
In diesem benutzerdefinierten BufferLogger leiten wir alle Protokollausgaben um ein Puffer anstelle der Standardkonsole. Dadurch können wir die Protokollmeldungen erfassen und sie mit den erwarteten Werten in unserem Test vergleichen.
Für die Funktion goodbye() können wir einen ähnlichen Test erstellen, indem wir die Funktion Fatal() in unserem benutzerdefinierten Logger überschreiben Verhindern Sie, dass das Programm beendet wird:
func (l *BufferLogger) Fatalf(format string, v ...interface{}) { l.buf.WriteString(fmt.Sprintf(format, v...)) } func TestGoodbye(t *testing.T) { l := &BufferLogger{} log.SetOutput(l) goodbye() wantMsg := "Goodbye!\n" msg := l.buf.String() if msg != wantMsg { t.Errorf("%#v, wanted %#v", msg, wantMsg) } }
Durch Überschreiben der Funktion log.Fatal() können wir unsere Testausführung fortsetzen und gleichzeitig die erwartete Protokollnachricht erfassen. Mit dieser Technik können wir unsere Funktionen, die log.Fatal() verwenden, umfassend testen, ohne dass es zu einer vorzeitigen Programmbeendigung kommt.
Das obige ist der detaillierte Inhalt vonWie kann ich Go-Funktionen mit log.Fatal() effektiv testen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!