Pytest运行报错fixture arg1未找到 如何正确向fixture函数传参
报错根因
Pytest 对fixture函数的参数有固定解析规则:fixture定义时声明的所有入参,默认会被Pytest识别为其他已注册的fixture,按名称匹配自动注入。你在func1的入参中写arg1、arg2时,Pytest会去fixture注册表查找对应名称的fixture,查找失败就会抛出fixture arg1 not found的错误。
你提到把arg1、arg2定义为全局变量后代码能运行,本质是fixture函数执行时从Python全局作用域读取到了这两个变量,并不是Pytest完成了参数传递,这种写法耦合度高,全局变量容易被意外修改,不推荐在测试项目中使用。
向fixture传递参数的常用正确方案
根据使用场景不同,选对应实现即可:
方案1:fixture内部定义固定参数
适合参数值固定、不需要动态调整的场景,直接把参数写在fixture内部即可,不需要额外声明入参:import pytest @pytest.fixture(scope="module") def func1(): arg1 = 1 arg2 = 3 return arg1 + arg2 def test_func1(func1): assert func1 == 4方案2:通过
indirect参数+内置request对象动态传参
适合需要在用例层面灵活给fixture传递不同参数值的场景,是Pytest官方支持的fixture传参方式:import pytest @pytest.fixture(scope="module") def func1(request): # 通过request.param获取外部传入的参数 arg1, arg2 = request.param return arg1 + arg2 # 在用例的parametrize标记中指定indirect=True,参数会先传给fixture处理 @pytest.mark.parametrize("func1", [(1, 3), (2, 2)], indirect=True) def test_func1(func1): assert func1 == 4如果需要所有调用该fixture的用例都使用固定的参数组遍历,可以直接在fixture装饰器上配置
params参数,不需要在每个用例上重复标记:import pytest # 配置params后,所有调用func1的用例都会自动遍历每一组参数 @pytest.fixture(scope="module", params=[(1, 3), (2, 2)]) def func1(request): arg1, arg2 = request.param return arg1 + arg2 def test_func1(func1): assert func1 == 4方案3:将参数本身定义为可复用fixture
如果arg1、arg2是多个测试逻辑都要用到的公共值/动态逻辑,可以把它们也定义成独立fixture,Pytest会按名称自动注入到依赖它的其他fixture中:import pytest @pytest.fixture(scope="module") def arg1(): return 1 @pytest.fixture(scope="module") def arg2(): return 3 # 这里的arg1、arg2会被Pytest自动注入为上面两个fixture的返回值 @pytest.fixture(scope="module") def func1(arg1, arg2): return arg1 + arg2 def test_func1(func1): assert func1 == 4
内容的提问来源于stack exchange,提问作者user59419
相关产品推荐
相关产品推荐

