2012-12-26 61 views
29

我有單元測試代碼如下所示:Python單元測試 - setUpClass()給我帶來麻煩 - 爲什麼我不能像這樣繼承?

import unittest 

class MyUnitTest(unittest.TestCase): 
    def setUpClass(self): 
     do_something_expensive_for_all_sets_of_tests() 

class MyFirstSetOfTests(MyUnitTest): 
    def setUpClass(self): 
     super(MyFirstSetOfTests, self).setUpClass() 
     do_something_expensive_for_just_these_first_tests() 

    def test_one(self): 
     ... 

    def test_two(self): 
     ... 

class MySecondSetOfTests(MyUnitTest): 
    def setUpClass(self): 
     super(MySecondSetOfTests, self).setUpClass() 
     do_something_expensive_for_just_these_second_tests() 

    def test_one(self): 
     ... 

    def test_two(self): 
     ... 

if __name__ == '__main__': 
    unittest.main() 

當我嘗試運行這段代碼,我得到這樣的錯誤:

====================================================================== 
ERROR: setUpClass (__main__.MyFirstSetOfTests) 
---------------------------------------------------------------------- 
TypeError: unbound method setUpClass() must be called with MyFirstSetOfTests instance as first argument (got nothing instead) 

---------------------------------------------------------------------- 

回答

48

setUpClass必須是一個類的方法。來自documentation

在單個類運行測試之前調用的類方法。 setUpClass時調用類作爲唯一的參數,並且必須裝飾爲classmethod()

@classmethod 高清setUpClass(CLS): ...

詳情請參閱Class and Module Fixtures

你的版本缺少@classmethod裝飾:

class MyUnitTest(unittest.TestCase): 
    @classmethod 
    def setUpClass(cls): 
     do_something_expensive_for_all_sets_of_tests() 

class MyFirstSetOfTests(MyUnitTest): 
    @classmethod 
    def setUpClass(cls): 
     super(MyFirstSetOfTests, cls).setUpClass() 
     do_something_expensive_for_just_these_first_tests() 

錯誤被拋出,因爲MyFirstSetOfTests.setUpClass()叫上的類,而不是一個實例,但沒有標註你的方法作爲classmethod,因此它沒有在自動self參數中傳遞。