Wie teste ich Go-Anwendungen, die von Stdin lesen?

Patricia Arquette
Freigeben: 2024-10-26 13:27:30
Original
797 Leute haben es durchsucht

How to Test Go Applications That Read from Stdin?

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

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

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage