2016-02-05 23 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'