1. 程式人生 > >Python實戰之unittest使用詳解

Python實戰之unittest使用詳解

python unittest

一 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 節。


Python實戰之unittest使用詳解