https://qiita.com/taisa831/items/85fea8d970bcadd796b9

テックタッチアドベントカレンダー11日目を担当する @taisa831 です。10日目は @mxxxxkxxxx「Go言語 ElastiCacheの その前に」でした。575 の 5 が Go に掛かっていていい感じですね!もちろん内容も良い!

本記事では、Gotestingパッケージについて書きます。既存記事を調べてみると、そこそこあるけどそこまで多くはない。重厚な記事もあればあっさりした記事もある。ということで深すぎず浅すぎずを目指そうと思います。

「testing パッケージの基本を理解する」なのでGotesting パッケージ を参考にしました。テストに関しては最初アサーションがないことに戸惑いましたが、慣れたらない方がよく感じてきました。執筆時点でのバージョンはgo1.13.4です。

もっともシンプルなテスト

Goでテストを実行するにはいくつかルールがあります。

そして下記のように期待値と実行時の値が違う場合はt.Errorfでエラーを記録します(後述しますが必ずしもt.Errorfである必要はありません)。

func TestAbs(t *testing.T) {
    got := math.Abs(-1)
    if got != 1 {
        t.Errorf("Abs(-1) = %f; want 1", got)
    }
}

実行

go test -v
=== RUN   TestAbs
--- PASS: TestAbs (0.00s)
PASS
ok      command-line-arguments  0.005s

パッケージ/ファイル単位でテスト対象を指定する

パッケージ単位でテスト対象を指定するには以下のようにコマンドを使い分けます。

# カレントディレクトリ
$ go test

# カレント配下全て
$ go test ./...

# testing パッケージ配下
$ go test testing

# testing/quick パッケージ配下
$ go test testing/quick

# testing 配下全て
$ go test testing/...

# 同じパッケージがテストが対象の場合
$ go test testing_testing.go testing.go

# packgename_test のようにパッケージを分けている場合
$ go test testing_testing.go

testingパッケージを使ってBenchmarkを取ることもできます。Benchmarkを取るには*testing.Bを使い、-benchオプションを指定して実行します。