状況を次のように要約しました。
import pytest
from django.core.management import call_command
from foo import bar
@pytest.fixture(scope='session')
def django_db_setup(django_db_setup, django_db_blocker):
LOGGER.info('ran call_command')
with django_db_blocker.unblock():
call_command('loaddata', 'XXX.json')
@pytest.mark.django_db(transaction=True)
def test_t1():
assert len(bar.objects.all())
@pytest.mark.django_db(transaction=True)
def test_t2():
assert len(bar.objects.all())
テスト フィクスチャ XXX.json には 1 つのバーが含まれています。最初のテスト (test_t1) は成功します。2 番目のテスト (test_t2) は失敗します。transaction=True 属性では、テスト フィクスチャからのデータでデータベースが再初期化されないようです。
代わりに unittest の TransactionTestCase を使用すると、クラス内のすべてのテスト ケースの前に初期化が行われ、すべてのテストが成功します。
from django.test import TransactionTestCase
from foo import bar
class TestOne(TransactionTestCase):
fixtures = ['XXX.json']
def test_tc1(self):
assert len(bar.objects.all())
def test_tc2(self):
assert len(bar.objects.all())
objs = bar.objects.all()
for bar in objs:
bar.delete()
def test_tc3(self):
assert len(bar.objects.all())
pytest の例で 2 番目のテスト ケースのデータベースが再初期化されない理由について、ご意見をいただければ幸いです。