Tôi đang cố gắng tạo một khung kiểm tra đơn vị tùy chỉnh bằng cách phân loại lớp unittest.testcase nhưng dường như mắc lỗi khi xử lý phương thức __init__
.quá tải unittest.testcase trong python
Tôi không thể hiểu tại sao hàm tạo của ComplexTest
không được gọi trước một trong BasicTest
và ngoại lệ cũng có vẻ liên quan đến các nhà xây dựng của tôi.
Tôi khá mới đối với Python nên mọi trợ giúp về cách giải quyết vấn đề cụ thể này hoặc các kiến trúc thay thế cho trường hợp sử dụng của tôi sẽ được chào đón nhiều nhất.
Cảm ơn bạn!
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) khi bây giờ cố gắng chạy này, tôi thấy chồng sau
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
Một trong những lợi thế lớn của 'super' là bạn ** không ** phải nêu rõ lớp cha. Như bạn thấy trong các lỗi bạn đang gọi 'đối tượng .__ init__' thay vì' TestCase .__ init__' với mã đó. – Bakuriu
Chỉ trong Python 3 bạn có thể bỏ qua đối số lớp thành 'super'. – chepner