Go
Go4Day 3

標準出力のテスト

More than 1 year has passed since last update.

はじめに

この記事はGo4 Advent Calendar 2017の3日目の記事です。

標準出力のテストの方法について2つ紹介していきます。

標準出力のテスト

書き込み先の変更

標準出力の結果をテストする方法として、書き込み先を変更する方法があります。

テスト実行時は普段と書き込み先を変更することで正常に出力されるかどうかをテストすることができるようになります。

書き込み先の指定はfmt.Fprint関数で行います。

この場合、以下のように出力先を指定できるように実装する必要があります。

普段は明示的にos.Stdoutに書き込むように指定します。

func Output(w io.Writer, output string) {
    fmt.Fprintln(w, output)
}

func Main() {
    Output(os.Stdout, "output")
}

テスト実行時には、書き込み先にbytes.Bufferを指定します。

bytes.Bufferは書き込まれた文字列をメモリ上に保持してくれるため、保持された情報を取り出すことで予期した値が出力されたかどうかをテストすることができます。

func TestOutput(t *testing.T) {
    buf := new(bytes.Buffer)
    Output(buf, "test")
    output := strings.Trim(string(buf.Bytes()), " \n\t ")
    if output != "test" {
        t.Error("unexpected value")
    }
}

Examples

標準出力の結果をテストする方法としてExamplesを使う方法もあります。

以下のサンプルコードをテストすることにします。

func Main() {
    fmt.Println("test")
}

書き方としては、Output: で始め、続いて標準出力と比較したい文字列を指定します(Output:先頭のスペースと末尾のスーペースは無視される)。

func ExampleOutput() {
    Main()
    // Output: test
}

Output:に指定する文字列をhogeに変更してテストをFAILさせてみます。
以下のように表示され、正しくFAILしていることがわかります。

--- FAIL: ExampleOutput (0.00s)
got:
test
want:
hoge
FAIL
FAIL    command-line-arguments  0.009s

詳しくは https://golang.org/pkg/testing/#hdr-Examples に書いてあります 。

おわりに

Go初心者です...
内容が被ってしまった...