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
将默默地停止执行某些测试,并且很难找出原因。
我想在 运行 期间使用 @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
将默默地停止执行某些测试,并且很难找出原因。