
Python Tutorial 第六堂(1)使用 unittest 單元測試
Python Tutorial 第五堂(3)使用 assert 與 doctest << 前情
測試一個單元,基本上要與其它的單元獨立,否則你會在同時測試兩個單元的正確性,或是兩個單元之間的合作行為。就軟體測試而言,單元測試通常指的是測試某個函式(或方法),你給予該函式某些輸入,預期該函式會產生某種輸出,例如傳回預期的值、產生預期的檔案、新增預期的資料等。
測試案例對於測試案例的撰寫, import unittest import calculator class CalculatorTestCase(unittest.TestCase): def setUp(self): self.args = (3, 2) def tearDown(self): self.args = None def test_plus(self): expected = 5; result = calculator.plus(*self.args); self.assertEquals(expected, result); def test_minus(self): expected = 1; result = calculator.minus(*self.args); self.assertEquals(expected, result); 每個測試必須定義在一個 test 名稱為開頭的方法中,一個 測試設備許多單元測試經常藬用相同的測試設備,你可以在 一個實際情境可以像是在 測試套件根據測試的需求不同,你可能會想要將不同的測試組合在一起,例如, suite = unittest.TestSuite() suite.addTest(CalculatorTestCase('test_plus')) suite.addTest(CalculatorTestCase('test_minus')) 或者是使用一個 tests = ['test_plus', 'test_minus'] suite = unittest.TestSuite(map(CalculatorTestCase, tests)) 如果想要自動載入某個 unittest.TestLoader().loadTestsFromTestCase(CalculatorTestCase) 你可以任意組合測試,例如,將某個測試套件與某個 suite2 = unittest.TestSuite() suite2.addTest(suite) suite2.addTest(OtherTestCase('test_orz')) 也可以將許多測試套件再全部組合為另一個測試套件: suite1 = module1.TheTestSuite() suite2 = module2.TheTestSuite() alltests = unittest.TestSuite([suite1, suite2]) 測試執行器你可以在程式碼中直接使用 suite = (unittest.TestLoader() .loadTestsFromTestCase(CalculatorTestCase)) unittest.TextTestRunner(verbosity=2).run(suite) 或者是透過 unittest.main(verbosity=2) 一個執行的畫面如下: 如果不想透過程式碼定義,也可以在命令列中使用 python -m unittest test_module1 test_module2 python -m unittest test_module.TestClass python -m unittest test_module.TestClass.test_method 如果想得到更詳細的測試資訊,可以加上 python -m unittest -v test_module 想得知 python -m unittest -h 練習 15:重構與單元測試重構是改造既有程式的過程,對於重構的概念與技巧,可以參考 《Refactoring – Improving the Design of Existing Code》 這本書,中文翻譯為 《重構 — 改善既有程式的設計》,侯捷 老師將 中文版翻譯的前六章開放下載,雖然程式碼示範是使用 Java,不過就重構過程的學習來說,非常值得閱讀: 接下來的練習,就是利用該書一開始的影片出租店範例,不過我將之改成了 Python 版本,在 Lab 檔案的 exercises/exercise15 中,有個 dvdlib.py,就相當於該書第一章一開始的範例程式。 我們要重構的是 重構之前的類別圖是這樣的: 重構之後的類別圖則是: 別忘了,你得在每次的重構之前,先寫好測試,重構後執行測試,確保你沒有破壞了什麼,練習的過程中你會發現,因為有測試確保了功能不破壞,你會更有信心進行重構。 (當然,配合版本控制系統的話,會是更好的方式!) |