Я использую производственную базу данных для тестов (на самом деле это тестовая база данных в докере). Вопрос в том, как заставить тесты работать в транзакциях с этой базой данных. Мне нужно такое же поведение, как @pytest.mark.django_db(transaction=True)
, но с производственной базой данных.
Текущая настройка:
conftest.py
@pytest.fixture(scope='session')
def django_db_setup():
"""Avoid creating/setting up the test database"""
pass
@pytest.fixture
def db(request, django_db_setup, django_db_blocker):
django_db_blocker.unblock()
@pytest.fixture
def myfixture(db):
...
return SomeObject
test_example.py
def test_something(db, myfixture):
assert ...
Наконец я нашел решение.
Добавьте код загрузки приборов в db
прибор:
conftest.py
from django.core.management import call_command
@pytest.fixture
def db(request, django_db_setup, django_db_blocker):
django_db_blocker.unblock()
call_command('loaddata', 'fixture.json')
И используйте @pytest.mark.django_db(transaction=True)
с тестами:
test_example.py
@pytest.mark.django_db(transaction=True)
def test_something(db, myfixture):
assert ...
После каждого теста pytest очищает вашу базу данных и заполняет ее данными фикстур.
Все дело в настройках:
DATABASES