Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用每个模块的测试数据初始化数据库?Pytest django_Python_Django_Pytest_Pytest Django - Fatal编程技术网

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

Python 如何使用每个模块的测试数据初始化数据库?Pytest django,python,django,pytest,pytest-django,Python,Django,Pytest,Pytest Django,对于项目中的每个应用程序,您都需要编写测试。对于每个应用程序,您首先需要上传测试数据,在通过所有模块测试后,必须删除这些数据 我找到了几个解决方案,但在我看来没有一个是最优的 第一: 在每个应用程序的文件conftest.py中,I覆盖方法django_db_setup,但在这种情况下,通过模块中的测试后,数据不会被删除,并可用于其他应用程序。 理论上,在yield的帮助下,您可以在通过测试后删除所有数据 @pytest.fixture(scope='module') def django_db

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

我找到了几个解决方案,但在我看来没有一个是最优的

第一: 在每个应用程序的文件
conftest.py
中,I覆盖方法
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')

在这种情况下,数据加载的次数与模块中的测试次数相同,这似乎也不太正确。

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

来自pytest\u django.fixtures导入\u django\u db\u fixture\u助手
@pytest.fixture(autoscope='module')
def setup_db(请求、django_db_设置、django_db_阻止程序):
_django_db_fixture_helper(请求,·django_db_拦截器)
调用_命令('loaddata','path/to/fixture.json')

我认为pytest_django应该在其官方API中将_django_db_fixture_helper作为工厂夹具导出。

我仍然不确定我是否理解您的问题,这就是我删除答案的原因。我已经在一个多应用django项目上测试了模块范围的夹具解决方案,在每个模块完成执行后,数据将被删除;隔离是通过加载特定于应用程序的fixture文件来实现的。我将再次尝试解释。有些应用程序的测试数据应分别相互隔离。在上面的示例中,测试单个模块需要所有3个json文件。我找到了上面显示的两种解决方案。但在第一种情况下,必须手动删除数据,在第二种情况下,模块中的每个测试都将加载这3个文件。我认为理想的解决方案与标准django测试中的
setUp
函数相同。但就我的理解而言,它并不存在:(对于每个应用程序,我需要上传我的测试数据,在测试结束后,删除它们,以便它们不会与以下测试冲突。或者使用tests为每个类创建一次设置函数。如果不为e再次加载夹具,确保测试顺序不会影响测试结果不是那么容易每次测试后都会丢弃数据。每次重新加载数据似乎是正确的做法。这是合乎逻辑的,但会增加测试运行时间。