Как загрузить фикстуры для LiveServerTestCase

Я пытаюсь написать тестовые примеры в Django, используя Selenium. Я хочу использовать существующие фикстуры, чтобы в моей тестовой базе данных (SQLite3) были тестовые данные для каждого теста.

У меня есть несколько тестовых примеров модели (только с использованием класса TestCase) следующим образом:

from django.test import TestCase
from django.test import LiveServerTestCases
from missions.models import Mission, MissionDataRecord


class MissionModelTests(TestCase):
    fixtures = ['myproject_common/fixtures/auth_initial_load.json', 'worklog/fixtures/worklogs_initial_load',
                'missions_initial_load.json']

    def test_object_name_is_mission_title(self):
        mission = Mission.objects.get(id=1)
        self.assertEqual(mission.title, str(mission))

    def test_object_name_is_mission_title_again(self):
        mission = Mission.objects.get(id=1)
        self.assertEqual(mission.title, str(mission))

Это работает, как и ожидалось, при таком запуске (я получаю два прохода теста). Однако для тестирования Selenium мне нужно использовать LiveServerTestCase вместо TestCase.

Приведенный выше простой пример представляет собой модельный тест, но для иллюстрации проблемы, с которой я сталкиваюсь в Selenium, если я просто заменю «TestCase» на «LiveServerTestCase», первый тест пройдет, но второй тест завершится ошибкой

django.db.utils.IntegrityError: проблема с установкой приспособления '[...]/fixtures/auth_initial_load.json': не удалось загрузить auth.User(pk=1): ограничение UNIQUE не удалось: auth_user.username

Эта ошибка возникает в _fixture_setup файла /django/test/testcases.py. Кажется, это говорит о том, что мои фикстуры (в частности, фикстура auth_initial_load) пытаются снова загрузить ПОВЕРХ существующих данных. Однако из чтения документов django этого не должно происходить, потому что каждый тест должен выполняться в своей собственной транзакции (что, как я полагаю, означает, что фикстуры загружаются для каждой транзакции).

Что здесь происходит и, что более важно, как я могу использовать LiveServerTestCase с моими существующими приборами (аналогично тому, как я сейчас использую TestCase)? На самом деле мне нужно использовать StaticLiveServerTestCase, но я предполагаю, что код будет таким же.


person n00b    schedule 13.08.2019    source источник


Ответы (1)


Оказывается, я все-таки правильно загружал фикстуры. Проблема заключалась в самих моих приборах, использующих жестко закодированные первичные (и внешние) ключи. В моем случае два пользователя были созданы до загрузки фикстур, поэтому, когда фикстуры пытались загрузить с одним и тем же первичным ключом, происходило нарушение ограничения UNIQUE. Решение состояло в том, чтобы повторно сгенерировать мои приборы с использованием флагов --natural-primary и --natural-foreign, как это было предложено в этом ответе SO.

person n00b    schedule 13.08.2019