gpt4 book ai didi

python - 如何在测试执行期间找到参数化测试的测试 ID?

转载 作者:行者123 更新时间:2023-12-04 15:44:28 26 4
gpt4 key购买 nike

我有一个用 @pytest.mark.parametrize 参数化的测试以便可以使用不同的参数执行相同的测试功能。 @pytest.mark.parametrize使用 ids参数定义为函数,以便为每个参数生成自定义测试 ID。
我的测试函数将一个文件写入磁盘,该文件将给定参数的实际结果和预期结果之间的差异制成表格。我想报告文件中的测试 ID。
是否有我可以调用的 API 来告诉我哪个测试 ID 适用于特定的测试执行?

最佳答案

您可以使用 request.node.callspec.id来自 Request Fixture .
但请注意,该值取决于 ids 的方式函数“生成一个字符串表示作为测试 ID 的一部分”。来自 Different options for test IDs 上的 pytest 文档, 参数的字符串化版本通常会添加到测试 ID 中。
例如,如果 ids函数生成一个不包含字符串化参数或不依赖于其他任何东西的 ID:

import random
def generate_random_id(param) -> str:
return f'{random.randint(1,100)}'

testdata = ['argA', 'argB']

@pytest.mark.parametrize('param', testdata, ids=generate_random_id)
def test_foo(param, request):
print(request.node.callspec.id)
然后您将按原样获得生成的 ID:
tests/test_a.py::test_foo[78] PASSED      
tests/test_a.py::test_foo[10] PASSED

============================ PASSES =============================
_________________________ test_foo[78] __________________________
--------------------- Captured stdout call ----------------------
78
_________________________ test_foo[10] __________________________
--------------------- Captured stdout call ----------------------
10
如果 ids函数包括参数的字符串表示,那么您需要某种分隔符来手动拆分参数和测试 ID:
import random
def generate_random_id(param):
test_id = random.randint(1, 100)
return f'{param}-{test_id}'

testdata = ['argA', 'argB']

@pytest.mark.parametrize('param', testdata, ids=generate_random_id)
def test_foo(param, request):
param, test_id = request.node.callspec.id.split('-')
print(param)
print(test_id)
tests/test_a.py::test_foo[argA-43] PASSED 
tests/test_a.py::test_foo[argB-37] PASSED

============================ PASSES =============================
_______________________ test_foo[argA-43] _______________________
--------------------- Captured stdout call ----------------------
argA
43
_______________________ test_foo[argB-37] _______________________
--------------------- Captured stdout call ----------------------
argB
37
如果有多个参数,那么它会变得更复杂,因为所有的参数 + ids组合连接在一起以创建完整的测试 ID。您将需要一个不同于 - 的单独分隔符:
import random
def generate_random_id(param):
test_id = random.randint(1, 100)
return f'{param}+{test_id}' # Use '+' to separate param+ID

testdata = [
('argA', 'argB'),
('argC', 'argD'),
]

@pytest.mark.parametrize('param1, param2', testdata, ids=generate_random_id)
def test_foo(param1, param2, request):
print(request.node.callspec.id)
params = request.node.callspec.id.split('-')
for a_param in params:
param, test_id = a_param.split('+')
print(param)
print(test_id)
tests/test_a.py::test_foo[argA+70-argB+25] PASSED         
tests/test_a.py::test_foo[argC+97-argD+30] PASSED

===================================== PASSES =====================================
___________________________ test_foo[argA+70-argB+25] ____________________________
------------------------------ Captured stdout call ------------------------------
argA+70-argB+25
argA
70
argB
25
___________________________ test_foo[argC+97-argD+30] ____________________________
------------------------------ Captured stdout call ------------------------------
argC+97-argD+30
argC
97
argD
30

关于python - 如何在测试执行期间找到参数化测试的测试 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56466111/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com