go testを並列で動かして速くする
·2 分で読めます
はじめに
アプリケーションが大きくなってくると、テストを並列で実行しないとどんどんgo testの実行時間が長くなってしまい、いわゆる「CI待ち」というものが発生してしまう。この記事は自分用のメモだが、テストを少しでも速くしたいという人のための記事。おそらく会社の誰かがもっと丁寧な説明のブログ記事を書いてくれるはず。
go testを速くする方法
方法としては以下がある。それぞれ細かく説明していく。
- go test実行時に
-pオプションを使う - Test関数に
t.Parallelを入れる
go testの実行方法
go testコマンドでは大きく分けて以下の2つを行っている。
- .go, _test.goをコンパイルしてバイナリを生成
- 生成したバイナリの実行(=テストの実行)
この時 go test ./... のように実行するとパッケージごとにバイナリを生成してテストを実行する。-pフラグはこのパッケージごとのコンパイルとテスト実行の並列数を設定するもので、デフォルトではGOMAXPROCSの数になっている。
t.Parallel
上では-pによってパッケージごとのテストの実行を並列にすることができると説明したが、同じパッケージ内のTest関数は直列で実行されている。これを並列で実行したい場合はどうするのかというと、(*T).Parallelを使えば良い。これを入れることで「そのTest関数は並列実行できる」ということを伝えられる。
まとめ
- パッケージごとのテストのコンパイルと実行を並列にしたい場合は
-pを指定する(デフォルトはGOMAXPROCS( - t.Parallel()の呼び出しがあると、そのTest関数は並列で実行される
関連記事
Go言語における並行処理 - ユースケース編
2019-11-16
Goにおける並行処理 - channel編
2019-09-10