我試圖通過對unittest.testcase類進行子分類來創建自定義單元測試框架,但在處理__init__
方法時似乎犯了一個錯誤。在python中重載unittest.testcase
我不明白爲什麼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, *args, **kwargs):
print('ComplexTest.__init__')
super(BasicTest, self).__init__(*args, **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, *args, **kwargs):
print('TestValueFunctions.__init__')
super(test_framework.ComplexTest, self).__init__(*args, **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, self).__init__(*args, **kwargs)
File "D:\MyDev\ljs_app\trunk\examples\python\unittest\test_framework.py", line 6, in __init__
super(unittest.TestCase, self).__init__(*args, **kwargs)
TypeError: object.__init__() takes no parameters
'super'的一大優點是你不必**必須顯式聲明超類。正如您在錯誤中看到的那樣,您正在使用該代碼調用'object .__ init__'而不是'TestCase .__ init__'。 – Bakuriu
只有在Python 3中,你可以省略'super'的類參數。 – chepner