Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menguji Aplikasi Go yang Berinteraksi dengan Input Standard (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>
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>
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>
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>
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!