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オプションを指定して実行します。