mcpField
D
django-test-performance

django-test-performance

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

django-test-performance について

django-test-performanceは、Djangoのテストスイートを高速化する開発者向けのオーケストレーションスキルです。基準時間を測って主なコストを特定し、テストの忠実性へのリスクを確認しながら、安全性を重視した最小限の改善を検証します。

主な機能

  1. 01再現可能な基準時間の測定
  2. 02主なテストコストの分類
  3. 03低リスクな設定やバックエンドの変更
  4. 04テストデータとDB構成の改善
  5. 05安全性確認後の並列実行
  6. 06再測定とリスクの報告

活用シーン

  1. 01ローカルのDjangoテスト実行の短縮
  2. 02初期化・マイグレーション・テストの時間比較
  3. 03DB再利用やマイグレーション手順の調整
  4. 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 テストスイートを高速化するためのオーケストレーションスキルとして使用してください。設定をむやみに変更することから始めず、まずテストスイートを計測してから、再現可能な検証コマンドを使って、最も安全で小規模な最適化を選んでください。

基本的なワークフロー

  1. ベースラインを確立します。

    • 開発者または CI が使用するのと同じコマンドを実行します。
    • 実行時間、ランナー、設定モジュール、データベースバックエンド、ワーカー数、ブランチを記録します。
    • 原因が明確でない場合は、動作を変更する前に django-test-profiling を使用します。
  2. 主なコスト要因を分類します。

    • 起動/インポート/テスト検出:収集範囲を絞り、コストの高いアプリ初期化を減らします。
    • データベース作成/マイグレーション:ローカルでデータベースを再利用する、マイグレーション履歴を統合する、またはデータベースのストレージを改善します。
    • テストごとのセットアップ:フィクスチャデータを減らし、ファクトリーを使い、setUpTestData を使用します。
    • 外部バックエンド:ファイルストレージ、キャッシュ、タスクキュー、計装をテスト用に安全なバックエンドに置き換えます。
    • 実行に時間がかかるテスト:分離を確認してから並列化します。
  3. まずリスクの低い効果から適用します。

    • 高速なパスワードハッシャー。
    • テストでは DEBUG = False にします。
    • シリアライズされたロールバックが不要なら、データベースのシリアライズを無効にします。
    • デバッグツールバー、Sentry/Rollbar/APM の初期化、その他の計装を無効にします。
    • ストレージ、キャッシュ、タスクキューにはインメモリまたはローカルのテスト用バックエンドを使用します。
    • speed-wins.md を参照してください。
  4. データと構成を改善します。

    • ファクトリー、フィクスチャ、setUpTestData、TestCase、統合テストと単体テストの選択には django-test-data を使用します。
  5. マイグレーションとデータベースのセットアップを改善します。

    • ローカルでテストを繰り返す場合は --keepdb または --reuse-db を使用します。
    • マイグレーション履歴が変更された場合は、データベースを強制的に再構築します。
    • マイグレーションを全体的に無効化するのではなく、マイグレーションの統合を優先します。
    • プロジェクトがデータベースに依存しない場合を除き、テスト用データベースのバックエンドは本番環境に近いものを維持します。
  6. 安全な場合に限り、並列化します。

    • テストの実行順序の分離、共有リソース、ワーカーの設定には django-test-parallelization を使用します。
  7. 元のベースラインと同じコマンドで再計測します。

    • 変更によるリスク範囲とともに、変更前後の実行時間を報告します。
    • 計測した効果と動作の忠実性に基づいて、最適化を維持するか元に戻します。

デフォルトのコマンド

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 での検証のために、プロジェクトで維持すべきコマンド。

コメント