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

Теперь я делаю модульные тесты для уже существующего кода. Я столкнулся со следующей проблемой:

После запуска syncdb для создания тестовой базы данных Django автоматически заполняет несколько таблиц, таких как django_content_type или auth_permissions.

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

Если я попытаюсь использовать всю свою существующую базу данных для создания светильников (это было бы довольно удобно для меня) - я получу ошибку, например здесь. Это происходит потому, что Django уже заполнил таблицы типа django_content_type.

Следующим возможным способом является использование опции django dumpdata --exclude для уже заполненных таблиц syncdb. Но это тоже не очень хорошо, потому что, если я беру объекты User и User Group из таблицы db и User Permissions, которая была автоматически создана syncdb, я могу получать ошибки, потому что первичные ключи, соединяющие их, теперь указывают неправильно. Это лучше описано здесь в части "fixture hell", но показанное там решение не выглядит хорошо)

Следующая возможная схема, которую я вижу, следующая:

  • Я выполняю свои тесты; Django создает тестовую базу данных, создает syncdb и создает все эти таблицы.
  • В моей тестовой настройке я удаляю эту базу данных, создавая новую пустую базу данных.
  • Загрузка дампа данных из существующей базы данных также в тестовую настройку
2 ответа

Как проблема была решена:

После того, как syncdb создал тестовую базу данных, в partUp части тестов я использую os.system для доступа к оболочке из моего кода. Затем я просто загружаю дамп базы данных, который я хочу использовать для тестов.

Итак, это работает следующим образом: syncdb заполняет contenttype и некоторые другие таблицы данными. Затем в setUp части тестов загрузка sql-дампа очищает все ранее созданные данные, и я получаю хорошую базу данных.

Может быть, это не лучшее решение, но оно работает =)


Мой подход состоял в том, чтобы сначала использовать Юг, чтобы облегчить перенос БД (что совсем не помогает, но хорошо), а затем использовать модуль методов создания модели.

При запуске

$ manage.py test my_proj

Django с югом, установленным с созданием тестовой базы данных, и запустите все ваши миграции, чтобы дать вам полностью обновленный тест db.

Чтобы написать тесты, сначала создайте модуль python calle, test_model_factory.py Здесь создайте функции, которые создают ваши объекты.

def mk_user():
 User.objects.create(...)

Затем в ваших тестах вы можете импортировать свой модуль test_model_factory и создавать объекты для каждого теста.

def test_something(self):
 test_user = test_model_factory.mk_user()
 self.assert(test_user ...)

licensed under cc by-sa 3.0 with attribution.