概要
Goには標準でtestingというパッケージが用意されている。今回はこれを使用する。
テストコードの作成方法
テストコードを書くファイルは_test.go
という形式で命名する。
Goのテストはテスト対象のソースコードと同じパッケージに含める必要がある。
以下のような関数を作成することでテストコードを作成していく。
func Test対象関数名(*testing.T) {
hogehogehogehoge
}
実際のテストコード
decode()
という関数をテストしている。
func TestDecode(t *testing.T) {
post, err := decode("post.json")
if err != nil {
t.Error(err)
}
if post.Id != 1 {
t.Error("Wrong id, was expecting 1 but got", post.Id)
}
if post.Content != "Hello World!" {
t.Error("Wrong content, was expecting 'Hello World!' but got", post.Content)
}
}
ポイント
- 関数を実行し、エラーが返って来ていれば、エラー出力をしてあげる。
-
t.Error()
はLog()
を呼びだしてからFail()
を呼び出すメソッド。Log()
はエラーログにテキストを記録する。Fail()
はテスト関数に失敗した記録を残しつつ、テストは継続して実行する。
テストの実行
_test.go
ファイルがあるディレクトリへ移動して、以下のコマンドを実行
go test
オプション
詳細出力
-v
カバレッジ確認
-cover
テストのスキップ
特定のテストをスキップすることもできる。
あらかじめ、スキップしたいテストを以下のようにif文で囲んでおく。
if testing.Short() {
テストの内容
}
実行時に-short
オプションをつけて実行する
go test - short
テストの並列実行
テストを並列で実行することもできる。テスト時間の短縮に役立ちそう。
並行で実行できるようにしたいテストに以下のコードを追加する。テストケースの一番最初に一文加えるだけでいい。
t.Parallel()
実行時に-parallel
オプションをつける。-parallel
の後にスペース+数値
を追記すれば、最大でいくつのテストケースを並列実行させたいか?を指定できる。
go test -parallel 3
ベンチマークテスト
ベンチマークを測定するためのテストケースを作成することもできる。
ベンチマークテストは以下のように書く。
func Benchmark対象関数名(b *testing.B) {
for i := 0; i < b.N; i++ {
対象の関数
}
}
ポイント
- 引数に
*testing.B
を取る。 - ベンチマークを取りたいコードを
b.N
回繰り返してくれる。
ベンチマークテストの実行
実行時に-bench
オプションをつける。全てのベンチマークテストを実行する場合は.
を、そうでない場合は対象のファイルを指定する。
go test -bench .
-run
オプションをつけると、機能テスト(ベンチマークテストではないもの)を無視してテストを実行できる。-run
の後に実行したい機能テストを指定するとその機能テストだけは実行される。-run x
のように存在しない機能テスト名を指定すれば全ての機能テストはスキップされる。