我正在尝试重用一些单元测试功能。唯一可变的部分实际上是测试数据集。因此,我将测试逻辑封装在一个类中,并在创建对象时注入实际的测试数据。
不幸的是,这似乎不适用于@pytest.fixture
装饰器。
一些最小的代码来重现。这是我的测试类的通用定义define_test.py
:
#!/usr/bin/env python3
import pytest
class TestDemo:
def __init__(self, _data: list):
self.__testData = _data
@pytest.fixture(scope='module', params=self.__testData)
def fixture(self, request):
return request.param
def test(self, fixture):
foo = fixture
assert foo is not None
预期用途将是这样的 use_test.py
#!/usr/bin/env python3
import define_test
data1 = [1, 2, 3, 4]
test1 = define_test.TestDemo(data1)
data2 = [4, 3, 2, 1]
test2 = define_test.TestDemo(data2)
尝试运行此代码会产生
define_test.py:9: in TestDemo
???
E NameError: name 'self' is not defined
我很确定问题在于,不能简单地将通常的 OO 机制应用于pytest
装饰器。看起来要么装饰器在此类的实例存在之前就被评估,要么它根本无法处理实例。
那么,使用可变数据实现可重用测试目标的正确方法是什么?
您可以通过动态参数化来表达这一点,您可以通过钩子访问 pytest_generate_tests
通过这种方式,您可以在收集时拦截测试并注入您自己的参数化设置。每个测试都会调用钩子,并将metafunc
对象作为公开parameterize
方法的参数
metafunc 文档在这里
在我看来,您无法访问实例数据,因为此代码是在收集时发生的,在您的对象初始化之前。但是您可以通过 访问类对象metafunc.cls
,所以也许您可以在超类中使用您的方法,然后将其子类化以将特定数据案例添加为类属性
这是我正在考虑的事情的一些示例代码
一种) pytestfoo.py
#!/usr/bin/env python3
import pytest
class BaseTest:
def test(self, testparams):
print("\n", testparams, "\n")
assert testparams is not None
class TestCaseA(BaseTest):
testparams = [[1,2,3,4]]
class TestCaseB(BaseTest):
testparams = [[4,3,2,1]]
b) 相应的 conftest.py
def pytest_generate_tests(metafunc):
metafunc.parametrize("testparams", metafunc.cls.testparams)
并使用这些测试运行 pytest
pytest -sv pytestfoo.py
========================================================== test session starts ==========================================================
platform linux -- Python 3.7.6, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- /home/cms/.pyenv/versions/3.7.6/envs/tmp/bin/python3.7
cachedir: .pytest_cache
rootdir: /home/cms/tmp
collected 2 items
pytestfoo.py::TestCaseA::test[testparams0]
[1, 2, 3, 4]
PASSED
pytestfoo.py::TestCaseB::test[testparams0]
[4, 3, 2, 1]
PASSED
=========================================================== 2 passed in 0.01s ===========================================================
希望这里对您自己的实验有一些启发。pytest 文档展示了如何使用命令行中的数据进行参数化,这可能比上面的方法更实用,但我试图按照您的指导使用代码定义数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句