如何导入用于继承的测试基类,避免其被识别为测试用例执行
解决方案
以下方案均无需修改现有导入写法,兼容nose、pytest、unittest三类运行器:
方案1:给基类设置__test__动态属性(兼容性最好)
在基类Foo的定义处添加如下逻辑,仅当类本身是Foo时标记为非测试类,子类不受影响:
import unittest class Foo(unittest.TestCase): @classmethod @property def __test__(cls): # 仅基类本身返回False,子类均返回True return cls is not Foo # 你的通用测试方法写在这里
所有主流测试运行器都会识别__test__属性,值为False时跳过该类的执行,该逻辑不会被子类继承后覆盖规则,子类可正常被识别为测试类。
方案2:将基类设为抽象基类(代码侵入最小)
通过Python自带的abc模块将Foo标记为抽象基类,测试运行器默认不会执行抽象类作为测试用例:
import unittest from abc import ABCMeta class Foo(unittest.TestCase, metaclass=ABCMeta): # 你的通用测试方法写在这里 # 无需定义任何抽象方法即可生效
子类继承Foo后会自动成为具体类,可正常被识别执行。
方案3:全局配置测试运行器过滤规则(完全无代码侵入)
无需修改任何业务代码,仅修改测试运行器的全局配置文件即可:
- pytest:在项目根目录的
pytest.ini中添加如下配置[pytest] python_classes = !Foo Test* - nose:在项目根目录的
setup.cfg中添加如下配置[nosetests] exclude-test=Foo - unittest:自定义测试加载器过滤
Foo类,示例代码如下:import unittest from unittest.loader import TestLoader class FilteredTestLoader(TestLoader): def getTestCaseNames(self, testCaseClass): if testCaseClass.__name__ == "Foo": return [] return super().getTestCaseNames(testCaseClass) if __name__ == "__main__": unittest.main(testLoader=FilteredTestLoader())
内容的提问来源于stack exchange,提问作者studioj
相关产品推荐
相关产品推荐

