unittest基本原理:
♦整個平台的搭建使用的是python的unittest測試框架,這里簡單介紹下unittest模塊的簡單應用。
♦unittest是python的標准測試庫,相比於其他測試框架是python目前使用最廣的測試框架。
♦unittest有四個比較重要的概念是test fixture, test case, test suite, test runner, 。
♦test fixture:The test fixture is everything we need to have in place to exercise the sut。簡單來說就是做一些測試過程中需要准備的東西,比如創建臨時的數據庫,文件和目錄等,其中 setUp() 和 setDown() 是最常用的方法
♦test case:用戶自定義的測試case的基類,調用run()方法,會依次調用setUP方法、執行用例的方法、tearDown()方法。
♦test suite:測試用例集合,可以通過addTest()方法手動增加Test Case,也可通過TestLoader自動添加Test Case,TestLoader在添加用例時,會沒有順序。
♦test runner:運行測試用例的驅動類,可以執行TestCase,也可執行TestSuite。執行后TestCase和Testsuite會自動管理TestResult。
其他的unitest的屬性:
♦unittest.skip():裝飾器,當運行用例時,有些用例可能不想執行等,可用裝飾器暫時屏蔽該條測試用例。一種常見的用法就是比如說想調試某一個測試用例,想先屏蔽其他用例就可以用裝飾器屏蔽。
@unittest.skip(reason): skip(reason)裝飾器:無條件跳過裝飾的測試,並說明跳過測試的原因。
@unittest.skipIf(reason): skipIf(condition,reason)裝飾器:條件為真時,跳過裝飾的測試,並說明跳過測試的原因。
@unittest.skipUnless(reason): skipUnless(condition,reason)裝飾器:條件為假時,跳過裝飾的測試,並說明跳過測試的原因。
@unittest.expectedFailure(): expectedFailure()測試標記為失敗。
2.TestCase類的屬性如下:
♦setUp():setUp()方法用於測試用例執行前的初始化工作。如測試用例中需要訪問數據庫,可以在setUp中建立數據庫連接並進行初始化。如測試用例需要登錄web,可以先實例化瀏覽器。
♦tearDown():tearDown()方法用於測試用例執行之后的善后工作。如關閉數據庫連接。關閉瀏覽器。
♦assert*():一些斷言方法:在執行測試用例的過程中,最終用例是否執行通過,是通過判斷測試得到的實際結果和預期結果是否相等決定的。
assertEqual(a,b,[msg='測試失敗時打印的信息']):斷言a和b是否相等,相等則測試用例通過。
assertNotEqual(a,b,[msg='測試失敗時打印的信息']):斷言a和b是否相等,不相等則測試用例通過。
assertTrue(x,[msg='測試失敗時打印的信息']):斷言x是否True,是True則測試用例通過。
assertFalse(x,[msg='測試失敗時打印的信息']):斷言x是否False,是False則測試用例通過。
assertIs(a,b,[msg='測試失敗時打印的信息']):斷言a是否是b,是則測試用例通過。
assertNotIs(a,b,[msg='測試失敗時打印的信息']):斷言a是否是b,不是則測試用例通過。
assertIsNone(x,[msg='測試失敗時打印的信息']):斷言x是否None,是None則測試用例通過。
assertIsNotNone(x,[msg='測試失敗時打印的信息']):斷言x是否None,不是None則測試用例通過。
assertIn(a,b,[msg='測試失敗時打印的信息']):斷言a是否在b中,在b中則測試用例通過。
assertNotIn(a,b,[msg='測試失敗時打印的信息']):斷言a是否在b中,不在b中則測試用例通過。
assertIsInstance(a,b,[msg='測試失敗時打印的信息']):斷言a是是b的一個實例,是則測試用例通過。
assertNotIsInstance(a,b,[msg='測試失敗時打印的信息']):斷言a是是b的一個實例,不是則測試用例通過。
通過dir(unittest),我們可以看到unittest全部的屬性和方法,他們的關系如下圖所示。

♦正常調用unittest的流程是,TestLoader 自動將測試用例TestCase中加載到TestSuite里,TextTestRunner調用TestSuite的run方法,順序執行里面的TestCase中以test開頭的方法,並得到測試結果TestResult。在執行TestCase過程中,先進行SetUp()環境准備,執行測試代碼,最后tearDown()進行測試的還原。
♦其中TestLoader在加載過程中,進行添加的TestCase是沒有順序的。一個TestCase里如果存在多個驗證方法的話,會按照方法中test后方首字母的排序進行執行。
可以通過手動調用TestSuite的addTest、addTests方法來動態添加TestCase,這樣既可以確定添加用例的執行順序,也可避免TestCase中的驗證方法一定要用test開頭。
♦在搭建接口測試平台的時候,每新建一個接口的時,會自動生成一個 TestCase,選中運行單個接口時,使用TextTestRunner直接調用單個TestCase。運行多個接口時,手動給TestSuite添加TestCase,供TextTestRunner調用並生成測試結果。
一套整體的流程如下:
3.TestSuite類的屬性如下:(組織用例時需要用到):
♦addTest(): addTest()方法是將測試用例添加到測試套件中,如下方,是將test_baidu模塊下的BaiduTest類下的test_baidu測試用例添加到測試套件。
suite = unittest.TestSuite() suite.addTest(test_baidu.BaiduTest('test_baidu'))
4.TextTextRunner的屬性如下:(組織用例時需要用到):
♦run(): run()方法是運行測試套件的測試用例,入參為suite測試套件。
runner = unittest.TextTestRunner() runner.run(suite)
5.unitest的目錄結構一般如下:重要
至此unitest的全部就講完了。