Testen der protokollierten Ausgabe in Go-Tests
In Go beinhalten Komponententests häufig die Überprüfung der Ausgabe oder Protokolle, die von der getesteten Funktion generiert werden. Angenommen, wir haben eine Funktion, die Fehler in bestimmten Szenarien protokolliert.
Das Problem:
Gegeben sei die folgende Funktion readByte, die eine Fehlermeldung protokolliert:
func readByte(/*...*/) { // ... if err != nil { fmt.Println("ERROR") log.Print("Couldn't read first byte") return } // ... }
Wie können wir den Ausgabefehler in readByte mithilfe eines Go-Tests testen, ohne die Funktion selbst zu ändern?
Die Lösung:
Um die Protokollausgabe zu erfassen, haben wir kann die Ausgabe des Protokollpakets während des Tests in einen temporären Puffer umleiten und dann den Inhalt des Puffers bestätigen.
Beispielcode:
Im readbyte_test.go Datei:
package main import ( "bytes" "fmt" "io" "log" "os" "testing" ) func readByte( /*...*/ ) { // ... err := io.EOF // Force an error if err != nil { fmt.Println("ERROR") log.Print("Couldn't read first byte") return } // ... } func TestReadByte(t *testing.T) { var buf bytes.Buffer log.SetOutput(&buf) defer func() { log.SetOutput(os.Stderr) }() readByte() t.Logf("Output: %s", buf.String()) }
Beispielausgabe:
$ go test -v readbyte_test.go === RUN TestReadByte --- PASS: TestReadByte (0.00s) readbyte_test.go:30: Output: ERROR Couldn't read first byte PASS ok command-line-arguments 0.004s $
In diesem Beispiel können die ausgegebenen Fehlermeldungen jetzt mit den integrierten Testtools von Go getestet und verifiziert werden ohne die ursprüngliche readByte-Funktion zu ändern.
Das obige ist der detaillierte Inhalt vonWie teste ich die protokollierte Ausgabe in Go-Tests, ohne die Funktion zu ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!