Модульное тестирование Django с загрузкой приспособлений для решения проблем нескольких зависимых приложений
-
22-09-2019 - |
Вопрос
Сейчас я создаю модульные тесты для уже существующего кода.Я столкнулся со следующей проблемой:
После запуска syncdb для создания тестовой базы данных Django автоматически заполняет несколько таблиц, таких как django_content_type или auth_permissions.
Затем представьте, что мне нужно запустить сложный тест, например проверить регистрацию пользователей, для которого потребуется множество таблиц данных и соединений между ними.
Если я попытаюсь использовать всю мою существующую базу данных для создания приспособлений (это было бы довольно удобно для меня) - я получу сообщение об ошибке типа здесь.Это происходит потому, что Django уже заполнил таблицы типа django_content_type.
Следующий возможный способ - использовать опцию django dumpdata --exclude для уже заполненных таблиц syncdb.Но это также плохо работает, потому что, если я беру объекты пользователя и группы пользователей из моей базы данных и таблицы пользовательских разрешений, которая была автоматически создана syncdb, я могу получать ошибки, потому что первичные ключи, соединяющие их, теперь указывают неправильно.Это лучше описано здесь в части "ад приспособлений", но решение, показанное там, выглядит не очень хорошо)
Следующая возможная схема, которую я вижу, следующая:
- Я провожу свои тесты;Django создает тестовую базу данных, создает syncdb и создает все эти таблицы.
- В моей тестовой настройке я удаляю эту базу данных, создавая новую пустую базу данных.
- Загрузите дамп данных из существующей базы данных также в тестовой настройке
Решение
Вот как была решена проблема:
После того, как 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 ...)