Тест 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, чтобы указать на его псевдоним.