1. 程式人生 > >python如何使用unit test 模組

python如何使用unit test 模組

Python內部自帶了一個單元測試的模組,pyUnit也就是我們說的:unittest

TestCase:所有測試用例的基本類,給一個測試方法的名字,就會返回一個測試用例例項;
 
TestSuit:組織測試用例的例項,支援測試用例的新增和刪除,最終將傳遞給  testRunner進行測試執行;
 
TextTestRunner:進行測試用例執行的例項,其中Text的意思是以文字形式顯示測試結果。測試的結果會儲存到TextTestResult例項中,包括運行了多少測試用例,成功了多少,失敗了多少等資訊;
 
TestLoader:用來載入TestCase到TestSuite中的,其中有幾個  loadTestsFrom__()方法,就是從各個地方尋找TestCase,建立它們的例項,然後add到TestSuite中,再返回一個TestSuite例項;

在採用PyUnit這一單元測試框架後,用於測試的程式碼做了相應的改動:

  • 用import語句引入unittest模組。
  • 讓所有執行測試的類都繼承於TestCase類,可以將TestCase看成是對特定類進行測試的方法的集合。
  • 在setUp()方法中進行測試前的初始化工作,並在tearDown()方法中執行測試後的清除工作,setUp()和tearDown()都是TestCase類中定義的方法。
  • 定義測試用例,名字以test開頭。
    一個測試用例應該只測試一個方面,測試目的和測試內容應很明確。主要是呼叫assertEqual、assertRaises等斷言方法判斷程式執行結果和預期值是否相符。
  • 提供名為suite()的全域性方法,PyUnit在執行測試的過程呼叫suit()方法來確定有多少個測試用例需要被執行,可以將TestSuite看成是包含所有測試用例的一個容器。
  • 呼叫unittest.main()啟動測試
  • 如果測試未通過,會輸出相應的錯誤提示。如果測試全部通過則不顯示任何東西,這時可以新增-v引數顯示詳細資訊。

利用python進行測試時,測試用例的載入方式有2種:

  一種是通過unittest.main()來啟動所需測試的測試模組;
  一種是新增到testsuite集合中再載入所有的被測試物件,而testsuit裡存放的就是所需測試的用例

雖然看起來有點複雜,但PyUnit使得所有的Python程式設計師都可以使用同樣的單元測試方法,測試過程不再是雜亂無章的了,而是在同一規範指導下進行的有序行為,這就是使用PyUnit這一自動單元測試框架所帶來的最大好處。

好了,現在進入我們的學習重點,PyUnit模組的使用!

編寫測試用例(TestCase)並將它們組織成測試用例集(TestSuite)的最終目的只有一個:實施測試並獲得最終結果。PyUnit使用TestRunner類作為測試用例的基本執行環境,來驅動整個單元測試過程。Python開發人員在進行單元測試時一般不直接使用TestRunner類,而是使用其子類TextTestRunner來完成測試,並將測試結果以文字方式顯示出來:

runner = unittest.TextTestRunner()
  runner.run(suite)

使用TestRunner來實施測試的例子如例7所示,

PyUnit模組中定義了一個名為main的全域性方法,使用它可以很方便地將一個單元測試模組變成可以直接執行的測試指令碼,main()方法使用TestLoader類來搜尋所有包含在該模組中的測試方法,並自動執行它們。如果Python程式設計師能夠按照約定(以test開頭)來命名所有的測試方法,那就只需要在測試模組的最後加入如下幾行程式碼即可:

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

使用main()方法來實施測試的例子如例8所示:

8. main_runner.py
from widget import Widget
import unittest
# 執行測試的類
classWidgetTestCase(unittest.TestCase):
defsetUp(self):
        self.widget = Widget()
    deftearDown(self):
        self.widget.dispose()
        self.widget =None
deftestSize(self):
        self.assertEqual(self.widget.getSize(), (40, 40))
    deftestResize(self):
        self.widget.resize(100, 100)
        self.assertEqual(self.widget.getSize(), (100, 100))   
# 測試
if __name__ == "__main__":
    unittest.main()