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

StackOverflow https://stackoverflow.com/questions/2507294

Вопрос

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

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

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

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

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

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

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

Решение

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

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

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

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

Другие советы

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

Когда ты бежишь

  $  manage.py test my_proj

Django с установленным South с create the Test 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 ...)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top