我想设置py.test,使得夹具B可以在给定夹具A的值的情况下返回可变数量的参数。让我用当前实现的示例来说明。对于三个对象中的每一个,我想测试可变数量的属性。
@pytest.fixture(params=[Object1(), Object2(), Object3()])
def my_object(request):
return request.param
def test_keys(my_object):
for key in my_object.valid_keys:
assert getattr(my_object, key) > 0, "mock test failed"
上述实现是有效的,但从测试输出中看不出哪个valid_keys
被测试了。如果其中一个测试失败,则不会执行后续测试。理想情况下,我想要一个如下设置。
@pytest.fixture(params=[Object1(), Object2(), Object3()])
def my_object(request):
return request.param
@pytest.fixture
def valid_key(my_object):
# Return each valid key separately for each input object
def test_keys(my_objects, valid_key):
assert getattr(my_object, valid_key) > 0, "mock test failed"
这种结构可以让我更轻松地分析我的测试,观察覆盖范围,确保所有测试都独立运行等。
答案 0 :(得分:0)
如果您知道每个对象确实存在相同数量的有效密钥,那么您编写的代码将是完美的。 (与每个对象的1个有效密钥完全相同,更多只需将params
添加到第二个夹具中。)
如果这还不够,你必须进入大联盟并编写一个名为pytest_generate_tests
的pytest钩子,它允许你“定义你自己的参数化方案”(根据pytest文档)
文档:https://docs.pytest.org/en/latest/example/parametrize.html