Отключить миграцию при выполнении модульных тестов в Django 1.7

Django 1.7 представил миграции данных.

При выполнении модульных тестов в Django 1.7 он перенаправляет миграцию, что занимает много времени. Поэтому я хотел бы пропустить миграцию django и создать базу данных в конечном состоянии.

Я знаю, что игнорирование миграции может быть плохой практикой, так как эта часть кода не будет проверена. Но это не так: я запускаю полные миграции на тестовом сервере CI (jenkins). Я только хочу пропустить миграции в моих локальных тестах, где скорость имеет значение.


В некотором контексте:

До Django 1.6 при использовании юга я использовал параметр SOUTH_TESTS_MIGRATE:

По умолчанию команда Souths syncdb также применяет миграцию, если ее запуск выполняется в неинтерактивном режиме, который включает в себя при выполнении тестов - он будет выполнять каждую миграцию каждый раз, когда вы запускаете свои тесты.

Если вы хотите, чтобы тестовый бегун использовал syncdb вместо переноса - например, если ваши миграции слишком долго применяются - просто установите SOUTH_TESTS_MIGRATE = False в settings.py.

Однако syncdb больше не существует, теперь он переносится.

И из Django 1.8 я буду использовать параметр --keepdb:

Параметр -keepdb может использоваться для сохранения тестовой базы данных между тестовыми запусками. Это имеет то преимущество, что пропускает действия create и destroy, что значительно сокращает время запуска тестов, особенно в большом наборе тестов. Если тестовая база данных не существует, она будет создана при первом запуске и затем сохраняется для каждого последующего запуска. Любые непримененные миграции также будут применены к тестовой базе данных перед запуском набора тестов.

Итак, этот вопрос ограничен Django 1.7.

Ответ 1

Посмотрите это обходное решение, отправленное Bernie Sumption в список рассылки разработчиков Django:

Если makemigrations еще не запущена, команда "migrate" обрабатывает приложение как немигрированное, и создает таблицы непосредственно из моделей только например, syncdb в 1.6. Я определил новый модуль настроек только для единицы тесты под названием "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": Нет}

Ответ 2

Вот конец моего файла настроек:

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()

на основе этого фрагмента

Я отключил миграцию только при запуске тестов

Ответ 4

Обновить. Ничего, это изменение вернулось до выхода 1.10 final. Надеюсь, он вернется в будущей версии.


Обратите внимание, что с Django 1.10 это можно контролировать с помощью тестовой базы данных.

MIGRATE

По умолчанию: True

Если установлено значение False, Django не будет использовать миграции для создания тестовой базы данных.

Ответ 6

Для django 1.9 и ответ Гийома Винсента больше не работает, поэтому здесь новое решение:

Я использую этот фрагмент в моем файле настроек после определения INSTALLED_APPS

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

Он выполняет итерацию по всем установленным приложениям и отмечает, что каждый из них не имеет модуля миграции. Дополнительную информацию см. В django docs.

Используя этот фрагмент, вы можете запустить свои тесты, установив переменную окружения TESTS_WITHOUT_MIGRATIONS, например:

TESTS_WITHOUT_MIGRATIONS=1 ./manage.py test

Ответ 7

Я просто выясню, как отключить миграцию после django 1.10, возможно, это может помочь кому-то. Вот ссылка в git

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

    def __getitem__(self, item):
        return None

DATABASES = DisableMigrations()

MIGRATION_MODULES = DisableMigrations()

Миграции для django 1.10 имеют две части, посмотрите load_disk и записывающее

Часть load_disk для модели миграции приложений, которая добавляется в INSTALL_APP И часть recorder для подключения к базе данных Для версии до 1.9 нам нужно установить MIGRATION_MODULES={'do.not.migrate':'notmigrations'} при запуске теста Теперь нам нужно установить его Нет как MIGRATION_MODULES={'do.not.migrate':None} Поэтому, если мы не хотим делать миграции для любого приложения, просто добавьте функцию dict и return None для getitem и выполните то же самое в DATABASES, это то, что вам нужно сделать

PS: Для команды вам нужно указать --setting=module.path.settings_test_snippet после test PPS. Если вы работаете с pycharm, не установите --settings параметры Run/Debug configurations, просто добавьте путь к settings_test_snippet.py в пользовательскую настройку. Это просто отлично!

пользоваться