oinume journal

Scratchpad of what I learned

go testを並列で動かして速くする

はじめに

アプリケーションが大きくなってくると、テストを並列で実行しないとどんどんgo testの実行時間が長くなってしまい、いわゆる「CI待ち」というものが発生してしまう。この記事は自分用のメモだが、テストを少しでも速くしたいという人のための記事。おそらく会社の誰かがもっと丁寧な説明のブログ記事を書いてくれるはず。

go testを速くする方法

方法としては以下がある。それぞれ細かく説明していく。

  • go test実行時に-pオプションを使う
  • Test関数にt.Parallelを入れる

go testの実行方法

go testコマンドでは大きく分けて以下の2つを行っている。

  1. .go, _test.goをコンパイルしてバイナリを生成
  2. 生成したバイナリの実行(=テストの実行)

この時 go test ./... のように実行するとパッケージごとにバイナリを生成してテストを実行する。-pフラグはこのパッケージごとのコンパイルとテスト実行の並列数を設定するもので、デフォルトではGOMAXPROCSの数になっている。

t.Parallel

上では-pによってパッケージごとのテストの実行を並列にすることができると説明したが、同じパッケージ内のTest関数は直列で実行されている。これを並列で実行したい場合はどうするのかというと、(*T).Parallelを使えば良い。これを入れることで「そのTest関数は並列実行できる」ということを伝えられる。

まとめ

  • パッケージごとのテストのコンパイルと実行を並列にしたい場合は-pを指定する(デフォルトはGOMAXPROCS(
  • t.Parallel()の呼び出しがあると、そのTest関数は並列で実行される