web-dev-qa-db-ja.com

Django 1.7で単体テストを実行するときに移行を無効にする

Django1.7導入 データベース移行 .

Django 1.7でユニットテストを実行すると、migrateが強制されます。これには長い時間がかかります。そこで、Djangoの移行をスキップし、最終状態でデータベースを作成したいと思います。

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


コンテキスト:

Django1.6までは、Southを使用するときに SOUTH_TESTS_MIGRATE 設定:

デフォルトでは、Southのsyncdbコマンドは、テストを実行しているときなど、非インタラクティブモードで実行されている場合も移行を適用します。テストを実行するたびにすべての移行が実行されます。

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

ただし、syncdbはもう存在せず、現在はmigrateです。

Django1.8から-keepdb を使用しますパラメーター:

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

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

105
David Arcos

この回避策 をご覧ください。BernieSumptionが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 test

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

Django= 1.9、この状況 多少改善されています で、値をNoneに設定できます:

MIGRATION_MODULES = {"myapp":なし}

77
albertgasset

これが私の設定ファイルの終わりです:

class DisableMigrations(object):

    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        return None


TESTS_IN_PROGRESS = False
if 'test' in sys.argv[1:] or 'jenkins' in sys.argv[1:]:
    logging.disable(logging.CRITICAL)
    PASSWORD_HASHERS = (
        'Django.contrib.auth.hashers.MD5PasswordHasher',
    )
    DEBUG = False
    TEMPLATE_DEBUG = False
    TESTS_IN_PROGRESS = True
    MIGRATION_MODULES = DisableMigrations()

これに基づいて スニペット

テストの実行中にのみ移行を無効にしました

68

Django-test-without-migrations は、--nomigrationsフラグをmanage.py testに追加します。魅力のように機能します。

28
rlmv

Update:気にせず、この変更は reverted 1.10 finalがリリースされる前でした。うまくいけば、将来のバージョンで返ってくるでしょう。


Django 1.10以降、これはテストデータベースの設定によって制御できることに注意してください。

移行

デフォルト:True

Falseに設定すると、Djangoはテストデータベースの作成に移行を使用しません。

https://Gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b

MIGRATION_MODULES = {
    app[app.rfind('.') + 1:]: 'my_app.migrations_not_used_in_tests'
    for app in INSTALLED_APPS
}
2
apollov

Django 1.9以上の場合、Guillaume Vincentの回答は機能しません。そこで、新しいソリューションを示します。

INSTALLED_APPSの定義の後、設定ファイルでこのスニペットを使用しています

if os.environ.get('TESTS_WITHOUT_MIGRATIONS', False):
    MIGRATION_MODULES = {
        app.split('.')[-1]: None for app in INSTALLED_APPS
    }

インストールされているすべてのアプリを反復処理し、それぞれに移行モジュールがないとマークします。 詳細についてはDjangoのドキュメント を参照してください。

このスニペットを使用すると、環境変数TESTS_WITHOUT_MIGRATIONSを設定してテストを実行できます。例:

TESTS_WITHOUT_MIGRATIONS=1 ./manage.py test
1
devsnd

Django 1.10の後に移行を無効にする方法を見つけました。誰かに役立つかもしれません。ここに link at git

_class DisableMigrations(dict):
    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        return None

DATABASES = DisableMigrations()

MIGRATION_MODULES = DisableMigrations()
_

Django 1.10の移行には2つの部分があります。 load_disk および recorder をご覧ください。

_load_disk_で追加されるアプリの移行モデルの_INSTALL_APP_の部分とデータベース接続のrecorderの部分1.9より前のバージョンでは、_MIGRATION_MODULES={'do.not.migrate':'notmigrations'}_を設定する必要がありますテストの実行ここで、_MIGRATION_MODULES={'do.not.migrate':None}_のようにNoneに設定する必要があります。したがって、アプリケーションの移行を行わない場合は、dictを拡張し、None for getitem functionを返し、 DATABASES、それはあなたがする必要がある正しいことです

PS:コマンドの場合、testの後に_--setting=module.path.settings_test_snippet_を指定する必要があります[〜# 〜] pps [〜#〜]pycharmを使用している場合、do notset _--settings_オプションは_Run/Debug configurations_で、カスタム設定で_settings_test_snippet.py_のパスを追加するだけです。それは大丈夫です!!

楽しい

0
FavorMylikes