You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:35:15