Unittest核心工作原理
最核心的四個(gè)概念:test case ,test suite,test runner,test fixture
一個(gè)TestCase實(shí)例就是一個(gè)測(cè)試用例
測(cè)試用例:指一個(gè)完成的測(cè)試流程,包括測(cè)試前環(huán)境搭建(setup)栗弟,執(zhí)行測(cè)試代碼(run)碰纬,測(cè)試后環(huán)境還原(tearDown)。
一個(gè)測(cè)試用例是一個(gè)完整的測(cè)試單元,執(zhí)行這個(gè)單元才睹,驗(yàn)證某個(gè)問題
多個(gè)測(cè)試用例集合在一起就是TestSuite,并且TestSuite可以嵌套TestSuite
TestLoader用來(lái)加載TestCase到TestSuite中表制,loadTestsFrom_()方法,是從各個(gè)地方查找TestCase,創(chuàng)建它們的實(shí)例埋泵,然后add到TestSuite中幔欧,再返回一個(gè)TestSuite實(shí)例
TextTestRunner用來(lái)執(zhí)行測(cè)試用例,其中run(test)會(huì)執(zhí)行TestSuite/TestCase中的run(result)方法丽声。測(cè)試結(jié)果保存到TextTestResult實(shí)例中礁蔗,包括運(yùn)行了多少測(cè)試用例,成功和失敗各有多少等信息
對(duì)一個(gè)測(cè)試用例環(huán)境的搭建和銷毀是一個(gè)fixture
一個(gè)class繼承了unittest.TestCase雁社,就是一個(gè)測(cè)試用例浴井,如果有很多以test開頭的方法,每個(gè)方法在load的時(shí)候便會(huì)生成一個(gè)TestCase實(shí)例霉撵,如:一個(gè)class中有四個(gè)test_xxx方法磺浙,最后在load到suite中也會(huì)有四個(gè)測(cè)試用例
整個(gè)流程如下:
寫好TestCase洪囤,然后由Testloader加載TestCase到TestSuite,然后由TextTestRunner來(lái)運(yùn)行TestSuite,運(yùn)行的結(jié)果保存在TextTestResult中
通過命令或者unittest.main()執(zhí)行時(shí),main會(huì)調(diào)用TextTestRunner中的run來(lái)執(zhí)行撕氧,或者直接通過TextTestRunner來(lái)執(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:測(cè)試用例加載器牺丙,其包括多個(gè)加載測(cè)試用例的方法。返回一個(gè)測(cè)試套件
loadTestsFromModule(self,module)--根據(jù)給定的模塊實(shí)例來(lái)獲取測(cè)試用例套件
loadTestsFromTestCase(self,testCaseClass)--根據(jù)給定的測(cè)試類复局,獲取其中的所有測(cè)試方法冲簿,并返回一個(gè)測(cè)試套件
loadTestsFromName(self,name,module=None)
--根據(jù)給定的字符串來(lái)獲取測(cè)試用例套件,字符串可以是模塊名肖揣,測(cè)試類名民假,測(cè)試類中的測(cè)試方法名,或者一個(gè)可調(diào)用的是實(shí)例對(duì)象
這個(gè)實(shí)例對(duì)象返回一個(gè)測(cè)試用例或一個(gè)測(cè)試套件
loadTestsFromNames(self,names,module=None) --和上面功能相同龙优,只不過接受的是字符串列表
setUp()和tearDown()兩個(gè)方法(其實(shí)是重寫了TestCase的這兩個(gè)方法)羊异,這兩個(gè)方法在每個(gè)測(cè)試方法執(zhí)行前以及執(zhí)行后執(zhí)行一次,setUp用來(lái)為測(cè)試準(zhǔn)備環(huán)境彤断,tearDown用來(lái)清理環(huán)境野舶,已備之后的測(cè)試。
setUpClass()與tearDownClass():如果想要在所有case執(zhí)行之前準(zhǔn)備一次環(huán)境宰衙,并在所有case執(zhí)行結(jié)束之后再清理環(huán)境平道,我們可以用setUpClass()與tearDownClass():
關(guān)鍵字的關(guān)系圖
總結(jié)如下:
1.unittest是Python自帶的單元測(cè)試框架,我們可以用其來(lái)作為我們自動(dòng)化測(cè)試框架的用例組織執(zhí)行框架供炼。
2.unittest的流程:寫好TestCase一屋,然后由TestLoader加載TestCase到TestSuite,然后由TextTestRunner來(lái)運(yùn)行TestSuite袋哼,運(yùn)行的結(jié)果保存在TextTestResult中冀墨,我們通過命令行或者unittest.main()執(zhí)行時(shí),main會(huì)調(diào)用TextTestRunner中的run來(lái)執(zhí)行涛贯,或者我們可以直接通過TextTestRunner來(lái)執(zhí)行用例诽嘉。
3.一個(gè)class繼承unittest.TestCase即是一個(gè)TestCase,其中以test開頭的方法在load時(shí)被加載為一個(gè)真正的TestCase。
4.verbosity參數(shù)可以控制執(zhí)行結(jié)果的輸出虫腋,0是簡(jiǎn)單報(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)告浩螺。