django-test-parallelization について
Django のテストスイートを安全かつ効果的に並列実行するためのスキルです。実行時間の測定、テスト分離の確認、共有状態による失敗の診断を行ってから、ワーカー間の負荷を調整します。
主な機能
- 01逐次テスト時間の測定
- 02逆順・ランダム順での確認
- 03Django または pytest の実行設定
- 04順序依存・並列時の失敗分類
- 05共有リソースの安全な分割
活用シーン
- 01隠れたテスト順序依存の発見
- 02並列実行時だけ起きる失敗の診断
- 03分離確認後のテストスイート高速化
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill django-test-parallelizationインストール後、Claude Code で/django-test-parallelizationを入力して読み込まれたか確認します。
同梱ファイルreferences/shared-resources.md
詳細
Django テストの並列化
テストスイートを分離した後は、並列実行によって処理速度を大幅に向上できます。並列実行での失敗は、原因が判明するまでは、隠れた共有状態がある証拠として扱ってください。
準備のワークフロー
-
まず直列実行の所要時間を測定します。
- すでに起動やデータベース作成が実行時間の大半を占めている場合、並列化だけでは十分な効果が得られない可能性があります。
-
並列化をデフォルトで有効にする前に、分離性を確認します。
- 逆順で実行します。
- 逆順で不十分な場合は、ランダムな順序で実行します。
- 失敗を再現できるよう、ランダムシードを保持します。
-
ランナーを意図的に有効にします。
- Django ランナー:
tblibをインストールしてから、python manage.py test --parallelを実行します。 - pytest-django:
pytest-xdistをインストールしてから、pytest -n autoを実行します。
- Django ランナー:
-
失敗を分類します。
- 実行順序に依存する失敗は、通常、変更されたグローバル変数、クラス属性、設定、キャッシュ、monkeypatch、またはデータベースに関する前提が原因です。
- 並列実行時のみ発生する失敗は、通常、ファイル、キャッシュキー、ポート、キュー、外部サービス、一時ディレクトリなどの共有リソースが原因です。
-
リソースをワーカー間で安全に使えるようにします。
- プロセスまたはワーカーごとに分割する方法を優先します。
- リソースを分割できない場合にのみ、ロックを使用します。
- ロックの対象範囲は狭く保ちます。
-
正しく動作することを確認してから、作業量のバランスを調整します。
- 測定によって、特定のグループが並列実行全体の足かせになっていると判明した場合にのみ、大きなテストクラスやモジュールを分割します。
コマンド
python -m pip install tblib
python manage.py test --parallel
python manage.py test --parallel 1
python manage.py test --reverse
python -m pip install pytest-xdist
pytest -n auto
pytest -n auto --dist loadscope
共有リソースのパターンについては、shared-resources.md を参照してください。
判断基準
- 新しいプロジェクトでは早い段階で並列テストを追加します。古い直列テストスイートには、分離性に関する隠れた前提があることがよくあります。
- 実行順序への依存を低コストで防ぐため、CI で逆順テストを実行します。
- 逆順テストで疑わしい依存関係を検出できない場合は、ランダムな順序を使用し、シードを記録します。
TestCaseを多く含む Django のテストスイートでは、クラスやモジュールのセットアップにコストがかかることがあるため、pytest -n auto --dist loadscopeを優先します。- ロックを使う前に、リソースを分割します。
- プロセス固有の動作は、本番環境の設定ではなく、テスト設定だけに記述します。
- プロファイリングによって偏りが確認されてから、大きなテストグループを分割します。
よくある間違い
- データベーストランザクションの分離によって、キャッシュ、ファイル、タスクキュー、外部システムも保護されると思い込むこと。
- クラス属性、グローバル変数、アプリの設定、キャッシュエントリーを元に戻さずに変更すること。
- シードを保持せずにランダムな順序を有効にすること。
- 単一のロックファイルで多くの処理を保護し、誤ってテストスイートを直列化してしまうこと。
- pytest-xdist によって関連するテストを細かく分割しすぎ、セットアップコストが重複すること。
- 実行順序の分離チェックでテストスイートが安定して合格する前に、並列化をデフォルトにすること。
検証
並列化の完了と判断する前に、以下を確認します。
- 直列実行が成功する。
- 逆順またはランダムな順序での実行が成功するか、既知の失敗が修正されている。
- 並列実行が少なくとも 2 回成功する。
- 共有リソースの分割設定がテスト設定に含まれている。
- デバッグ用に、CI に直列実行へのフォールバックコマンドがある。
コメント
Markdown 対応