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

Python unittest如何通过继承抽离公共方法减少测试类代码重复

公共测试方法抽离最优继承方案

直接定义继承自unittest.TestCase的公共基类,把重复的some_fun、some_fun2、some_fun3都放在基类中即可,基类的方法可以正常使用unittest的断言方法,无需额外适配:

import unittest

# 公共基类:不要定义test开头的方法,避免被unittest识别为可执行测试类
class BaseTestCase(unittest.TestCase):
    def some_fun(self, param):
        # 可正常使用unittest断言
        self.assertIsInstance(param, int)
        self.foo = param + 100
    
    def some_fun2(self, check_val):
        self.assertEqual(self.foo, check_val)
    
    def some_fun3(self):
        # 公共清理逻辑
        delattr(self, "foo")

# 子类A直接继承基类
class A(BaseTestCase):
    def setUp(self):
        self.some_fun(10) # 传A类自定义的参数
    
    def test1(self):
        self.some_fun2(110)
    
    def tearDown(self):
        self.some_fun3()

# 子类B直接继承基类
class B(BaseTestCase):
    def setUp(self):
        self.some_fun(20) # 传B类自定义的参数
    
    def test1(self):
        self.some_fun2(120)
    
    def tearDown(self):
        self.some_fun3()

该方案完全符合unittest的运行逻辑,无额外兼容成本,代码复用率最高。

__init__参数异常原因说明

这个问题是unittest的执行机制导致的:

  • unittest.TestCase的原生构造方法签名为def __init__(self, methodName: str = "runTest"),框架实例化测试类时,会自动把当前要执行的测试方法名作为第一个参数传入__init__,你收到的somefun就是当前要执行的测试方法名称。
  • 测试类的__init__是由unittest框架在setUp执行前自动调用的,你在setUp中手动调用super().__init__(A.FOO)属于二次调用构造方法,是完全错误的操作,会覆盖框架的初始化逻辑。

如果需要给测试类传递自定义参数,不要重写__init__,直接在子类定义类变量,基类通过self直接读取即可,示例如下:

import unittest

class X(unittest.TestCase):
    def test_logic(self):
        # 直接读取子类的类变量
        print(self.FOO)

class A(X):
    FOO = "SOMESTRING"

    def test_somefun(self):
        self.test_logic()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:15:06