Go-Anwendungen mit Stdin-Eingabe testen
In Go kann das Testen von Anwendungen, die von Stdin lesen, eine Herausforderung sein. Stellen Sie sich eine einfache Anwendung vor, die stdin-Eingaben an stdout zurückgibt. Obwohl es einfach erscheinen mag, kann das Schreiben eines Testfalls, der die Ausgabe überprüft, Schwierigkeiten bereiten.
Fehlgeschlagener Versuch
Ein erster Ansatz wäre, stdin und stdout mithilfe von Pipes zu simulieren und manuell in die stdin-Pipe schreiben. Dies kann jedoch zu Rennbedingungen und unerwarteten Fehlern führen.
Lösung: Logik extrahieren und unabhängige Funktion testen
Anstatt alle Vorgänge in der Hauptfunktion mit stdin und auszuführen stdout, erstellen Sie eine separate Funktion, die io.Reader und io.Writer als Parameter akzeptiert. Dieser Ansatz ermöglicht es der Hauptfunktion, die Funktion aufzurufen, während die Testfunktion sie direkt testet.
Refactored Code
<code class="go">package main import ( "bufio" "fmt" "io" ) // Echo takes an io.Reader and an io.Writer and echoes input to output. func Echo(r io.Reader, w io.Writer) { reader := bufio.NewReader(r) for { fmt.Print("> ") bytes, _, _ := reader.ReadLine() if bytes == nil { break } fmt.Fprintln(w, string(bytes)) } } func main() { Echo(os.Stdin, os.Stdout) }</code>
Aktualisierter Testfall
<code class="go">package main import ( "bufio" "bytes" "io" "os" "testing" ) func TestEcho(t *testing.T) { input := "abc\n" reader := bytes.NewBufferString(input) writer := &bytes.Buffer{} Echo(reader, writer) actual := writer.String() if actual != input { t.Errorf("Wanted: %v, Got: %v", input, actual) } }</code>
Dieser Testfall simuliert die Hauptfunktion, indem er die Echo-Funktion direkt mit einem Puffer für die Standardeingabe und einem Puffer zum Erfassen der Ausgabe aufruft. Die erfasste Ausgabe wird dann mit der erwarteten Eingabe verglichen, um sicherzustellen, dass die Funktion die Eingabe korrekt wiedergibt.
Das obige ist der detaillierte Inhalt vonWie teste ich Go-Anwendungen, die von Stdin lesen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!