我有这个简单的vanilla单元测试,只要我省略了构造函数,它就会按预期工作。
import sys
import unittest
class Instance_test(unittest.TestCase):
def __init__(self):
super(Instance_test, self).__init__()
self.attribute = "new"
def test_something(self):
pass
def test_other(self):
self.assertTrue(True)
pass
def setUp(self):
pass
def tearDown(self):
pass
def suite():
return unittest.makeSuite(Instance_test, "test")
def main():
runner = unittest.TextTestRunner(sys.stdout)
runner.run(suite())
if __name__ == "__main__":
main()
使用构造函数获取此回溯:
Traceback (most recent call last): File "f:\gt\check.py", line 31, in main() File "f:\gt\check.py", line 28, in main runner.run(suite()) File "f:\gt\check.py", line 24, in suite return unittest.makeSuite(Instance_test, "test") File "C:\Python34\lib\unittest\loader.py", line 374, in makeSuite testCaseClass) File "C:\Python34\lib\unittest\loader.py", line 70, in loadTestsFromTestCase loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames)) File "C:\Python34\lib\unittest\suite.py", line 24, in __init__ self.addTests(tests) File "C:\Python34\lib\unittest\suite.py", line 60, in addTests for test in tests: TypeError: __init__() takes 1 positional argument but 2 were given
我有什么错误以及如何通过不同的test_xxx方法共享中心属性?
答案 0 :(得分:2)
我会使用unittest.TestCase的setUp()和tearDown()方法而不是 init 。除了使用setUp
方法之外,您可以做同样的事情。
答案 1 :(得分:1)
这种情况正在发生,因为__init__
需要多个参数,你忘了提供args和kwargs作为参数。应该是这样的 -
class Instance_test(unittest.TestCase):
def __init__(self, *args, **kwargs):
super(Instance_test, self).__init__(*args, **kwargs)
self.attribute = "new"
除此之外,当__init__
方法完全用于此目的时,为什么要覆盖setUp
(如2achary建议的那样)。
class Instance_test(unittest.TestCase):
def setUp(self):
self.attribute = 'new'
答案 2 :(得分:0)
只需将一个名为methodName
的参数添加到您自己的__init__
方法中,就可以了:
class Instance_test(unittest.TestCase):
def __init__(self, methodName='runTest'):
super(Instance_test, self).__init__(methodName=methodName)
self.attribute = "new"
...
基本TestCase.__init__
签名如下:
class TestCase(object):
def __init__(self, methodName='runTest'):
...
正如您所看到的,它需要一个额外的methodName
参数,没有它的构造函数,因此您遇到了失败。