Unittest核心工作原理
最核心的四個(gè)概念:test case ,test suite,test runner,test fixture
一個(gè)TestCase實(shí)例就是一個(gè)測試用例
測試用例:指一個(gè)完成的測試流程,包括測試前環(huán)境搭建(setup),執(zhí)行測試代碼(run),測試后環(huán)境還原(tearDown)。
一個(gè)測試用例是一個(gè)完整的測試單元,執(zhí)行這個(gè)單元,驗(yàn)證某個(gè)問題
多個(gè)測試用例集合在一起就是TestSuite,并且TestSuite可以嵌套TestSuite
TestLoader用來加載TestCase到TestSuite中,loadTestsFrom_()方法,是從各個(gè)地方查找TestCase,創(chuàng)建它們的實(shí)例,然后add到TestSuite中,再返回一個(gè)TestSuite實(shí)例
TextTestRunner用來執(zhí)行測試用例,其中run(test)會(huì)執(zhí)行TestSuite/TestCase中的run(result)方法。測試結(jié)果保存到TextTestResult實(shí)例中,包括運(yùn)行了多少測試用例,成功和失敗各有多少等信息
對(duì)一個(gè)測試用例環(huán)境的搭建和銷毀是一個(gè)fixture
一個(gè)class繼承了unittest.TestCase,就是一個(gè)測試用例,如果有很多以test開頭的方法,每個(gè)方法在load的時(shí)候便會(huì)生成一個(gè)TestCase實(shí)例,如:一個(gè)class中有四個(gè)test_xxx方法,最后在load到suite中也會(huì)有四個(gè)測試用例
整個(gè)流程如下:
寫好TestCase,然后由Testloader加載TestCase到TestSuite,然后由TextTestRunner來運(yùn)行TestSuite,運(yùn)行的結(jié)果保存在TextTestResult中
通過命令或者unittest.main()執(zhí)行時(shí),main會(huì)調(diào)用TextTestRunner中的run來執(zhí)行,或者直接通過TextTestRunner來執(zhí)行用例
說明:在runner執(zhí)行時(shí),默認(rèn)將結(jié)果輸出到控制臺(tái),可以設(shè)置輸出到文件中,然后在文件中查看;另外HTMLTestRunner也同樣是執(zhí)行用的,它可以將結(jié)果輸出到html中,它跟TextTestRunner是一樣的,但是它生成的報(bào)告更清晰好看
注意:1.運(yùn)行時(shí)不要把文件放在中文目錄下 2.編碼縮進(jìn)格式要注意否則會(huì)有錯(cuò)誤,該縮進(jìn)的要縮進(jìn),該頂格的要頂格寫
關(guān)鍵字解釋
TestLoader:測試用例加載器,其包括多個(gè)加載測試用例的方法。返回一個(gè)測試套件
loadTestsFromModule(self,module)--根據(jù)給定的模塊實(shí)例來獲取測試用例套件
loadTestsFromTestCase(self,testCaseClass)--根據(jù)給定的測試類,獲取其中的所有測試方法,并返回一個(gè)測試套件
loadTestsFromName(self,name,module=None)
--根據(jù)給定的字符串來獲取測試用例套件,字符串可以是模塊名,測試類名,測試類中的測試方法名,或者一個(gè)可調(diào)用的是實(shí)例對(duì)象
這個(gè)實(shí)例對(duì)象返回一個(gè)測試用例或一個(gè)測試套件
loadTestsFromNames(self,names,module=None) --和上面功能相同,只不過接受的是字符串列表
setUp()和tearDown()兩個(gè)方法(其實(shí)是重寫了TestCase的這兩個(gè)方法),這兩個(gè)方法在每個(gè)測試方法執(zhí)行前以及執(zhí)行后執(zhí)行一次,setUp用來為測試準(zhǔn)備環(huán)境,tearDown用來清理環(huán)境,已備之后的測試。
setUpClass()與tearDownClass():如果想要在所有case執(zhí)行之前準(zhǔn)備一次環(huán)境,并在所有case執(zhí)行結(jié)束之后再清理環(huán)境,我們可以用setUpClass()與tearDownClass():
關(guān)鍵字的關(guān)系圖
總結(jié)如下:
1.unittest是Python自帶的單元測試框架,我們可以用其來作為我們自動(dòng)化測試框架的用例組織執(zhí)行框架。
2.unittest的流程:寫好TestCase,然后由TestLoader加載TestCase到TestSuite,然后由TextTestRunner來運(yùn)行TestSuite,運(yùn)行的結(jié)果保存在TextTestResult中,我們通過命令行或者unittest.main()執(zhí)行時(shí),main會(huì)調(diào)用TextTestRunner中的run來執(zhí)行,或者我們可以直接通過TextTestRunner來執(zhí)行用例。
3.一個(gè)class繼承unittest.TestCase即是一個(gè)TestCase,其中以test開頭的方法在load時(shí)被加載為一個(gè)真正的TestCase。
4.verbosity參數(shù)可以控制執(zhí)行結(jié)果的輸出,0是簡單報(bào)告、1是一般報(bào)告、2是詳細(xì)報(bào)告。
5.可以通過addTest和addTests向suite中添加case或suite,可以用TestLoader的loadTestsFrom__()方法。
6.用setUp()、tearDown()、setUpClass()以及tearDownClass()可以在用例執(zhí)行前布置環(huán)境,以及在用例執(zhí)行后清理環(huán)境
7.我們可以通過skip,skipIf,skipUnless裝飾器跳過某個(gè)case,或者用TestCase.skipTest方法。
8.參數(shù)中加stream,可以將報(bào)告輸出到文件:可以用TextTestRunner輸出txt報(bào)告,以及可以用HTMLTestRunner輸出html報(bào)告。