如何在pytest中用@parametrize按索引逐一对比两个列表?
解决pytest parametrize生成笛卡尔积,实现按索引配对测试的方法
当你嵌套使用多个@pytest.mark.parametrize装饰器时,pytest会默认生成参数的笛卡尔积组合,这就是你得到多余测试用例的原因。要实现两个列表按索引一一对应的对比测试,只需将两个列表的元素预先配对成元组列表,再传入单个parametrize装饰器即可。
错误示例(生成笛卡尔积)
import pytest list1 = [1, 2, 3] list2 = [1, 2, 3] # 嵌套parametrize会生成3*3=9组测试用例 @pytest.mark.parametrize("a", list1) @pytest.mark.parametrize("b", list2) def test_compare(a, b): assert a == b
正确实现(按索引配对)
使用zip()函数将两个列表打包成一一对应的元组列表,作为parametrize的参数:
import pytest list1 = [1, 2, 3] list2 = [1, 2, 3] # 打包后生成[(1,1), (2,2), (3,3)],对应3组测试用例 @pytest.mark.parametrize("a, b", zip(list1, list2)) def test_compare(a, b): assert a == b
进阶:给测试用例添加标识
如果需要更清晰地识别每个测试用例对应的索引,可以通过ids参数自定义测试名称:
import pytest list1 = [1, 2, 3] list2 = [1, 2, 3] @pytest.mark.parametrize( "a, b", zip(list1, list2), ids=[f"compare_index_{i}" for i in range(len(list1))] ) def test_compare(a, b): assert a == b
运行测试时,每个用例会显示compare_index_0、compare_index_1等名称,方便定位问题。
内容的提问来源于stack exchange,提问作者Aliska02
相关产品推荐
相关产品推荐

