目标是对一组对象进行参数化,并对每个对象进一步对所有测试进行参数化(从1到N)。我的对象可能非常大,这就是为什么我不想一次性加载所有对象的原因。对于所有对象,测试次数应等于tests
中的键数,而不是对象数。
当前,我正在尝试通过将固定装置传递到mark.parametrize中以生成要运行的测试列表来做到这一点。但这在pytest.mark.parametrize
中无法正常工作,因为它将some_fixture
视为一个函数,并且出现以下错误:
AttributeError: 'function' object has no attribute 'list_of_tuples'
示例代码:
dict = {
'obj1': {
'tests': {'a1': 'b1', 'a2':'b2'}
},
'obj2': {
'tests': {'a3':'b3', 'a4':'b4', 'a5':'b5'}
}
}
class RandomClass():
def __init__(self, name, dict):
self._obj_name = name
self._dict = dict
self.list_of_tuples = None
def create_list_of_tuples(self):
self.list_of_tuples = []
for item in self._dict[self._obj_name]['tests']:
self.list_of_tuples.append((item, self._dict[self._obj_name]['tests'][item]))
@pytest.fixture(params=list(dict.keys())
def some_fixture(request, dict):
obj = RandomClass(name = request.param, dict=dict)
obj.create_list_of_tuples()
return obj
@pytest.mark.parametrize("var1, var2", some_fixture.list_of_tuples, indirect=True)
def test_something(var1, var2):
assert var1 == var2
非常感谢。
答案 0 :(得分:0)
pytest不支持夹具作为参数化的一部分,夹具是在收集所有测试后制成的