Тест Django для использования существующей базы данных
Мне сложно настраивать поведение установки тестовой базы данных. Я хотел бы сделать следующее:
- В тестовых наборах необходимо использовать существующую базу данных
- Набор тестов не должен удалять или воссоздавать базу данных, а не загружать данные из дампа mysql
- Поскольку db заполняется из дампа, никакие светильники не должны быть загружены
- После завершения тестов база данных не должна быть уничтожена.
Мне сложно заставить testuiterunner обходить создание.
Ответы
Ответ 1
Этот TEST_RUNNER работает в Django 1.3
from django.test.simple import DjangoTestSuiteRunner as TestRunner
class DjangoTestSuiteRunner(TestRunner):
def setup_databases(self, **kwargs):
pass
def teardown_databases(self, old_config, **kwargs):
pass
Ответ 2
Ускоренная перемотка вперед до 2016 года, и возможность сохранения базы данных между тестами была встроена в django. Он доступен в виде - сохранить флаг для manage.py
Новое в Django 1.8. Сохраняет тестовую базу данных между тестовыми запусками. Эта имеет преимущество пропускать как действия создания, так и уничтожения что может значительно сократить время проведения тестов, особенно в большой набор тестов. Если тестовая база данных не существует, она будет созданные при первом запуске, а затем сохраняются для каждого последующего запуска. Любые непримененные миграции также будут применены к тестовой базе данных перед запуском набора тестов.
Это в значительной степени заполняет все критерии, которые вы упомянули в своих вопросах. На самом деле это еще один шаг вперед. Нет необходимости импортировать дамп перед каждым запуском.
Ответ 3
Вам нужно предоставить собственный тестовый бегун.
Биты, которые вы заинтересованы в переопределении по умолчанию django.test.runner.DiscoverRunner
, - это методы DiscoverRunner.setup_databases
и DiscoverRunner.teardown_databases
. Эти два метода связаны с созданием и уничтожением тестовых баз данных и выполняются только один раз. Вы хотите предоставить параметры проекта, специфичные для теста, которые используют существующую тестовую базу данных по умолчанию и переопределяют их, чтобы данные дампа загружались и тестовая база данных не была уничтожена.
В зависимости от размера и содержимого дампа безопасной ставкой может быть просто создание подпроцесса, который будет передавать дамп в интерфейс командной строки SQL базы данных, иначе вы могли бы получить курсор и выполнить запросы напрямую.
Если вы хотите полностью избавиться от полной загрузки прибора, вы можете предоставить настраиваемый базовый тестовый пример, который расширяет Django по умолчанию django.test.testcases.TestCase
с помощью TestCase._fixutre_setup
и TestCase._fixutre_teardown
переопределяют методы noop.
Caveat emptor: этот бегун сделает невозможным облегчение тестов для чего угодно, кроме ваших источников приложений. Можно настроить бегун для создания конкретного псевдонима для подключения к вашей существующей базе данных и загрузки дампа, а затем предоставить собственный тестовый пример, который переопределяет TestCase._database_names
, чтобы указать на его псевдоним.