django-test-performance について
django-test-performanceは、Djangoのテストスイートを高速化する開発者向けのオーケストレーションスキルです。基準時間を測って主なコストを特定し、テストの忠実性へのリスクを確認しながら、安全性を重視した最小限の改善を検証します。
主な機能
- 01再現可能な基準時間の測定
- 02主なテストコストの分類
- 03低リスクな設定やバックエンドの変更
- 04テストデータとDB構成の改善
- 05安全性確認後の並列実行
- 06再測定とリスクの報告
活用シーン
- 01ローカルのDjangoテスト実行の短縮
- 02初期化・マイグレーション・テストの時間比較
- 03DB再利用やマイグレーション手順の調整
- 04テスト並列実行の効果確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill django-test-performanceインストール後、Claude Code で/django-test-performanceを入力して読み込まれたか確認します。
同梱ファイルreferences/speed-wins.md
詳細
Django テストのパフォーマンス
Django テストスイートを高速化するためのオーケストレーションスキルとして使用してください。設定をむやみに変更することから始めず、まずテストスイートを計測してから、再現可能な検証コマンドを使って、最も安全で小規模な最適化を選んでください。
基本的なワークフロー
-
ベースラインを確立します。
- 開発者または CI が使用するのと同じコマンドを実行します。
- 実行時間、ランナー、設定モジュール、データベースバックエンド、ワーカー数、ブランチを記録します。
- 原因が明確でない場合は、動作を変更する前に
django-test-profilingを使用します。
-
主なコスト要因を分類します。
- 起動/インポート/テスト検出:収集範囲を絞り、コストの高いアプリ初期化を減らします。
- データベース作成/マイグレーション:ローカルでデータベースを再利用する、マイグレーション履歴を統合する、またはデータベースのストレージを改善します。
- テストごとのセットアップ:フィクスチャデータを減らし、ファクトリーを使い、
setUpTestDataを使用します。 - 外部バックエンド:ファイルストレージ、キャッシュ、タスクキュー、計装をテスト用に安全なバックエンドに置き換えます。
- 実行に時間がかかるテスト:分離を確認してから並列化します。
-
まずリスクの低い効果から適用します。
- 高速なパスワードハッシャー。
- テストでは
DEBUG = Falseにします。 - シリアライズされたロールバックが不要なら、データベースのシリアライズを無効にします。
- デバッグツールバー、Sentry/Rollbar/APM の初期化、その他の計装を無効にします。
- ストレージ、キャッシュ、タスクキューにはインメモリまたはローカルのテスト用バックエンドを使用します。
- speed-wins.md を参照してください。
-
データと構成を改善します。
- ファクトリー、フィクスチャ、
setUpTestData、TestCase、統合テストと単体テストの選択にはdjango-test-dataを使用します。
- ファクトリー、フィクスチャ、
-
マイグレーションとデータベースのセットアップを改善します。
- ローカルでテストを繰り返す場合は
--keepdbまたは--reuse-dbを使用します。 - マイグレーション履歴が変更された場合は、データベースを強制的に再構築します。
- マイグレーションを全体的に無効化するのではなく、マイグレーションの統合を優先します。
- プロジェクトがデータベースに依存しない場合を除き、テスト用データベースのバックエンドは本番環境に近いものを維持します。
- ローカルでテストを繰り返す場合は
-
安全な場合に限り、並列化します。
- テストの実行順序の分離、共有リソース、ワーカーの設定には
django-test-parallelizationを使用します。
- テストの実行順序の分離、共有リソース、ワーカーの設定には
-
元のベースラインと同じコマンドで再計測します。
- 変更によるリスク範囲とともに、変更前後の実行時間を報告します。
- 計測した効果と動作の忠実性に基づいて、最適化を維持するか元に戻します。
デフォルトのコマンド
time python manage.py test
python manage.py test --timing
python manage.py test --keepdb
time pytest
pytest --durations 20
pytest --reuse-db
pytest --create-db
判断のルール
- ボトルネックを特定できない場合は、まずプロファイリングします。
- 設定によって本番環境に近い動作が変わる場合は、上書きの範囲を狭くし、テストの代表性が保たれる理由を記載します。
- アプリケーションコードで広範な
TESTING = True分岐を避け、明示的な設定とテストヘルパーを使用します。 - 本番環境が SQLite の場合、またはプロジェクトが意図的に複数のバックエンドをサポートしている場合を除き、速度だけを理由に PostgreSQL/MySQL/MariaDB のプロジェクトを SQLite に切り替えないでください。
- 通常の手段としてマイグレーションを無効にしないでください。レガシープロジェクトでどうしても必要な場合は、CI で実際のマイグレーションを実行します。
- ローカルでの速度向上のための回避策によって、CI のカバレッジが隠れないようにします。CI では、時間のかかるテストと、実際のマイグレーションに即した経路をどこかで実行してください。
引き継ぎ先の一覧
| 状況 | 使用するもの |
|---|---|
| 実行時間、遅いテストの一覧、フレームグラフ、または cProfile の出力が必要 | django-test-profiling |
--parallel や pytest-xdist の有効化、またはランダムな失敗のデバッグ | django-test-parallelization |
フィクスチャの肥大化、ファクトリー、setUpTestData、TestCase クラスの選択 | django-test-data |
| 設定、HTTP、時刻、出力、コマンド入力を安全にモック | django-targeted-mocking |
| CI キャッシュ、ジョブ分割、低速テストのマーカー、ランナーの規模 | django-ci-test-optimization |
検証
完了する前に、以下を提示してください。
- 同じコマンドで計測したベースラインと最終的な実行時間。
- 実施または推奨した変更の優先順位付きリスト。
- テスト専用の各上書きによって生じるリスク。
- ローカルおよび CI での検証のために、プロジェクトで維持すべきコマンド。
コメント
Markdown 対応