2011-02-02 31 views
2

我是單元測試mercurial集成,並有一個測試類,它目前在其setUp方法中創建了一個文件和該存儲庫的克隆的存儲庫,並在其方法中刪除了它們的tearDown方法。你可以想象,這會非常快速地得到相當的性能,特別是如果我必須爲每個測試單獨做這個。
所以我想要做的是創建文件夾,並在加載類時爲它初始化,因此類中的每個單元測試都可以使用這些存儲庫。然後,當所有測試運行時,我想刪除它們。我的setUptearDown方法然後必須注意的是兩個存儲庫在每個測試之間處於相同的狀態。如何在pyUnit中創建類範圍的測試夾具?

基本上我尋找的是一個蟒蛇相當於JUnit的@BeforeClass@AfterClass註釋。

回答

2

現在我已經通過繼承TestSuite類來完成它了,因爲標準加載器將所有測試方法封裝在定義它們的TestCase的實例中,並將它們放在TestSuite中。我有TestSuite調用第一個TestCase的before()和after()方法。這當然意味着你不能初始化你的TestCase對象的任何值,但是你可能想在你的setUp中這樣做。

測試套件看起來是這樣的:

class BeforeAfterSuite(unittest.TestSuite): 
    def run(self, result): 
     if len(self._tests) < 1: 
      return unittest.TestSuite.run(self, result) 

     first_test = self._tests[0] 
     if "before" in dir(first_test): 
      first_test.before() 
     result = unittest.TestSuite.run(self, result) 
     if "after" in dir(first_test): 
      first_test.after() 
     return result 

對於一些稍微細粒度控制我還創建自定義TestLoader這可以確保BeforeAfterSuite僅用於包裝測試方法,TestCase的對象,它看起來像這樣的:

class BeforeAfterLoader(unittest.TestLoader): 
    def loadTestsFromTestCase(self, testCaseClass): 
     self.suiteClass = BeforeAfterSuite 
     suite = unittest.TestLoader.loadTestsFromTestCase(self, testCaseClass) 
     self.suiteClass = unittest.TestLoader.suiteClass 
     return suite 

可能缺少在這裏是一個try /唯獨身邊之前和之後塊可能會失敗在套房或東西所有的測試用例。

1

Python unittest documentation

setUpClass():

在個體類運行試驗之前稱爲A類方法。 setUpClass時調用類作爲唯一的參數,並且必須作爲裝飾一類方法():

@classmethod 
def setUpClass(cls): 
... 

新的2.7版。

tearDownClass():

在個體類試驗後稱爲A類方法已經運行。 tearDownClass被作爲唯一參數調用並且必須作爲類方法()進行裝飾:

@classmethod 
def tearDownClass(cls): 
    ...