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