mcpField
D
django-test-parallelization

django-test-parallelization

github.com/lvtd-llcテスト・品質160 回インストール7 週間前に更新
リポジトリ

django-test-parallelization について

Django のテストスイートを安全かつ効果的に並列実行するためのスキルです。実行時間の測定、テスト分離の確認、共有状態による失敗の診断を行ってから、ワーカー間の負荷を調整します。

主な機能

  1. 01逐次テスト時間の測定
  2. 02逆順・ランダム順での確認
  3. 03Django または pytest の実行設定
  4. 04順序依存・並列時の失敗分類
  5. 05共有リソースの安全な分割

活用シーン

  1. 01隠れたテスト順序依存の発見
  2. 02並列実行時だけ起きる失敗の診断
  3. 03分離確認後のテストスイート高速化

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/lvtd-llc/skills --skill django-test-parallelization

インストール後、Claude Code で/django-test-parallelizationを入力して読み込まれたか確認します。

同梱ファイルreferences/shared-resources.md

詳細

Django テストの並列化

テストスイートを分離した後は、並列実行によって処理速度を大幅に向上できます。並列実行での失敗は、原因が判明するまでは、隠れた共有状態がある証拠として扱ってください。

準備のワークフロー

  1. まず直列実行の所要時間を測定します。

    • すでに起動やデータベース作成が実行時間の大半を占めている場合、並列化だけでは十分な効果が得られない可能性があります。
  2. 並列化をデフォルトで有効にする前に、分離性を確認します。

    • 逆順で実行します。
    • 逆順で不十分な場合は、ランダムな順序で実行します。
    • 失敗を再現できるよう、ランダムシードを保持します。
  3. ランナーを意図的に有効にします。

    • Django ランナー:tblib をインストールしてから、python manage.py test --parallel を実行します。
    • pytest-django:pytest-xdist をインストールしてから、pytest -n auto を実行します。
  4. 失敗を分類します。

    • 実行順序に依存する失敗は、通常、変更されたグローバル変数、クラス属性、設定、キャッシュ、monkeypatch、またはデータベースに関する前提が原因です。
    • 並列実行時のみ発生する失敗は、通常、ファイル、キャッシュキー、ポート、キュー、外部サービス、一時ディレクトリなどの共有リソースが原因です。
  5. リソースをワーカー間で安全に使えるようにします。

    • プロセスまたはワーカーごとに分割する方法を優先します。
    • リソースを分割できない場合にのみ、ロックを使用します。
    • ロックの対象範囲は狭く保ちます。
  6. 正しく動作することを確認してから、作業量のバランスを調整します。

    • 測定によって、特定のグループが並列実行全体の足かせになっていると判明した場合にのみ、大きなテストクラスやモジュールを分割します。

コマンド

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 に直列実行へのフォールバックコマンドがある。

コメント