https://qiita.com/taisa831/items/85fea8d970bcadd796b9
テックタッチアドベントカレンダー11日目を担当する @taisa831 です。10日目は @mxxxxkxxxx の「Go言語 ElastiCacheの その前に」でした。575 の 5 が Go に掛かっていていい感じですね!もちろん内容も良い!
本記事では、Go
のtesting
パッケージについて書きます。既存記事を調べてみると、そこそこあるけどそこまで多くはない。重厚な記事もあればあっさりした記事もある。ということで深すぎず浅すぎずを目指そうと思います。
「testing パッケージの基本を理解する」なのでGo
の testing パッケージ を参考にしました。テストに関しては最初アサーションがないことに戸惑いましたが、慣れたらない方がよく感じてきました。執筆時点でのバージョンはgo1.13.4
です。
Go
でテストを実行するにはいくつかルールがあります。
*_test.go
とするTestCamelCase
のようにTest
ではじめ後ろはCamelCase
とするtesting
パッケージを引数で受けるpackagename_test
とすることも可能)そして下記のように期待値と実行時の値が違う場合はt.Errorf
でエラーを記録します(後述しますが必ずしもt.Errorf
である必要はありません)。
func TestAbs(t *testing.T) {
got := math.Abs(-1)
if got != 1 {
t.Errorf("Abs(-1) = %f; want 1", got)
}
}
v
オプションをつけることでより詳細な情報が見られます。実行
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
オプションを指定して実行します。