🌊
Goの単体テスト並列実行する
VSCodeやGoLandではテーブルドリブンな単体テストを自動生成してくれます。
このときt.Run()を使用したテストテンプレートを生成します。
ちなみにt.Run()だけだと平行ではなく逐次実行されます。(t.Runの引数で渡した関数が完了するまでブロックする)
Run は、t の name というサブテストとして f を実行します。fを別のゴルーチンで実行し、fが戻るか、t.Parallelを呼び出して並列テストになるまでブロックします。
func TestTRun(t *testing.T) {
for i := 0; i < 10; i++ {
name := fmt.Sprintf("test number = %d", i)
t.Run(name, func(t *testing.T) {
fmt.Println(name)
})
}
t.Error()
}
test number = 0
test number = 1
test number = 2
test number = 3
test number = 4
--- FAIL: TestTRun (0.00s)
/home/tminamiii/ghq/github.com/tMinamiii/sandbox-go/sgomock/calculator_test.go:17:
FAIL
FAIL github.com/tMinamiii/sandbox-go/sgomock 0.002s
FAIL
tRun()内の関数にt.Parallel()と書き込むと平行実行にかわります。
各テストケースが、共通のリソースを参照したりしておらず、完全に独立しているのであれば、t.Parallel()と書くだけでテスト時間を短縮できそうです。
func TestTRun(t *testing.T) {
for i := 0; i < 10; i++ {
name := fmt.Sprintf("test number = %d", i)
t.Run(name, func(t *testing.T) {
t.Parallel()
fmt.Println(name)
})
}
t.Error()
}
test number = 0
test number = 2
test number = 1
test number = 3
test number = 4
--- FAIL: TestTRun (0.00s)
/home/tminamiii/ghq/github.com/tMinamiii/sandbox-go/sgomock/calculator_test.go:18:
FAIL
FAIL github.com/tMinamiii/sandbox-go/sgomock 0.001s
FAIL
Discussion