Как выполнить тесты Django на копии моей производственной базы данных?
Я написал серию тестов для моего приложения Django и хотел бы запустить их на копии моей производственной базы данных.
Насколько я могу судить, лучший способ сделать это-использовать fixture loading примерно так:
- беги manage.py dumpdata-o приложение.дамп
- переместите полученное приложение.дамп файл в каталог светильников на [название приложения] папку
- укажите атрибут класса 'fixtures' в моем django.тест.Подкласс TestCase
Однако этот подход является обременительный. У меня есть несколько приложений, и работает manage.py dumpdata для каждого из них и ручное перемещение файлов светильников каждый раз, когда я хочу протестировать свое приложение, - это боль.
Есть ли более простой способ автоматически создать копию всей моей производственной базы данных и протестировать Мои приложения Django против нее?
2 ответа:
Как правило, тестирование против живой БД или копии живой БД не рекомендуется. Почему? Потому что тесты должны быть предсказуемыми. Когда вы делаете копию живой БД, входные данные становятся непредсказуемыми. Вторая проблема заключается в том, что вы явно не можете тестировать на реальном сайте, поэтому вам нужно клонировать данные. Это слишком медленно для чего-либо большего, чем несколько МБ в размере.
Даже если БД мала,
dumpdata
, за которым следуетloaddata
- это не выход. Это потому, что dumpdata по умолчанию экспортируется в формате JSON, который имеет большие накладные расходы на генерацию, не говоря уже о том, что файл данных очень громоздкий. Импорт с помощью loaddata происходит еще медленнее.Единственный реальный способ сделать клон-это использовать движки баз данных, встроенные в механизм экспорта / импорта. В случае sqlite это просто копирование файла БД. Для mysql это SELECT INTO OUTFILE, за которым следует LOAD DATA INFILE. И для PostgreSQL это скопировать, чтобы затем копировать и так далее.
Все эти команды экспорта / импорта могут быть выполнены с помощью низкоуровневый объект подключения доступен в django и, таким образом, может использоваться для загрузки светильников.
Вы не упомянули, какую версию Django вы используете, но смотрите документацию 1.11:
- dumpdata может сбрасывать данные для всех приложений из определенной базы данных , а не делать их по отдельности.
- Loaddata может загружать данные для нескольких приложений , а также искать в отдельных каталогах приложений подкаталоги
fixtures
, он также может искать в каталогах, определенных в FIXTURE_DIRS.Это не ясно. из 1.11 docs о загрузке крепежа для тестов будут ли они также выглядеть в FIXTURE_DIRS, хотя. Так что это может не решить вашу проблему полностью.