Heim > Backend-Entwicklung > Golang > Wie kann ich Go-Funktionen mit log.Fatal() effektiv testen?

Wie kann ich Go-Funktionen mit log.Fatal() effektiv testen?

DDD
Freigeben: 2024-12-07 20:48:14
Original
402 Leute haben es durchsucht

How Can I Effectively Test Go Functions Using log.Fatal()?

Go-Funktionen mit log.Fatal() testen

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()
}
Nach dem Login kopieren

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)
    }
}
Nach dem Login kopieren

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)
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage