我试着用一种好的方式来解决这个问题,但似乎不能让它工作。
假设我有以下业务逻辑要测试:
class MyClass:
def __init__(self, value):
self.value = value
def execute(self):
return self.value
以及以下测试用例:
test_cases = [
{
'name': "assert True",
'data': True,
'expected': False
}, {
'name': "assert False",
'data': False,
'expected': True
}
]
然后我想编写以下测试套件:
def idfn(val):
return val.get('name')
@pytest.fixture(params=test_cases, ids=idfn)
def my_class(request):
return MyClass(request.param['data'])
@pytest.fixture(params=test_cases, ids=idfn)
def expected(request):
return request.param['expected']
class Test():
def test_execute(self, my_class, expected):
assert my_class.execute() == expected
我如何避免pytest做每一个可能的测试用例组合?我想只生成2个测试,因为我有2个测试用例,但PyTest正在生成4个。
2条答案
按热度按时间wkftcu5l1#
如果你想使用多个耦合参数(
data
和expected
),你只需要在一个fixture或一个parametrize
调用中合并它们,否则fixture将总是像你看到的那样组合:或者为了可读性使用dict:
在您的例子中,您也可以直接使用
mark.parametrize
而不使用fixture:选择哪一个是一个品味的问题。
在这种情况下,使用
mark.parametrize
可能是更好的选择,因为单独的参数使它更好地可读。如果你想在多个测试中使用参数,那么fixture可能是更好的选择,并且testdata的阅读是扩展的。请注意,还有一个选项可以参数化
pytest_generate_tests
中的测试,这与将mark.parametrize
装饰器添加到所有或部分测试具有相同的效果。41zrol4v2#