Bagaimana untuk Menguji Aplikasi Go yang Berinteraksi dengan Input Standard (Stdin)?

Mary-Kate Olsen
Lepaskan: 2024-10-27 00:24:02
asal
557 orang telah melayarinya

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

Menulis Ujian Go untuk Interaksi Stdin

Dalam ujian perisian, selalunya perlu menulis ujian yang berinteraksi dengan stdin, strim input standard. Ini amat relevan apabila menguji aplikasi yang membaca input daripada konsol atau antara muka pengguna.

Pertimbangkan aplikasi Go berikut yang membaca baris daripada stdin dan menggemakannya kembali ke stdout:

<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>
Salin selepas log masuk

Untuk menguji aplikasi ini, kes ujian boleh ditulis untuk mensimulasikan input pengguna dan membandingkan keputusan dengan output yang dijangkakan:

<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>
Salin selepas log masuk

Walau bagaimanapun, ujian ini mungkin gagal dengan ralat: "Dikehendaki: abc, Mendapat: --- FAIL: TestInput (3.32s)".

Untuk menyelesaikan isu ini, pertimbangkan penyelesaian berikut:

Daripada memanipulasi stdin dan stdout secara langsung dalam fungsi utama, tentukan fungsi yang berasingan yang menerima io.Reader dan io.Writer sebagai parameter dan melaksanakan operasi yang diingini. Fungsi utama kemudiannya boleh memanggil fungsi ini, menjadikannya lebih mudah untuk diuji.

Sebagai contoh, buat fungsi yang dipanggil 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>
Salin selepas log masuk

Dalam ujian, panggil terus fungsi Echo dan bukannya berinteraksi dengan stdin dan 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>
Salin selepas log masuk

Ujian ini sepatutnya lulus, kerana ia menguji secara langsung fungsi Echo tanpa bergantung pada manipulasi stdin dan stdout.

Atas ialah kandungan terperinci Bagaimana untuk Menguji Aplikasi Go yang Berinteraksi dengan Input Standard (Stdin)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!