類和模塊級腳手架在TestSuite中實現(xiàn)。當測試套件遇到來自新類的測試時,將調(diào)用前一個類(如果有的話)中的tearDownClass(),然后調(diào)用新類中的setUpClass()。
同樣地,如果測試來自與前一個測試不同的模塊,則運行前一個模塊的tearDownModule,然后運行新模塊的setUpModule。
在運行所有測試之后,運行最終的tearDownClass和tearDownModule。
請注意,共享腳手架與[潛在]功能(如測試并行化)不能很好地兼容,并且會破壞測試隔離。應小心使用它們。
unittest測試加載器創(chuàng)建的測試的默認順序是將來自相同模塊和類的所有測試組合在一起。這將導致每個類和模塊只調(diào)用一次setUpClass/setUpModule(諸如此類)。如果隨機化順序,以便來自不同模塊和類的測試彼此相鄰,則可以在單個測試運行中多次調(diào)用這些共享腳手架函數(shù)。
共享腳手架不適用于非標準訂購的套件。對于不希望支持共享腳手架的框架,仍然存在BaseTestSuite。
如果在其中一個共享腳手架功能期間拋出任何異常,則將測試報告為錯誤。由于沒有相應的測試實例,因此會創(chuàng)建_ErrorHolder對象(具有與TestCase相同的接口)來表示錯誤。如果你只是使用標準的unittest測試運行器,那么這個細節(jié)并不重要,但如果你是框架作者,它可能是相關(guān)的。
9.1 setUpClass和tearDownClass
這些必須作為類方法實現(xiàn):
import unittest
class Test(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls._connection = createExpensiveConnectionObject()
@classmethod
def tearDownClass(cls):
cls._connection.destroy()
如果你想在被調(diào)用的基類上使用setUpClass和tearDownClass,那么你必須自己調(diào)用它們。TestCase這部分的實現(xiàn)是空的。
如果在setUpClass期間引發(fā)異常,則不會運行類中的測試,并且不會運行tearDownClass。跳過的類不會運行setUpClass或tearDownClass。如果異常是SkipTest異常,則該類將被報告成已跳過而不是錯誤。
9.2 setUpModule和tearDownModule
這些應該作為功能實現(xiàn):
def setUpModule():
createConnection()
def tearDownModule():
closeConnection()
如果在setUpModule中引發(fā)異常,則模塊中的所有測試都不會運行,并且不會運行tearDownModule。如果異常是SkipTest異常,則模塊將被報告為已跳過而不是錯誤。