如何访问参数化pytest测试中括号内的字符串?
当我有一个带参数的 pytest
测试,比如下面这个例子:
@parametrize('repetition', range(3))
@parametrize('name', ['test', '42'])
@parametrize('number', [3,7,54])
def test_example(repetition, name, number):
assert 1 = 1
测试运行器会打印出类似下面的内容:
tests\test_example.py:12: test_example[1-test-7]
其中,参数化的值会出现在测试函数名称旁边的方括号里(比如 test_example[0]
)。我想知道怎么在测试里访问这个方括号里的内容(也就是字符串 0
)。我查过 request
这个工具,但没找到适合我需求的方法。
为了更清楚:在测试方法里,我想打印出字符串 1-test-7
,这是 pytest
在控制台上打印的内容。
我该怎么在测试中访问这个字符串 1-test-7
呢?
我不想自己用类似下面的方式创建这个字符串:
print str(repetition)+"-"+name+"-"+str(number)
因为每次我给测试方法添加新的参数时,这个字符串都会变化。
另外,如果在参数列表中使用了更复杂的对象(比如命名元组),这些对象只是通过简写引用(例如 object1
, object2
, ...)。
补充说明:如果我在测试方法中把 request
这个工具作为参数使用,当我用下面的命令时,我能“看到”我想访问的字符串:
print request.keywords.node.__repr__()
这会打印出类似这样的内容:
<Function 'test_example[2-test-3]'>
我正在尝试找出这个方法 __repr__
是怎么定义的,以便直接访问字符串 test_example[2-test-3]
,从中我可以轻松提取出我想要的字符串 2-test-3
,在这个例子中就是这样。
1 个回答
2
这个解决方案使用了内置的 request
这个工具,可以通过下面的方式来访问它:
def test_example(repetition, name, number, request):
s = request.keywords.node.name
print s[s.find("[")+1:s.find("]")]
这样做会为每一个单独的参数化测试打印出参数字符串,这样每个参数化测试就可以被识别出来。