如何使用python unittest与__init__方法运行多个测试用例
问题根因
- 重写
TestCase子类的__init__方法时,调用父类构造函数没有透传*args、**kwargs参数。unittest框架加载测试用例时,会将待执行的测试方法名作为构造参数传入测试类实例,参数丢失后框架无法定位到目标测试方法,就会默认查找runTest方法作为执行入口,找不到就抛出AttributeError:'TestingClass' object has no attribute 'runTest'报错。 - 手动定义
runTest方法是unittest单测试用例模式的写法,该模式下一个测试类仅会执行runTest这一个方法,其余以test_开头的标准测试方法不会被自动识别加载,因此无法运行多测试用例。 - 重写
__init__做测试资源初始化本身不符合unittest框架的设计规范,框架原生提供了setUp()前置钩子处理每个用例的初始化逻辑,不需要修改构造方法。
可直接运行的修复代码
测试文件 Calculator_test.py
# Python单元测试模块 import unittest # 导入待测试的计算器类 import Calculator_steps as CalculatorClass class TestingClass(unittest.TestCase): """ 继承unittest.TestCase的测试基础类 """ def setUp(self): # 每个测试方法执行前自动初始化计算器实例,无需重写__init__ self.calculator = CalculatorClass.Calculator() # 需求1:验证计算器仅接受整数输入 def test_only_accept_whole_numbers(self): with self.assertRaises(Exception): self.calculator.addNumbers('5.66,3.44') # 需求2:验证计算器不接受非数值输入 def test_reject_non_numeric_value(self): with self.assertRaises(Exception): self.calculator.addNumbers('5,6,e') if __name__ == '__main__': unittest.main(verbosity=2)
待测试文件 Calculator_steps.py 保持原有逻辑即可,按需补全计算逻辑
class Calculator: def addNumbers(self,numberlist): total = "" # 后续补全数值校验、求和逻辑即可 return total
特殊场景说明
如果确实有重写__init__方法的需求,必须将构造参数透传给父类,否则框架无法正常加载用例,写法参考:
def __init__(self, *args, **kwargs): # 必须传入*args、**kwargs,不能留空 super(TestingClass, self).__init__(*args, **kwargs) self.calculator = CalculatorClass.Calculator()
运行验证
直接执行测试文件,或者在命令行运行以下命令,即可看到两个测试用例分别执行的结果:python -m unittest Calculator_test.py -v
内容的提问来源于stack exchange,提问作者Yasan Lakmal
相关产品推荐
相关产品推荐

