Юнит-тестирование Django с загрузочными приспособлениями для решения нескольких зависимых задач - PullRequest
1 голос
/ 24 марта 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 23 июля 2010

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

Когда вы запускаете

  $  manage.py test my_proj

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

Чтобы написать тесты, сначала создайте вызываемый модуль Python 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 ...)
0 голосов
/ 26 марта 2010

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

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

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

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

...