如何使用@pytest.mark.parametrize选择性解包测试数据项
pytest参数化解包部分参数子集的实现方法
直接编写@pytest.mark.parametrize("b, c", test_data)报错的核心原因是:pytest.mark.parametrize会将传入数据集中的每个元素,按位置和声明的参数名一一绑定,声明2个参数但每条测试数据是长度为3的元组时,参数数量不匹配就会抛出错误,以下是3种可落地的实现方案:
方法1:提前预处理测试数据,提取需要的参数子集
通过列表推导式从原测试数据里筛出需要的字段,生成新的数据集传入装饰器即可,不会改动原始测试数据:# 原测试数据定义 test_data = [(a1,b1,c1), (a2,b2,c2),..., (an,bn,cn)] # 提取每个元组中索引1、2位置的b、c参数 bc_data = [(item[1], item[2]) for item in test_data] @pytest.mark.parametrize("b, c", bc_data) def test_case_2(b, c): # 测试逻辑直接使用b、c即可 pass方法2:用占位符接收不需要的参数(最简便)
遵循Python通用的未使用变量命名约定,用_作为不需要的参数的占位符,不用额外处理数据集,直接在参数列表里声明即可,测试逻辑里不需要用到这个占位变量:test_data = [(a1,b1,c1), (a2,b2,c2),..., (an,bn,cn)] # 用_占位不需要的第一个参数a @pytest.mark.parametrize("_, b, c", test_data) def test_case_2(_, b, c): # 直接使用b、c编写逻辑,无需处理_ print(b, c)如果有多个不需要的参数,直接用多个
_占位即可,比如元组包含4个元素仅需b、d时,参数声明写为"_, b, _, d"即可。方法3:整组传入后在用例内部解包
如果元组长度很长、需要的参数占比很低,也可以把整个元组作为单个参数传入,在测试用例内部按需提取需要的值:test_data = [(a1,b1,c1), (a2,b2,c2),..., (an,bn,cn)] @pytest.mark.parametrize("case_item", test_data) def test_case_2(case_item): # 按需提取需要的b、c b = case_item[1] c = case_item[2] # 后续测试逻辑 pass
日常开发中优先选占位符的写法,不需要额外加工测试数据,代码改动量最小,可读性也最高,是pytest参数化跳过不需要参数的主流写法。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

