我试图通过对unittest.testcase类进行子类化来创建自定义单元测试框架,但在处理__init__方法时似乎犯了一个错误.
我无法弄清楚为什么ComplexTest的构造函数在BasicTest中的构造函数之前没有被调用,并且异常似乎也与我的构造函数有关.
我是Python的新手,所以对于如何解决这个特定问题或我的用例的替代架构的任何帮助都将是非常受欢迎的.
谢谢!
1)test_framework.py
import unittest
class BasicTest(unittest.TestCase):
def __init__(self,*args,**kwargs):
print('BasicTest.__init__')
super(unittest.TestCase,self).__init__(*args,**kwargs)
def setUp(self):
print('BasicTest.setUp')
super(unittest.TestCase,self).tearDown()
def tearDown(self):
print('BasicTest.tearDown')
super(unittest.TestCase,self).tearDown()
class ComplexTest(BasicTest):
def __init__(self,**kwargs):
print('ComplexTest.__init__')
super(BasicTest,**kwargs)
def setUp(self):
print('ComplexTest.setUp')
super(BasicTest,self).tearDown()
def tearDown(self):
print('ComplexTest.tearDown')
super(BasicTest,self).tearDown()
2)test.py
import unittest
import test_framework
class TestValueFunctions(test_framework.ComplexTest):
def __init__(self,**kwargs):
print('TestValueFunctions.__init__')
super(test_framework.ComplexTest,**kwargs)
def setUp(self):
print('TestValueFunctions.setUp')
super(test_framework.ComplexTest,self).tearDown()
self.value = 4711
def tearDown(self):
print('TestValueFunctions.tearDown')
super(test_framework.ComplexTest,self).tearDown()
def test_value(self):
print('TestValueFunctions.test_value')
self.assertEqual(self.value,4711)
if __name__ == '__main__':
unittest.main()
3)当现在尝试运行它时,我看到下面的堆栈
TestValueFunctions.__init__
BasicTest.__init__
Traceback (most recent call last):
File "D:\MyDev\ljs_app\trunk\examples\python\unittest\test.py",line 23,in <module>
unittest.main()
File "C:\Python27\lib\unittest\main.py",line 94,in __init__
self.parseArgs(argv)
File "C:\Python27\lib\unittest\main.py",line 149,in parseArgs
self.createTests()
File "C:\Python27\lib\unittest\main.py",line 155,in createTests
self.test = self.testLoader.loadTestsFromModule(self.module)
File "C:\Python27\lib\unittest\loader.py",line 65,in loadTestsFromModule
tests.append(self.loadTestsFromTestCase(obj))
File "C:\Python27\lib\unittest\loader.py",line 56,in loadTestsFromTestCase
loaded_suite = self.suiteClass(map(testCaseClass,testCaseNames))
File "D:\MyDev\ljs_app\trunk\examples\python\unittest\test.py",line 7,in __init__
super(test_framework.ComplexTest,**kwargs)
File "D:\MyDev\ljs_app\trunk\examples\python\unittest\test_framework.py",line 6,in __init__
super(unittest.TestCase,**kwargs)
TypeError: object.__init__() takes no parameters
解决方法
确实你的init方法是错误的.
class BasicTest(unittest.TestCase):
def __init__(self,**kwargs)
应该:
class BasicTest(unittest.TestCase):
def __init__(self,**kwargs):
print('BasicTest.__init__')
super(BasicTest,**kwargs)
这将在BasicTest的母类(TestCase)上调用__init__. setUp和tearDown也是如此:
class BasicTest(unittest.TestCase):
...
def setUp(self):
print('BasicTest.setUp')
super(BasicTest,self).setUp()