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


Джанго 1.7 ввел миграция базы данных.

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

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


контекст:

Пока Джанго 1.6, при использовании Юг, я использовал SOUTH_TESTS_MIGRATE установка:

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

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

, syncdb больше не существует, теперь это migrate.

и с Django 1.8 Я буду использовать --keepdb:

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

таким образом, этот вопрос ограничивается Джанго 1.7.

7 101

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 пользовательские настройки. Это просто прекрасно!!

наслаждайтесь