Pytest:在继承类Fixture中调用super()的实现方案
解决方法
你遇到的问题有两个核心原因:
- pytest的fixture不能直接调用,必须由pytest在测试函数请求时自动注入;
- 字典的
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
相关产品推荐
相关产品推荐

