pytest导入测试类时用例重复执行,有没有除别名、抽抽象类外的解决方案?
方案1:使用pytest原生的__test__属性控制测试类识别
这是pytest官方提供的标准用法,优先级高于类名匹配规则,无需调整原有类结构:
如果你可以修改TestA的代码,直接在类定义中添加__test__ = False即可:
class TestA: __test__ = False # 加这行,pytest不会将该类识别为测试类 def test_something(self): data = self._generate_some_data() assert something_about_data def _generate_some_data(self): return some_data
然后在需要执行测试的子类中显式声明__test__ = True:
from somemodule import TestA class TestB(TestA): __test__ = True # 明确标记该类为测试类 def _generate_some_data(self): return some_other_data
如果无法修改TestA的代码,也可以在导入后动态修改属性:
from somemodule import TestA TestA.__test__ = False class TestB(TestA): __test__ = True def _generate_some_data(self): return some_other_data
优点:完全符合pytest的设计规则,不属于hack,无需调整类的继承结构和命名,侵入性极低。
方案2:导入后删除命名空间中的TestA
继承完成后直接把导入的TestA从当前模块的全局命名空间中删除,pytest扫描时就不会识别到重复的类:
from somemodule import TestA class TestB(TestA): def _generate_some_data(self): return some_other_data del TestA # 加这行,清除当前模块内的TestA引用
优点:完全不需要修改原有基类代码,也不需要调整继承结构,仅需加一行代码即可解决问题。
方案3:修改pytest测试发现配置
在项目根目录的pytest.ini/pyproject.toml配置文件中调整测试类匹配规则,排除指定名称的类或者指定模块的类,比如如果所有测试基类都存放在base目录下,可以配置不扫描该目录下的测试类:
以pytest.ini为例:
[pytest] python_classes = !TestA Test*
或者忽略指定目录的测试发现:
[pytest] testpaths = tests norecursedirs = tests/base
优点:无需修改任何业务测试代码,全局生效,适合多基类复用的大型项目。
内容的提问来源于stack exchange,提问作者Miguel Alorda
相关产品推荐
相关产品推荐

