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

Pytest:在继承类Fixture中调用super()的实现方案

解决方法

你遇到的问题有两个核心原因:

  1. pytest的fixture不能直接调用,必须由pytest在测试函数请求时自动注入;
  2. 字典的update()方法是原地修改,返回值为None,即使调用成功也会导致测试失败。

下面是两种可行的实现方式:

方案一:拆分基础配置与业务配置(推荐)

将父类中的基础配置抽成独立fixture,子类重写settings时依赖基础配置进行修改,既符合pytest的fixture机制,又能避免修改原始配置影响其他测试:

import pytest


class ParentCheckClass:
    """this parent test class is never run, it's a template"""

    @pytest.fixture
    def base_settings(self):
        return {"a": 1, "b": 2}

    @pytest.fixture
    def settings(self, base_settings):
        # 返回副本,避免子类修改污染基础配置
        return base_settings.copy()

    def test_for_a(self, settings):
        assert "a" in settings

    def test_for_c(self, settings):
        assert "c" in settings


class TestCase1(ParentCheckClass):
    @pytest.fixture
    def settings(self):
        return {"c": 3}


class TestCase2(ParentCheckClass):
    @pytest.fixture
    def settings(self, base_settings):
        # 用字典解包合并配置,简洁且不修改原始数据
        return {**base_settings, "c": 3}

方案二:复用父类fixture的另一种写法

如果不想调整父类结构,可以通过request对象获取父类的fixture实现(注意避免循环依赖):

import pytest


class ParentCheckClass:
    """this parent test class is never run, it's a template"""

    @pytest.fixture
    def settings(self):
        return {"a": 1, "b": 2}

    def test_for_a(self, settings):
        assert "a" in settings

    def test_for_c(self, settings):
        assert "c" in settings


class TestCase1(ParentCheckClass):
    @pytest.fixture
    def settings(self):
        return {"c": 3}


class TestCase2(ParentCheckClass):
    @pytest.fixture
    def settings(self, request):
        # 获取父类的settings fixture实例
        parent_settings = request.getfixturevalue("settings")
        # 复制并修改配置
        updated_settings = parent_settings.copy()
        updated_settings.update({"c": 3})
        return updated_settings

注意:方案二中如果子类重写了settings,request.getfixturevalue会优先获取当前类的fixture,可能导致循环依赖,因此方案一的拆分方式更安全、易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:02:53