Django Pytest , 在 参数 化 中 使用 数据 库 条目

vatpfxk5  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(116)

我想有一个数据测试,将使用来自数据库的真实的数据。
我们的目标是遍历表Foo的所有条目,并在每个条目上应用一些测试逻辑。理想情况下是使用parametrize,但我对parametrize的DB访问有点吃力。
到目前为止我做了什么:

测试.py

import pytest
from app.models import Foo

pytestmark = pytest.mark.django_db

@pytest.fixture(scope='session')
def django_db_setup():
    settings.DATABASES['default'] = {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ['DB_NAME'],
        'USER': os.environ['DB_USER'],
        'PASSWORD': os.environ['DB_PASSWORD'],
        'HOST': 'localhost',
    }

@pytest.mark.django_db
class TestFoo:
    @pytest.mark.parametrize('foo', Foo.objects.all())
    def test_foo_objects(self, foo):
        assert foo.is_ok

最终我得到了
E运行时错误:不允许数据库访问,请使用“django_db”标记,或者“db”或“transactional_db”夹具来启用它。
但是,如果在parametrize中未使用DB访问,则它有效。即,在test_foo_objects内部允许DB访问。
因此,问题是如何允许parametrize也使用DB?

50few1ms

50few1ms1#

没有简单的方法可以做到这一点,因为:
测试函数的参数化发生在*收集时间***。(根据pytest文档)。
即使你想使用pytest_generate_tests函数,你也需要在不使用任何fixture
(由pytest-django插件提供)的情况下获得Foo模型(数据)**。
我尝试了Django的反序列化数据的方法,从预先保存在JSON文件中的模型,由dumpdata CLI命令生成。
直接连接到数据库仍然是检索模型数据的最后一种方法。但是我认为这对于这样的任务来说太复杂了。如果你真的需要的话,最好把模型(表)提取到纯文本文件中,然后解析它以获得参数化参数。

相关问题