ホームページ > バックエンド開発 > Golang > 標準入力 (Stdin) と対話する Go アプリケーションをテストするにはどうすればよいですか?

標準入力 (Stdin) と対話する Go アプリケーションをテストするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-10-27 00:24:02
オリジナル
664 人が閲覧しました

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

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート