如何在@pytest.mark.parametrize中使用函数返回值作为测试参数?
解决方案:用函数返回值作为pytest参数化的测试数据
没问题,我来帮你搞定这个pytest参数化的问题~首先你的代码里有几个小细节需要调整,然后就能顺利实现用函数返回值作为测试参数的需求了:
问题分析
- 你的
return_param函数定义了self参数,但它并不是类的方法,这个参数完全多余,会导致调用出错; - 直接在参数列表里写
return_param是把函数对象本身传进去,而不是它的返回值,pytest会无法匹配参数数量,直接报错; - 顺便提一句:原代码里
"6*9"对应的expected写的是42,这明显不对,应该是54哦,不然这个测试用例会直接失败。
具体实现方式
方式1:函数返回单组参数,加入现有测试列表
先修正return_param的定义,然后调用它把返回的参数组加到参数列表里:
import pytest # 修正函数定义:去掉不必要的self参数,返回对应test_input和expected的元组 def return_param(): return "7*8", 56 @pytest.mark.parametrize("test_input,expected", [ ("3+5", 8), ("2+4", 6), ("6*9", 54), # 修正错误的预期值 return_param() # 调用函数,获取它返回的参数组 ]) def test_eval(test_input, expected): assert eval(test_input) == expected
方式2:函数返回多组参数,批量导入
如果你的函数要生成多组测试数据,还可以用解包运算符*把所有参数组批量导入,或者直接把函数作为参数化的数据源:
批量导入到现有测试列表
import pytest def generate_multiple_params(): # 返回包含多组参数的列表 return [ ("7*8", 56), ("10-3", 7), ("12/3", 4) ] @pytest.mark.parametrize("test_input,expected", [ ("3+5", 8), ("2+4", 6), ("6*9", 54), *generate_multiple_params() # 解包函数返回的所有参数组 ]) def test_eval(test_input, expected): assert eval(test_input) == expected
直接用函数作为参数数据源
如果所有测试数据都由函数生成,还可以直接把函数调用传给parametrize:
import pytest def generate_all_params(): return [ ("3+5", 8), ("2+4", 6), ("6*9", 54), ("7*8", 56) ] # 直接使用函数返回的列表作为参数化数据源 @pytest.mark.parametrize("test_input,expected", generate_all_params()) def test_eval(test_input, expected): assert eval(test_input) == expected
关键要点
- 函数不需要
self参数,除非它是类的成员方法; - 必须调用函数(加上
())才能获取它的返回值,否则传递的是函数对象本身,会导致参数不匹配; - 如果函数返回多组参数,用
*解包可以轻松把它们加入现有的参数列表中。
内容的提问来源于stack exchange,提问作者jacobcan118
相关产品推荐
相关产品推荐

