Отключить переносы при выполнении модульных тестов в Django 1.7
Джанго 1.7 ввел миграция базы данных.
при запуске модульных тестов в Django 1.7 он заставляет a migrate, это занимает много времени. Поэтому я хотел бы пропустить миграции django и создать базу данных в конечном состоянии.
Я знаю, что игнорирование миграции может быть плохой практикой, так как эта часть кода не будет проверена. Но это не так: я запускаю полные миграции в тесте CI сервер (Дженкинс). Я только хочу пропустить миграции в моих локальных тестах, где скорость имеет значение.
контекст:
Пока Джанго 1.6, при использовании Юг, я использовал SOUTH_TESTS_MIGRATE установка:
, syncdb больше не существует, теперь это migrate.по умолчанию команда syncdb South также будет применять миграции, если она выполняется в неинтерактивном режиме, который включает в себя, когда вы запускаете тесты - он будет запускать каждую миграцию каждый раз, когда вы запускаете ваш тест.
Если вы хотите, чтобы тестовый запуск использовал syncdb вместо миграции - например, если ваши миграции занимают слишком много времени для применения - просто установите SOUTH_TESTS_MIGRATE = False in settings.py.
и с Django 1.8 Я буду использовать --keepdb:
в --keepdb опция может использоваться для сохранения тестовой базы данных между тестовыми запусками. Это имеет то преимущество, что вы пропускаете действия create и destroy, что значительно сокращает время выполнения тестов, особенно в большом наборе тестов. Если тестовая база данных не существует, она будет создана при первом запуске, а затем сохранена для каждого последующего запуска. Любые неприменимые миграции также будут применены к тестовой базе данных перед запуском комплекта тестов.
таким образом, этот вопрос ограничивается Джанго 1.7.
7 ответов:
посмотреть этот способ, опубликовано 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": None}
вот конец моего файла настроек:
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()
исходя из этого фрагмент
Я отключил миграцию только при выполнении тестов
django-test-without-migrations добавляет a
--nomigrations
флагmanage.py test
. Работает как шарм.
обновление: ничего, это изменение было вернулся до 1.10 финал был освобожден. Надеюсь, он вернется в будущей версии.
обратите внимание, что с Django 1.10 это можно контролировать с помощью настройки тестовой базы данных.
MIGRATE
по умолчанию:
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 }
для 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
я просто выяснить,как отключить миграцию после 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 и вернитеNone
наgetitem
функция, и сделать то же самое вDATABASES
, это то, что вам нужно сделатьPS: для команды необходимо указать
--setting=module.path.settings_test_snippet
послеtest
PPS если вы работаете сpycharm
,не set--settings
вариантыRun/Debug configurations
, просто добавьте путьsettings_test_snippet.py
пользовательские настройки. Это просто прекрасно!!наслаждайтесь