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

如何导入用于继承的测试基类,避免其被识别为测试用例执行

解决方案

以下方案均无需修改现有导入写法,兼容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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:54:03