Отключить миграцию при выполнении модульных тестов в 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()
на основе этого фрагмента
Я отключил миграцию только при запуске тестов
Ответ 3
django-test-without-migrations добавляет флаг --nomigrations
к manage.py test
. Работает как шарм.
Ответ 4
Обновить. Ничего, это изменение вернулось до выхода 1.10 final. Надеюсь, он вернется в будущей версии.
Обратите внимание, что с Django 1.10 это можно контролировать с помощью тестовой базы данных.
MIGRATE
По умолчанию: True
Если установлено значение False
, Django не будет использовать миграции для создания тестовой базы данных.
Ответ 5
https://gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b
MIGRATION_MODULES = {
app[app.rfind('.') + 1:]: 'my_app.migrations_not_used_in_tests'
for app in INSTALLED_APPS
}
Ответ 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
в пользовательскую настройку. Это просто отлично!
пользоваться