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
相关产品推荐
相关产品推荐

