115

Django 1.7では、データベースの移行が導入されました。

Django 1.7 で単体テストを実行すると、移行が強制され、時間がかかります。したがって、django の移行をスキップして、最終状態でデータベースを作成したいと思います。

コードのその部分がテストされないため、移行を無視することは悪い習慣になる可能性があることを私は知っています。しかし、そうではありません。CI テスト サーバー (jenkins) で完全な移行を実行しています。速度が重要なローカル テストでの移行をスキップしたいだけです。


いくつかのコンテキスト:

Django 1.6まで、South を使用する場合はSOUTH_TESTS_MIGRATE設定を使用しました。

デフォルトでは、South の syncdb コマンドは、非対話モードで実行されている場合にも移行を適用します。これには、テストの実行時も含まれます。テストを実行するたびに、すべての移行が実行されます。

テスト ランナーで移行の代わりに syncdb を使用する場合 (たとえば、移行の適用に時間がかかりすぎる場合) は、settings.py で SOUTH_TESTS_MIGRATE = False を設定するだけです。

ただし、syncdbはもう存在しません。現在はmigrateになっています。

Django 1.8からは--keepdbパラメータを使用します。

--keepdb オプションを使用して、テスト実行間でテスト データベースを保持できます。これには、作成アクションと破棄アクションの両方をスキップできるという利点があり、特に大規模なテスト スイートの場合、テストの実行時間が大幅に短縮されます。テスト データベースが存在しない場合は、最初の実行時に作成され、その後の実行ごとに保持されます。テスト スイートを実行する前に、未適用の移行もテスト データベースに適用されます。

したがって、この質問は Django 1.7 に限定されています。

4

7 に答える 7

82

Bernie Sumption が Django 開発者メーリング リストに投稿したこの回避策を見てください。

makemigrations がまだ実行されていない場合、「migrate」コマンドはアプリを未移行として扱い、1.6 で syncdb が行ったように、モデルから直接テーブルを作成します。「settings_test.py」という単体テスト専用の新しい設定モジュールを定義しました。これは、メイン設定モジュールから * をインポートし、次の行を追加します。

MIGRATION_MODULES = {"myapp": "myapp.migrations_not_used_in_tests"}

次に、次のようなテストを実行します。

DJANGO_SETTINGS_MODULE="myapp.settings_test" python manage.py テスト

この愚か者は、アプリが移行されていないと考えるようになり、テスト データベースが作成されるたびに、models.py の現在の構造が反映されます。

Django 1.9 では、この状況は多少改善さNoneれ、値を次のように設定できます。

MIGRATION_MODULES = {"myapp": なし}

于 2014-08-12T14:50:19.007 に答える