ブログ・ア・ラ・クレーム

技術的なメモとかライフログとか。

Django のプロジェクトのテストを並列実行してとりあえず2倍高速にした

結果

Django のプロジェクトのテスト実行時間が、 GitHub Actions 上で 10min 超えになっていてつらみが出てきていた。

のを、 manage.py test--parallel オプションを活用することで実行時間を約半分に短縮できた。

やったこと

Django のプロジェクトでおそらくよくお世話になるだろう manage.py test には --parallel オプションがある。 読んで字の如くであるが、このオプションを渡すだけで実行環境のコア数分並列実行をしてくれて便利。

docs.djangoproject.com

Django のテストにおいてはデータベースにべったり依存したテストコードを書くことも多いと思うが、このオプションを渡すと起動時にワーカ分のテストデータベースを自動でいい感じに作ってくれるので、 並列実行におけるデータベース周りへのケアをあまり気にしなくて良くなる。

...
Creating test database for alias 'default'...
Cloning test database for alias 'default'...
Cloning test database for alias 'default'...
Cloning test database for alias 'default'...
Cloning test database for alias 'default'...
...

自前で並列実行されることを想定されていない共用されると破綻するリソースがあるときは別途対策を入れる。 自分が今回扱ったプロジェクトにおいては、「一時ディレクトリ」「Elasticsearch のインデックス」があった。 この例においてはとりあえず共用リソース名の末尾に f"-{os.getpid()}" を付与してワーカ毎に異なる名前付けを行うことで回避するようにした。

その他、 --parallel オプションを使用する上で tblib などパッケージをインストールすることを求められるケースがある。

これらの工夫で、冒頭のように一定(自分の事例では 2 倍)高速になるなら儲け物ではないだろうか。