🌊

Goの単体テスト並列実行する

2021/09/05に公開

VSCodeやGoLandではテーブルドリブンな単体テストを自動生成してくれます。
このときt.Run()を使用したテストテンプレートを生成します。
ちなみにt.Run()だけだと平行ではなく逐次実行されます。(t.Runの引数で渡した関数が完了するまでブロックする)

https://pkg.go.dev/testing#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