單元 test.TestCase 中的測試設定和拆解

有時我們希望為每個要執行的測試準備一個上下文。setUp 方法在類中的每個測試之前執行。tearDown 在每次測試結束時執行。這些方法是可選的。請記住,TestCases 通常用於協作多重繼承,因此你應該小心在這些方法中始終呼叫 super,以便呼叫基類的 setUptearDown 方法。TestCase 的基本實現提供了空的 setUptearDown 方法,因此可以在不引發異常的情況下呼叫它們:

import unittest

class SomeTest(unittest.TestCase):
    def setUp(self):
        super(SomeTest, self).setUp()
        self.mock_data = [1,2,3,4,5]

    def test(self):
        self.assertEqual(len(self.mock_data), 5)

    def tearDown(self):
        super(SomeTest, self).tearDown()
        self.mock_data = []

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

請注意,在 python2.7 +中,還有 addCleanup 方法,它註冊在執行測試後要呼叫的函式。與 tearDown 相反,tearDown 僅在 setUp 成功時被呼叫,即使在 setUp 中出現未處理的異常,也會呼叫通過 addCleanup 註冊的函式。作為一個具體的例子,經常可以看到這種方法去除在測試執行時註冊的各種模擬:

import unittest
import some_module

class SomeOtherTest(unittest.TestCase):
    def setUp(self):
        super(SomeOtherTest, self).setUp()
        
        # Replace `some_module.method` with a `mock.Mock`
        my_patch = mock.patch.object(some_module, 'method')
        my_patch.start()

        # When the test finishes running, put the original method back.
        self.addCleanup(my_patch.stop)

以這種方式註冊清理的另一個好處是,它允許程式設計師將清理程式碼放在安裝程式碼旁邊,並在子類將忘記在 tearDown 中呼叫 super 時保護你。