Stdin 相互作用の Go テストの作成
ソフトウェア テストでは、多くの場合、標準入力ストリームである stdin と相互作用するテストを作成する必要があります。これは、コンソールまたはユーザー インターフェイスから入力を読み取るアプリケーションをテストする場合に特に関係します。
stdin から行を読み取り、stdout にエコーバックする次の Go アプリケーションを考えてみましょう。
<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>
このアプリケーションをテストするには、ユーザー入力をシミュレートし、結果を予想される出力と比較するテスト ケースを作成できます:
<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>
ただし、このテストは次のエラーで失敗する可能性があります:「Wanted: abc, Got: --- FAIL: TestInput (3.32s)".
この問題を解決するには、次の解決策を検討してください。
メイン関数で stdin と stdout を直接操作する代わりに、別の関数を定義します。 io.Reader と io.Writer をパラメータとして受け取り、必要な操作を実行します。 main 関数はこの関数を呼び出すことができるため、テストが容易になります。
たとえば、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>
テストでは、代わりに Echo 関数を直接呼び出します。 stdin および 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>
stdin および stdout の操作に依存せずに Echo 関数を直接テストするため、このテストはパスするはずです。
以上が標準入力 (Stdin) と対話する Go アプリケーションをテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。