1. ホーム
  2. django

[解決済み] Django 1.7でユニットテストを実行する際にmigrationsを無効にする

2022-09-07 14:06:54

質問

Django 1.7 導入 データベースマイグレーション .

Django 1.7 でユニットテストを実行するとき、強制的に マイグレート を強制され、それには長い時間がかかります。ですから、私は django のマイグレーションをスキップし、最終的な状態でデータベースを作成したいと思います。

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


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

Django まで 1.6 を使用する場合、South を使用する場合、私は south_tests_migrate という設定にします。

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

もしテストランナーが migrate の代わりに syncdb を使うようにしたい場合 - 例えば、マイグレーションの適用に時間がかかりすぎる場合 - settings.py で SOUTH_TESTS_MIGRATE = False に設定するだけです。

しかし syncdb はもう存在せず、今は マイグレート .

そして Django からは 1.8 を使うことにします。 --keepdb パラメータを使用します。

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

ということで、この質問は Django 1.7 に限定されます。

どのように解決するのですか?

次のサイトをご覧ください。 この回避策 Bernie Sumption が Django の開発者メーリングリストに投稿したものです。

makemigrations がまだ実行されていない場合、 "migrate" コマンドはアプリを未移行として扱い、モデルから直接テーブルを作成します。 コマンドはアプリを移行されていないものとして扱い、1.6 で syncdb が行ったようにモデルから直接テーブルを作成します。 syncdb が 1.6 で行ったように、モデルから直接テーブルを作成します。私はユニットテストのために新しいSettingsモジュールを定義しました。 というユニットテストのための新しい設定モジュールを定義しました。 をインポートし、以下の行を追加しています。

MIGRATION_MODULES = {"myapp": "myapp.migrations_not_used_in_tests"} といった行を追加します。

そして、このようにテストを実行します。

DJANGO_SETTINGS_MODULE="myapp.settings_test" python manage.py test

これは、アプリが移行されていないと migrate に思わせるためです。 テストデータベースが作成されるたびに、現在の の構造を反映します。

Django 1.9 では、このような状況は は多少改善されています に設定することができます。 None :

MIGRATION_MODULES = {"myapp": なし}