ホームページ  >  記事  >  バックエンド開発  >  Stdin から読み取る Go アプリケーションをテストするにはどうすればよいですか?

Stdin から読み取る Go アプリケーションをテストするにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-26 13:27:30744ブラウズ

How to Test Go Applications That Read from Stdin?

標準入力を使用した Go アプリケーションのテスト

Go では、標準入力から読み取るアプリケーションのテストは困難な場合があります。 stdin 入力を stdout にエコーする単純なアプリケーションを考えてみましょう。簡単そうに見えますが、出力を検証するテスト ケースを作成することは困難を引き起こす可能性があります。

失敗した試行

最初のアプローチは、パイプを使用して stdin と stdout をシミュレートすることです。そして手動で標準入力パイプに書き込みます。ただし、これにより競合状態や予期しない障害が発生する可能性があります。

解決策: ロジックを抽出し、独立した関数をテストします

stdin と stdin を使用して main 関数ですべての操作を実行する代わりに、 stdout を使用して、io.Reader と io.Writer をパラメーターとして受け入れる別の関数を作成します。このアプローチにより、テスト関数が関数を直接テストしている間にメイン関数が関数を呼び出すことができます。

リファクタリングされたコード

<code class="go">package main

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

// Echo takes an io.Reader and an io.Writer and echoes input to output.
func Echo(r io.Reader, w io.Writer) {
    reader := bufio.NewReader(r)
    for {
        fmt.Print("> ")
        bytes, _, _ := reader.ReadLine()
        if bytes == nil {
            break
        }
        fmt.Fprintln(w, string(bytes))
    }
}

func main() {
    Echo(os.Stdin, os.Stdout)
}</code>

更新されたテスト ケース

<code class="go">package main

import (
    "bufio"
    "bytes"
    "io"
    "os"
    "testing"
)

func TestEcho(t *testing.T) {
    input := "abc\n"
    reader := bytes.NewBufferString(input)
    writer := &bytes.Buffer{}

    Echo(reader, writer)

    actual := writer.String()
    if actual != input {
        t.Errorf("Wanted: %v, Got: %v", input, actual)
    }
}</code>

このテスト ケースは、標準入力用のバッファーと出力をキャプチャするためのバッファーを使用して Echo 関数を直接呼び出すことにより、main 関数をシミュレートします。次に、キャプチャされた出力が予期される入力と比較され、関数が入力を正しくエコーすることが保証されます。

以上がStdin から読み取る Go アプリケーションをテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。