如何实现pytest参数化中参数组的一对一关联迭代输出?
问题
现有如下pytest参数化代码:
@pytest.mark.parametrize("arg1", [1,2]) @pytest.mark.parametrize("arg2", [["A1", "A2"], ["B1", "B2", "B3"]]) def test_stackoverflow(arg1, arg2): print(arg1, arg2)
当前运行输出为:
1 [A1, A2] 2 [A1, A2] 1 [B1, B2, B3] 2 [B1, B2, B3]
期望得到如下输出:
1 A1 1 A2 2 B1 2 B2 2 B3
请问这种输出是否可以实现?如果可以,该如何操作?
解答
可以实现,核心是让arg1和arg2的子元素按预期一一配对,而非生成默认的笛卡尔积。以下是两种常用实现方式:
方法一:直接构造配对参数列表
把需要的参数对整理好,用单个parametrize装饰器即可:
@pytest.mark.parametrize("arg1, arg2", [ (1, "A1"), (1, "A2"), (2, "B1"), (2, "B2"), (2, "B3"), ]) def test_stackoverflow(arg1, arg2): print(arg1, arg2)
这种方式直观易懂,适合参数数量不多的场景,运行后直接输出预期结果。
方法二:预处理参数对再参数化
如果需要保留原始参数的分组结构,可以先展开参数对再传入parametrize:
# 定义原始分组参数 arg_groups = [ (1, ["A1", "A2"]), (2, ["B1", "B2", "B3"]), ] # 展开成单个参数对 test_params = [] for num, items in arg_groups: for item in items: test_params.append((num, item)) @pytest.mark.parametrize("arg1, arg2", test_params) def test_stackoverflow(arg1, arg2): print(arg1, arg2)
这种方式适合参数分组逻辑复杂、需要动态生成的场景,扩展性更强。
额外优化
如果需要在测试报告里区分每个用例,可以给参数对添加id标识,方便定位:
@pytest.mark.parametrize("arg1, arg2", [ (1, "A1"), (1, "A2"), (2, "B1"), (2, "B2"), (2, "B3"), ], ids=["1-A1", "1-A2", "2-B1", "2-B2", "2-B3"]) def test_stackoverflow(arg1, arg2): print(arg1, arg2)
内容的提问来源于stack exchange,提问作者Dinesh
相关产品推荐
相关产品推荐

