简短的回答:
- 使用名为
request
- 该夹具具有以下有趣的属性:
request.node.originalname
= 函数/方法的名称
request.node.name
= 函数/方法的名称和参数的 id
request.node.nodeid
= 测试文件的相对路径,测试类的名称(如果在一个类中),函数/方法的名称和参数的 id
长答案:
我检查了request.node
. 以下是我发现的最有趣的属性:
class TestClass:
@pytest.mark.parametrize("arg", ["a"])
def test_stuff(self, request, arg):
print("originalname:", request.node.originalname)
print("name:", request.node.name)
print("nodeid:", request.node.nodeid)
打印以下内容:
originalname: test_stuff
name: test_stuff[a]
nodeid: relative/path/to/test_things.py::TestClass::test_stuff[a]
如果要完全识别测试(包括参数),NodeID 是最有希望的。请注意,如果测试是作为一个函数(而不是在一个类中),那么类名 ( ::TestClass
) 就会丢失。
您可以根据需要进行解析nodeid
,例如:
components = request.node.nodeid.split("::")
filename = components[0]
test_class = components[1] if len(components) == 3 else None
test_func_with_params = components[-1]
test_func = test_func_with_params.split('[')[0]
test_params = test_func_with_params.split('[')[1][:-1].split('-')
在我的示例中,这导致:
filename = 'relative/path/to/test_things.py'
test_class = 'TestClass'
test_func = 'test_stuff'
test_params = ['a']