You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何继承pytest基类并覆写fixture,解决子类fixture未生效问题

解决pytest子类覆写fixture不生效的问题

这是因为pytest的fixture依赖绑定是在测试方法定义时确定的,基类的test_settings方法在定义时,关联的是基类里的base_settings fixture,子类继承测试方法后并不会自动替换它的fixture依赖,所以才会用基类返回None的版本。

下面是两种可行的解决办法:

方法一:动态获取当前上下文的fixture

修改基类的测试方法,通过request fixture动态获取当前测试上下文的base_settings,这样子类运行时会自动加载自身覆写的fixture:

# test_base.py
import pytest

class TestBase:
    @pytest.fixture(scope="module")
    def base_settings(self):
        return None

    def test_settings(self, request):
        # 动态获取当前类/模块下的base_settings fixture
        settings = request.getfixturevalue("base_settings")
        assert settings["value_a"] > settings["value_b"]

子类代码保持不变:

# test_my_class.py
import pytest
from test_base import TestBase

class TestMyClass(TestBase):
    @pytest.fixture(scope="module")
    def base_settings(self):
        return {"value_a": 4, "value_b": 3}

方法二:将fixture定义为模块级

把基类的fixture移到模块层面,子类所在模块重新定义同名fixture,pytest会优先使用当前模块的fixture:

# test_base.py
import pytest

@pytest.fixture(scope="module")
def base_settings():
    return None

class TestBase:
    def test_settings(self, base_settings):
        assert base_settings["value_a"] > base_settings["value_b"]

子类模块中重新定义fixture:

# test_my_class.py
import pytest
from test_base import TestBase

@pytest.fixture(scope="module")
def base_settings():
    return {"value_a": 4, "value_b": 3}

class TestMyClass(TestBase):
    pass

两种方法都能让子类的测试用例正确使用覆写后的fixture,根据你的项目结构选择即可。

内容的提问来源于stack exchange,提问作者phb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:35:15