如何用Pytest parametrize优雅传递多组列表参数?
解决Pytest参数化传递列表对的问题
原代码错误原因
你最初的代码报错是因为@pytest.mark.parametrize的参数传递方式错误:第二个参数需要是所有测试参数组的集合,每个参数组对应你定义的a和b。你把(list1, list2)和(list3, list4)作为单独的参数传给parametrize,导致pytest误将list1当成单组参数的所有值(它有3个元素),和你定义的2个参数名数量不匹配,从而抛出错误。
优雅的解决方案
方案1:直接传递参数组集合
把每组列表对放在元组里,再统一放到外层列表中,这是parametrize的标准用法:
import pytest list1 = [1, 2, 3] list2 = [4, 5, 6] list3 = [7, 8, 9] list4 = [10, 11, 12] @pytest.mark.parametrize(['a', 'b'], [(list1, list2), (list3, list4)]) def test_with_list(a, b): print(f"{a=}") print(f"{b=}")
执行后会得到你预期的结果:
test.py::test_with_list[0] a=[1, 2, 3] b=[4, 5, 6] PASSED test.py::test_with_list[1] a=[7, 8, 9] b=[10, 11, 12] PASSED
方案2:用zip批量分组(更简洁)
如果你的列表是成对连续排列的,可以把所有列表放到一个大列表中,再用切片+zip自动分组,避免重复写元组:
import pytest all_lists = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12] ] @pytest.mark.parametrize(['a', 'b'], zip(all_lists[::2], all_lists[1::2])) def test_with_list(a, b): print(f"{a=}") print(f"{b=}")
这里all_lists[::2]取所有偶数索引的列表(第1、3组),all_lists[1::2]取所有奇数索引的列表(第2、4组),zip会将它们一一配对成参数组,效果和方案1完全一致。
这两种方案都不需要字典和索引,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Motixa
相关产品推荐
相关产品推荐

