如何使用Pytest参数化测试函数?如何向测试函数传递列表数据?
解决Pytest测试函数传递列表数据的问题
嘿,我来帮你搞定这个问题!你现在的代码里有几个小问题导致失败,我先给你拆解下,再给你正确的实现方式~
你的代码里的问题点
- Fixture没返回数据:你定义的
List_of_Numbersfixture没有return语句,这个fixture实际上不会返回任何内容,外面根本拿不到你定义的列表。而且你在parametrize里直接用了list,这是Python的内置类型,不是你定义的变量,肯定会报错。 - 列表推导式写错了:
[i for item in list]里的i根本没定义,应该是[item for item in 你的列表],但因为fixture没返回,这步也走不通。 - 多余的
eval调用:eval(number%2)完全没必要,number是整数,number%2直接就能得到0或1,用eval反而会报错(因为它要求参数是字符串表达式)。
正确的实现方式
方式一:直接在parametrize里传入列表(最简单)
如果你的测试数据只在这一个测试函数里用,直接把列表写进parametrize就行:
import pytest # 直接把测试列表作为参数化数据源 @pytest.parametrize("number", [1,2,3,4,5,6,7,8]) def test_eval(number): # 这里断言数字是偶数,要是测奇数就改成 == 1 assert number % 2 == 0
方式二:用Fixture复用测试数据
如果这个列表需要在多个测试函数里用,或者需要动态生成(比如从文件读取),可以用Fixture配合pytest-lazy-fixture插件来实现:
首先安装插件:
pip install pytest-lazy-fixture
然后写代码:
import pytest @pytest.fixture def list_of_numbers(): # 一定要return列表,不然fixture没返回值 return [1,2,3,4,5,6,7,8] # 用lazy_fixture把fixture的返回值作为参数化数据源 @pytest.mark.parametrize("number", pytest.lazy_fixture("list_of_numbers")) def test_eval(number): assert number % 2 == 0
方式三:模块级变量复用(无需插件)
如果不想装插件,也可以把测试数据定义成模块级别的变量,这样多个测试函数都能复用:
import pytest # 模块级别定义测试数据列表 TEST_NUMBERS = [1,2,3,4,5,6,7,8] @pytest.parametrize("number", TEST_NUMBERS) def test_eval(number): assert number % 2 == 0
运行效果
现在运行pytest的话,每个数字都会单独执行一次测试:偶数会通过断言,奇数会失败,完全符合你的测试预期~
内容的提问来源于stack exchange,提问作者A B
相关产品推荐
相关产品推荐

