Во-первых, это Django 1.9.13.Я понимаю, что это неподдерживаемая версия, но я должен использовать ее по причинам.База данных postgres 9.6.
У меня есть проект, который выполняет около 40 тестов, разделенных на несколько файлов.Все тестовые случаи TransactionTestCase
, которые загружают свои собственные приборы через fixture = ['fixture_name.json']
Я использую приборы в каталоге app/fixtures
, которые похожи на
base_data.json
test_a_data.json
test_b_data.json
...
Базовые данные используются в большинстве, если не во всех тестовых случаях.Но другие приборы используются в 1 или нескольких тестах.
Настройки для его запуска:
'test': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'HOST': 0.0.0.0,
'PORT': 5432,
'NAME': <database>,
'USER': <user>,
'PASSWORD': <pass>,
'TEST': {
'NAME': 'test_database'
}
}
При выполнении следующей команды она работает нормально
python manage.py app.test -v 1 --keepdb
Однако при запуске отдельных тестовых случаев она не срабатывает
python manage.py app.test.test_A.ATestCase -v 1 --keepdb
Это происходит с
IntegrityError: Problem installing fixture '/app/fixtures/test_a_data.json': Could not load <object>(pk=1): duplicate key value violates unique constraint "<uniq_constraint_name>"
DETAIL: Key <key> already exists.
, как если бы прибор загружался дважды.Я попытался проверить SQL, который использует Django, и обнаружил, что рассматриваемый объект загружается только один раз.Однако объект существует в <database>
, а не <test_database>
.
Это подводит меня ко второй части моей проблемы.
Когда я запускаю полный набор тестов, он работает нормально, даже тесты, в которых вышеперечисленные приборы работали с ошибками при запуске сами по себе.
Однако после успешного запуска набора тестов последующие запуски набора тестов завершаются неудачно, и при проверке <database>
все таблицы теперь пусты.Я попытался отладить это путем проверки SQL-запросов, но журналы останавливаются после 4 МБ.И так как я не могу успешно запустить один TestCase
, я не могу добраться до того, что строки таблицы будут удалены, и посмотреть, что может разрушать данные в БД.
Я просмотрел все документы по тестированию Django, которые смог найти, и не смог найти ничего, что объясняло бы, почему <database>
либо удаляется при успешном выполнении теста, либо почему одиночные тестовые случаи не выполняются на ихсобственный, но не вместе с полным набором тестов.