django-test-data について
django-test-dataは、テストデータの準備やデータベース処理のコストを抑えつつ、必要な統合テストを維持するためのDjango開発者向けスキルです。テスト境界や基底クラス、データ作成、検証の選び方を扱います。
主な機能
- 01最小限のテスト境界を選択
- 02DB要件に応じたテストクラス選択
- 03広範なフィクスチャを必要なデータに置換
- 04ファクトリーとsetUpTestDataの活用
- 05準備クエリの削減とクエリ数の確認
活用シーン
- 01遅いDjangoテストスイートのリファクタリング
- 02DB利用テストと非利用テストの分割
- 03複数のテストメソッド間で高コストデータを共有
- 04ホットパスのクエリ性能確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill django-test-dataインストール後、Claude Code で/django-test-dataを入力して読み込まれたか確認します。
同梱ファイルreferences/patterns.md
詳細
Django テストデータ
低速な Django テストスイートの多くは、不要なデータの構築や、より小さな境界でテストできる動作に対してリクエストやデータベースの経路全体を実行することに時間を費やしています。このスキルを使って、代表的な統合テストを維持しながらセットアップコストを削減します。
リファクタリングのワークフロー
-
テスト対象の動作を把握します。
- 最小限で有用な境界を特定します。関数、フォーム、モデルメソッド、ミドルウェア、コマンドヘルパー、ビュー、またはリクエスト経路全体が該当します。
- 配線を検証する統合テストをいくつか残し、境界が明確な詳細なケースはユニットテストに移します。
-
最も高速なテストの基底クラスを選びます。
SimpleTestCase:データベースアクセスはありません。TestCase:ロールバックを伴う通常のデータベーステストです。TransactionTestCase:コミット済みトランザクションの動作のみを対象とします。LiveServerTestCase:ブラウザー/ライブサーバーのテストのみを対象とします。
-
広範なフィクスチャデータを取り除きます。
- 大きなフィクスチャファイルや、常にオブジェクトを作成する基底クラスは避けます。
- 各テストまたはクラスに必要なデータだけを構築します。
-
ファクトリーを意図的に使います。
- ドメインがシンプルな場合は、小さなファクトリー関数から始めます。
- リレーションシップやバリエーションが繰り返し登場するようになったら、Factory Boy または Model Bakery を使います。
-
クラスレベルのデータを
setUpTestDataで共有します。TestCaseの複数のメソッドで再利用するデータベースオブジェクトには、setUpTestData()を使います。- メソッド間で共有されるインメモリオブジェクトの変更は避けます。
-
テストのセットアップとアサーションにおけるデータベースアクセスを最適化します。
- セットアップ/クエリのコストがボトルネックの場合は、
select_related、prefetch_related、またはbulk_createを使います。 - パフォーマンスが契約の一部であるホットパスでは、クエリ数をアサートします。
- セットアップ/クエリのコストがボトルネックの場合は、
例と判断の詳細については、patterns.md をお読みください。
判断基準
- データベースが不要なテストには、
SimpleTestCaseを使います。 - データベースが必要なテストが一部だけの場合は、クラスを分けます。
- コミット済みトランザクションの動作が必要なテストでは、まず
captureOnCommitCallbacks()または内側のatomic()で十分か確認します。 - 高コストなオブジェクトを多くのテストで共有する場合は、
setUpではなくsetUpTestDataを使います。 - フィクスチャファイルが理解しにくい、または時間とともに肥大化する場合は、ファクトリーに置き換えます。
- ハードコードされた自動インクリメント ID に依存するテストでは、
reset_sequences=Trueを有効にするのではなく、アサーションを修正します。 - 1つの高コストな処理から生じる1つの動作を記述する場合は、アサーションをまとめます。
よくある間違い
- フォームのエラーを直接調べず、レンダリングされた HTML だけでフォームのバリデーションをテストする。
- 管理コマンドのビジネスロジックを
handle()の中に残し、call_command()経由でのテストを強いる。 TransactionTestCaseをデフォルトとして使う。- 一部のサブクラスしか必要としないデータを基底の
TestCaseに置く。 - ファクトリーを使えば、すべてのテストで大規模なオブジェクトグラフを作成してよいと考える。
setUpTestDataで作成したオブジェクトを変更し、後続のテストにインメモリ状態を漏らす。
検証
リファクタリングを終える前に、以下を確認します。
- 以前の動作が適切なレベルで引き続きテストされている。
- 有用な場合は、データベースを使うテストと使わないテストが分けられている。
- 繰り返し行うセットアップは、コスト削減につながる場合に限り
setUpTestDataまたはファクトリーに移されている。 - 関連するテストが個別に、またモジュール/クラスの一部として実行した場合にも合格する。
コメント
Markdown 対応