次のhello.goのHello()
関数のテストをする際、標準出力にHello World!
が出力されているかをテストする方法について記載します。下記はテスト対象のファイルです。
// hello.go
package main
import (
"fmt"
)
// この関数をテストする
func Hello() {
fmt.Println("Hello World!")
}
func main() {
Hello()
}
次はテストコードです。
下記のようにコードを書けば標準出力の内容をテストできます。
// hello_test.go
package main
import (
"bytes"
"fmt"
"io"
"os"
"strings"
"testing"
)
func TestHello(t *testing.T) {
t.Helper()
// 既存のStdoutを退避する
orgStdout := os.Stdout
// パイプを定義
pr, pw, _ := os.Pipe()
// Stdoutの出力先をパイプのwriterに変更する
os.Stdout = pw
// テスト対象の関数を実行
Hello()
// Writerをクローズする。Writerオブジェクトはクローズするまで処理をブロックするので注意
pw.Close()
// 出力先を元に戻す。※ Close()の後に書く
os.Stdout = orgStdout
// Bufferに書き込こまれた内容を読み出す
buf := bytes.Buffer{}
io.Copy(&buf, pr)
// buf.String()には改行コードが入っているので消す
output := strings.TrimRight(buf.String(), "\n")
// Hello()実行時のコメントの期待値を記載
expected := "Hello World!"
fmt.Printf("Output1: %v:%T\n", expected, expected)
fmt.Printf("Output2: %v:%T\n", output, output)
// 期待したメッセージが出力されていることを確認する
if output != expected {
t.Errorf("期待するメッセージと違います:%v", output)
}
}
結果
Output1: Hello World!:string
Output2: Hello World!:string
PASS
Process 94781 has exited with status 0