Тесты Django удаляют производственные данные, работают только при одновременном запуске всех тестов - PullRequest
0 голосов
/ 08 июня 2018

Во-первых, это 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> либо удаляется при успешном выполнении теста, либо почему одиночные тестовые случаи не выполняются на ихсобственный, но не вместе с полным набором тестов.

...