PyTest:在运行时动态生成测试名称



当我使用@pytest.mark.parametrize("value",values_list)fixture运行测试时,我想在运行时动态命名测试。例如:

values_list=['apple','tomatoes','potatoes']
@pytest.mark.parametrize("value",values_list)
def test_xxx(self,value):
assert value==value

我想看到的最终结果是3个测试,名称如下:

test_apple

测试对象

test_potatoes

我试着查阅pytest文档,但我没有发现任何可能揭示这个问题的东西。

您可以通过重写测试项的_nodeid属性来更改测试执行中显示的名称。示例:在项目/测试根目录中创建一个名为conftest.py的文件,其中包含以下内容:

def pytest_collection_modifyitems(items):
for item in items:
# check that we are altering a test named `test_xxx`
# and it accepts the `value` arg
if item.originalname == 'test_xxx' and 'value' in item.fixturenames:
item._nodeid = item.nodeid.replace(']', '').replace('xxx[', '')

运行测试现在将产生

test_fruits.py::test_apple PASSED
test_fruits.py::test_tomatoes PASSED
test_fruits.py::test_potatoes PASSED

请注意,应谨慎使用覆盖_nodeid,因为每个nodeid都应保持唯一。否则,pytest将默默地放弃执行某些测试,并且很难找出原因。

相关内容

  • 没有找到相关文章

最新更新