5

状況を次のように要約しました。

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 番目のテスト ケースのデータベースが再初期化されない理由について、ご意見をいただければ幸いです。

4

1 に答える 1