gpt4 book ai didi

python - 如何使用 pytest 对参数的笛卡尔积进行参数化,有些是固定的?

转载 作者:太空宇宙 更新时间:2023-11-04 11:21:30 25 4
gpt4 key购买 nike

我正在为基类及其子类编写测试。它看起来大致是这样的:

@pytest.fixture()
def bc()
return BaseClass(...)

@pytest.mark.parametrize('param1,param2', [...])
def test_baseclass_func1(bc, param1, param2):
assert ...

@pytest.mark.parametrize('param1,param2', [...])
def test_baseclass_func2(bc, param1, param2):
assert ...

@pytest.mark.parametrize('param1,param2', [xyz])
def test_baseclass_func3(bc, param1, param2):
assert ...

@pytest.mark.parametrize('param1,param2', [xyz])
def test_subclass1_func3(param1, param2):
sc1 = SubClass1(...)
assert ...

@pytest.mark.parametrize('param1,param2', [xyz])
def test_subclass2_func3(param1, param2):
sc1 = SubClass2(...)
assert ...

所以我希望使用 fixtured BaseClass 实例,我没有明显的理由在子类上使用 fixture,我希望避免 func3 测试的 3 次复制粘贴。
我最好的办法是再使用一个参数化:

@pytest.mark.parametrize('classtype', [
(BaseClass,),
(SubClass1,),
(SubClass2,),
])
@pytest.mark.parametrize('param1,param2', [xyz])
def test_func3(classtype, param1, param2):
class_inst = classtype()
assert ...

但由于它需要一个额外的 BaseClass 实例,我想有更好的解决方案。我错过了什么技巧?

最佳答案

如果我没理解错的话,你可以使用 indirect parametrization将类参数转换为传递给测试的实例:

@pytest.fixture(scope='session')
def instance(request):
cls = request.param
instance = cls()
yield instance
# cleanup instance here if necessary

@pytest.mark.parametrize('instance', (BaseClass, SubClass1, SubClass2,), indirect=True)
@pytest.mark.parametrize('param1,param2', (('spam', 'foo'), ('eggs', 'bar')))
def test_func3(instance, param1, param2):
assert instance.func3(param1, param2) == 'bacon'

由于 instance fixture 是 session 范围的,所有创建的实例都创建一次并在整个测试 session 中重复使用。如果您需要更复杂的实例创建,您可以在 fixture 中进行,保持测试干净。重用 bc fixture 的示例:

@pytest.fixture(scope='session')
def bc():
return BaseClass(...)

@pytest.fixture(scope='session')
def instance(request, bc):
cls = request.param
if cls.__name__ == 'BaseClass':
instance = bc
else:
instance = cls()
yield instance

关于python - 如何使用 pytest 对参数的笛卡尔积进行参数化,有些是固定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55894457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com