2022.05.12  

【Go】 標準出力される文字列をテストをする

Go    

次の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
コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信