Как выполнить тесты Django на копии моей производственной базы данных?


Я написал серию тестов для моего приложения Django и хотел бы запустить их на копии моей производственной базы данных.

Насколько я могу судить, лучший способ сделать это-использовать fixture loading примерно так:

  • беги manage.py dumpdata-o приложение.дамп
  • переместите полученное приложение.дамп файл в каталог светильников на [название приложения] папку
  • укажите атрибут класса 'fixtures' в моем django.тест.Подкласс TestCase

Однако этот подход является обременительный. У меня есть несколько приложений, и работает manage.py dumpdata для каждого из них и ручное перемещение файлов светильников каждый раз, когда я хочу протестировать свое приложение, - это боль.

Есть ли более простой способ автоматически создать копию всей моей производственной базы данных и протестировать Мои приложения Django против нее?

2 10

2 ответа:

Как правило, тестирование против живой БД или копии живой БД не рекомендуется. Почему? Потому что тесты должны быть предсказуемыми. Когда вы делаете копию живой БД, входные данные становятся непредсказуемыми. Вторая проблема заключается в том, что вы явно не можете тестировать на реальном сайте, поэтому вам нужно клонировать данные. Это слишком медленно для чего-либо большего, чем несколько МБ в размере.

Даже если БД мала, dumpdata, за которым следует loaddata - это не выход. Это потому, что dumpdata по умолчанию экспортируется в формате JSON, который имеет большие накладные расходы на генерацию, не говоря уже о том, что файл данных очень громоздкий. Импорт с помощью loaddata происходит еще медленнее.

Единственный реальный способ сделать клон-это использовать движки баз данных, встроенные в механизм экспорта / импорта. В случае sqlite это просто копирование файла БД. Для mysql это SELECT INTO OUTFILE, за которым следует LOAD DATA INFILE. И для PostgreSQL это скопировать, чтобы затем копировать и так далее.

Все эти команды экспорта / импорта могут быть выполнены с помощью низкоуровневый объект подключения доступен в django и, таким образом, может использоваться для загрузки светильников.

Вы не упомянули, какую версию Django вы используете, но смотрите документацию 1.11:

Это не ясно. из 1.11 docs о загрузке крепежа для тестов будут ли они также выглядеть в FIXTURE_DIRS, хотя. Так что это может не решить вашу проблему полностью.