2016-02-05 22 views
2

我有这个普通的香草单元测试,它按预期工作,只要我省略构造函数。Python单元测试:具有自己的构造函数的测试用例类在标准库中失败

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方法来共享?

+3

你正在为一个没有处理参数的方法进行子类化。你需要让'__init__'接受任意参数(通常是'* args,** kwargs')并将它们传递给超类的实现。 – jonrsharpe

+1

@jonrsharpe:Yesss,谢谢 – guidot

回答

2

我会使用unittest.TestCase的setUp()和tearDown()方法而不是init。除了使用setUp方法之外,你只要做同样的事情。

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参数,并且没有它的构造函数,因此您遇到的失败。

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__(就像2achary建议)时setUp方法究竟意味着这一目的。

class Instance_test(unittest.TestCase): 

    def setUp(self): 
     self.attribute = 'new'