Python實戰之unittest使用詳
- 2020 年 1 月 8 日
- 筆記
一 unittest是什麼?
unittest是python內置的單元測試框架,具備編寫用例、組織用例、執行用例、輸出報告等自動化框架的條件。 使用unittest前需要了解該框架的五個概念: 即test case,test suite,testLoader,test runner,test fixture。
test case :一個完整的測試單元,執行該測試單元可以完成對某一個問題的驗證,完整體現在: 測試前環境準備(setUp),執行測試程式碼(run),以及測試後環境還原(tearDown); test suite :多個測試用例的集合,測試套件或測試計劃; testLoader :載入TestCase到TestSuite中的,其中loadTestsFrom__()方法用於尋找TestCase, 並創建它們的實例,然後添加到TestSuite中,返回TestSuite實例; test runner :執行測試用例,並將測試結果保存到TextTestResult實例中,包括運行了多少測試用例, 成功了多少,失敗了多少等資訊; test fixture:一個測試用例的初始化準備及環境還原,主要是setUp() 和 setDown()方法;
二 unitest的工作原理
通過unittest類調用分析,可將框架的工作流程概況如下:
編寫TestCase,由TestLoader載入TestCase到TestSuite,然後由TextTestRunner來運行TestSuite, 最後將運行的結果保存在TextTestResult中。
三 unittest實戰舉例
了解了unittest框架的五大概念和工作流程後,接下來舉例如何使用該框架對模組進行單元測試。
3.1 待測模組myfunc
myfunc包含三個函數:isprime(),add(),divide(),如下:

3.2 unitest編寫測試用例
使用unittest對myfunc進行單元測試,首先需要導入unitest框架和待測模組myfunc,定義的測試用例方法類 需要繼承unittest.TestCase,且測試用例方法是以test開頭作為標識,用例的執行結果以assetxxx斷言結果 決定,如果斷言返回為false,將拋出assetError異常。測試用例程式碼如下:

一些常用的斷言方法如下,更多斷言方法請查看unittest自帶文檔:

從上面的設計的測試用例執行結果及對自動化測試的要求,需要考慮以下4個問題,及給出unitest框架中 的解決方法。
3.3 框架如何解決自動化需求的4個問題
3.3.1 問題1: 如何控制用例執行順序
在unittest中,用例是以test開頭的方法定義的,默認執行順序是根據用例名稱升序進行,如上面的用例, 實際執行順序為:test_add-->test_divide-->test_is_prime,而不是用例定義的先後順序。 在unittest中解決用例執行順序的問題是使用TestSuite,程式碼如下:

3.3.2 問題2:如何讓多個用例共用setup、teardown
unittest的setup、teardown會在每個用例執行前後執行一次,如上面測試用例類中有3個測試用例, 那麼每個用例執行前會執行setup,執行後會執行teardown,即setup、teardown總共會調用三次, 但考慮實際自動化測試場景,多個用例只需執行一次setup,全部用例執行完成後,執行一次teardown, 針對該種場景,unittest的處理方法是使用setupclass、teardownclass,注意@classmethod的使用, 如下:

3.3.3 問題3:如何跳過用例
在自動化測試中,經常會遇到挑選用例的情況,在unittest中的解決方法是使用skip裝飾器, 其中skip裝飾器主要有3種:unittest.skip(reason)、unittest.skipIf(condition,reason)、 unittest.skipUnless(condition,reason),即在滿足condition條件下跳過該用例, reason用於描述跳過的原因,實例程式碼如下:

3.3.4 問題4:如何生成html格式的測試報告
Unittest中默認生成的報告格式為txt,如果想生成html格式的報告,可以使用HtmlTestRunner模組, 安裝後導入該模組,使用HTMLTestRunner代替默認的TextTestRunner()執行測試用例即可。實例程式碼如下:

其他資源:
關於python unittest單元框架的影片講解,請參看:http://i.youku.com/weiworld521 第 23 節。