pytest报ValueError:同一函数被重复应用fixture的原因排查
问题:pytest运行时出现"fixture is being applied more than once to the same function"错误
我在使用pytest编写单元测试时,定义了如下patch_s3 fixture:
@pytest.fixture def patch_s3(): # Create empty bucket bucket = s3_resource().create_bucket(Bucket=BUCKET) bucket.objects.all().delete() yield bucket.objects.all().delete()
测试函数签名为:
def test_task_asg(patch_s3, tmp_path, monkeypatch): # 测试逻辑
但运行pytest时出现如下错误:
tests/test_task_asg.py:313: in <module> @pytest.fixture home/ubuntu/miniconda/envs/pipeline/lib/python3.7/site-packages/_pytest/fixtures.py:1150: in fixture fixture_function home/ubuntu/miniconda/envs/pipeline/lib/python3.7/site-packages/_pytest/fixtures.py:1011: in __call__ "fixture is being applied more than once to the same function" E ValueError: fixture is being applied more than once to the same function
明明只在测试函数里引用了一次patch_s3,却提示重复应用,请问可能是什么原因?
可能的原因及解决方法
patch_s3被多次标记为fixture:检查你的patch_s3函数是否被@pytest.fixture装饰了多次,比如代码里不小心写了两个装饰器:@pytest.fixture @pytest.fixture def patch_s3(): # ... 你的fixture代码这种情况会让pytest认为同一个函数被重复注册为fixture,直接删除多余的装饰器即可。
fixture存在间接重复绑定:检查
patch_s3是否依赖了其他fixture,而那个fixture又反向引用了patch_s3;或者某个被test_task_asg引用的其他fixture(包括隐式依赖的fixture)内部也引用了patch_s3,导致测试函数被绑定了两次该fixture。同名fixture冲突:确认当前测试文件或导入的其他测试模块中,是否存在另一个名为
patch_s3的fixture。pytest会收集所有同名fixture并绑定到测试函数上,造成重复应用的假象,重命名冲突的fixture即可解决。pytest版本bug:你使用的是Python3.7对应的pytest版本,部分旧版本pytest在处理fixture注册时可能存在边缘场景的bug。可以尝试升级pytest到适配Python3.7的稳定版本(比如pytest<7.0,因为7.0+不再支持Python3.7),再重新运行测试。
内容的提问来源于stack exchange,提问作者code11
相关产品推荐
相关产品推荐

