如何使用每个模块的测试数据初始化数据库? Pytest-django

时间:2019-07-22 19:32:50

标签: python django pytest pytest-django

对于项目中的每个应用程序,您需要编写测试。同样对于每个应用程序,您首先需要上传测试数据,在通过所有模块测试后,必须将其删除。

我找到了几种解决方案,但在我看来,它们都不是最优的

第一: 我在每个应用程序的文件conftest.py中覆盖了方法django_db_setup,但是在这种情况下,通过模块中的测试后数据不会被删除,并且可用于其他应用程序。 理论上,借助yield,您可以在通过测试后删除所有数据。

@pytest.fixture(scope='module')
def django_db_setup(django_db_setup, django_db_blocker):
    with django_db_blocker.unblock():
        call_command('loaddata', './apps/accounts/fixtures/accounts.json')
        call_command('loaddata', './apps/activation/fixtures/activation.json')
        call_command('loaddata', './apps/questionnaire/fixtures/questionnaire.json')
        yield 
        # delete test data

第二:在带有测试的类中编写这样的设置

@pytest.fixture(autouse=True)
def setup(self, db):
    call_command('loaddata', './apps/accounts/fixtures/accounts.json')
    call_command('loaddata', './apps/activation/fixtures/activation.json')
    call_command('loaddata', './apps/questionnaire/fixtures/questionnaire.json')

在这种情况下,数据加载的次数与模块中测试的次数一样多,这似乎也不是很正确。

1 个答案:

答案 0 :(得分:0)

我在自己的测试中做了类似的事情:

from pytest_django.fixtures import _django_db_fixture_helper

@pytest.fixture(autoscope='module')
def setup_db(request, django_db_setup, django_db_blocker):
    _django_db_fixture_helper(request,·django_db_blocker)
    call_command('loaddata', 'path/to/fixture.json')

我认为pytest_django应该在其官方API中将_django_db_fixture_helper导出为工厂设备。