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

PyTest : dynamically generating test name during runtime

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

values_list=['apple','tomatoes','potatoes']

@pytest.mark.parametrize("value",values_list)
def test_xxx(self,value):
    assert value==value

我希望看到的最终结果是具有以下名称的 3 个测试:

test_apple

test_tomatoes

test_potatoes

我尝试查看 pytest 文档,但我没有找到任何可能阐明这个问题的东西。

您可以通过重写测试项的_nodeid属性来更改测试执行中显示的名称。示例:在 project/test 根目录中创建一个名为 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 时应谨慎,因为每个节点 ID 应保持唯一。否则,pytest 将默默地停止执行某些测试,并且很难找出原因。