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

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

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

  • Запустите файл manage.py dumpdata -o app.dump
  • Переместите полученный файл app.dump в каталог фикстур в папке [app name]
  • Укажите атрибут класса 'fixtures' в моем подклассе django.test.TestCase

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

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам