Wie teste ich Go-Anwendungen, die mit der Standardeingabe (Stdin) interagieren?

Mary-Kate Olsen
Freigeben: 2024-10-27 00:24:02
Original
558 Leute haben es durchsucht

How to Test Go Applications That Interact with Standard Input (Stdin)?

Go-Tests für Stdin-Interaktionen schreiben

Bei Softwaretests ist es oft notwendig, Tests zu schreiben, die mit stdin, dem Standard-Eingabestream, interagieren. Dies ist besonders relevant, wenn Anwendungen getestet werden, die Eingaben von der Konsole oder einer Benutzeroberfläche lesen.

Betrachten Sie die folgende Go-Anwendung, die Zeilen von stdin liest und sie an stdout zurückgibt:

<code class="go">package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    for {
        fmt.Print("> ")
        bytes, _, err := reader.ReadLine()
        if err == io.EOF {
            os.Exit(0)
        }
        fmt.Println(string(bytes))
    }
}</code>
Nach dem Login kopieren

Um diese Anwendung zu testen, kann ein Testfall geschrieben werden, um Benutzereingaben zu simulieren und die Ergebnisse mit der erwarteten Ausgabe zu vergleichen:

<code class="go">package main

import (
    "bufio"
    "io"
    "os"
    "os/exec"
    "testing"
)

func TestInput(t *testing.T) {
    subproc := exec.Command(os.Args[0])
    stdin, _ := subproc.StdinPipe()
    stdout, _ := subproc.StdoutPipe()
    defer stdin.Close()

    input := "abc\n"

    subproc.Start()
    io.WriteString(stdin, input)
    reader := bufio.NewReader(stdout)
    bytes, _, _ := reader.ReadLine()
    output := string(bytes)
    if input != output {
        t.Errorf("Wanted: %v, Got: %v", input, output)
    }
    subproc.Wait()
}</code>
Nach dem Login kopieren

Dieser Test kann jedoch mit der Fehlermeldung fehlschlagen: „Wanted: abc, Got: --- FAIL: TestInput (3.32s)".

Um dieses Problem zu beheben, ziehen Sie die folgende Lösung in Betracht:

Anstatt stdin und stdout direkt in der Hauptfunktion zu manipulieren, definieren Sie eine separate Funktion das io.Reader und io.Writer als Parameter akzeptiert und die gewünschten Operationen ausführt. Die Hauptfunktion kann diese Funktion dann aufrufen, was das Testen erleichtert.

Erstellen Sie beispielsweise eine Funktion namens Echo:

<code class="go">func Echo(reader io.Reader, writer io.Writer) {
    reader := bufio.NewReader(reader)
    for {
        fmt.Print("> ", writer)
        bytes, _, err := reader.ReadLine()
        if err == io.EOF {
            return
        }
        fmt.Println(string(bytes), writer)
    }
}</code>
Nach dem Login kopieren

Rufen Sie im Test direkt die Echo-Funktion auf statt Interaktion mit stdin und stdout:

<code class="go">// ...

func TestInput(t *testing.T) {
    inputReader := strings.NewReader("abc\n")
    outputWriter := new(bytes.Buffer)
    Echo(inputReader, outputWriter)
    result := outputWriter.String()
    if input != result {
        t.Errorf("Wanted: %v, Got: %v", input, result)
    }
}</code>
Nach dem Login kopieren

Dieser Test sollte jetzt bestanden werden, da er die Echo-Funktion direkt testet, ohne auf die Manipulation von stdin und stdout angewiesen zu sein.

Das obige ist der detaillierte Inhalt vonWie teste ich Go-Anwendungen, die mit der Standardeingabe (Stdin) interagieren?. 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!