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

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

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

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

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

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


person Sam    schedule 05.05.2017    source источник
comment
Это возможно только для небольших веб-сайтов. Как вы думаете, сколько времени потребуется, чтобы просто настроить тест, если есть несколько ГБ данных   -  person e4c5    schedule 07.05.2017
comment
Я знаю! К счастью, мой сайт довольно маленький.   -  person Sam    schedule 08.05.2017


Ответы (2)


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

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

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

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

person e4c5    schedule 09.05.2017
comment
Спасибо за ответ, e4c5. По сути, я слышу, что мне нужно найти другой способ делать то, что я пытаюсь сделать. Я разместил здесь проблему как отдельный вопрос на случай, если у вас возникнут мысли: stackoverflow.com/questions/43876310/ - person Sam; 09.05.2017

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

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

person bouteillebleu    schedule 05.05.2017