如何访问参数化pytest测试中括号内的字符串?

2 投票
1 回答
794 浏览
提问于 2025-04-18 14:34

当我有一个带参数的 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("]")]

这样做会为每一个单独的参数化测试打印出参数字符串,这样每个参数化测试就可以被识别出来。

撰写回答