单元测试框架之unittest(一)
一、單元測(cè)試的含義
unittest單元測(cè)試框架的設(shè)計(jì)靈感來(lái)源于Junit(Java語(yǔ)言的單元測(cè)試框架),它與其他語(yǔ)言的單元測(cè)試框架風(fēng)格相類似,支持自動(dòng)化測(cè)試、為測(cè)試共享setUp和shutDown、它可以在將測(cè)試用例聚合到一起形成一個(gè)集合一起執(zhí)行的同時(shí)在測(cè)試報(bào)告中展示獨(dú)立的測(cè)試結(jié)果。
為了達(dá)到此目的,unittest支持幾個(gè)重要的面向?qū)ο笫降母拍?#xff1a;
1、test fixture
一個(gè)test fixture所做的事情是執(zhí)行單個(gè)或多個(gè)測(cè)試用例時(shí)的準(zhǔn)備工作和執(zhí)行結(jié)束后的一些相關(guān)清理工作,這包括:創(chuàng)建臨時(shí)或代理數(shù)據(jù)庫(kù)、目錄或開(kāi)始服務(wù)器進(jìn)程。。。
2、test case
一個(gè)test case 是一個(gè)獨(dú)立的測(cè)試單元,針對(duì)于一組特定的輸入得到的特殊相應(yīng)的驗(yàn)證,通過(guò)繼承unittest提供的基類TestCase, 然后可以創(chuàng)建新的測(cè)試用例
3、test suite
一個(gè)test suite 是一組測(cè)試用例的集合,也可以是一組test suite的集合,也可以兩者混合的集合,test suite就是用來(lái)聚合你想要一起執(zhí)行的測(cè)試用例的
4、test runner
一個(gè)test runner 是一個(gè)協(xié)調(diào)測(cè)試執(zhí)行并向用戶提供執(zhí)行結(jié)果的組建,它可以使用圖形界面、文本界面或返回一個(gè)特殊值標(biāo)識(shí)測(cè)試執(zhí)行的結(jié)果
二、實(shí)例代碼
下面我們看Python官方給的一個(gè)簡(jiǎn)單的小例子,來(lái)測(cè)試三個(gè)字符串
import unittestclass TestStringMethods(unittest.TestCase): # 測(cè)試類繼承了unittest.TestCase類,因此在該類里可以創(chuàng)建新的測(cè)試用例def test_upper(self):self.assertEqual('foo'.upper(), 'FOO') # ‘foo’是一個(gè)字符串,upper()方法會(huì)將這個(gè)字符串轉(zhuǎn)成大寫,assertEqual是unittest提供的一個(gè)斷言方法,用來(lái)比較逗號(hào)前后兩個(gè)值是否相等def test_isupper(self):self.assertTrue('FOO'.isupper()) # assertTrue也是unittest提供的斷言方法,用來(lái)判斷括號(hào)內(nèi)的內(nèi)容是真是假,如果是真則斷言成功,否則為失敗,'FOO'是個(gè)字符串并且是大寫,調(diào)用isupper()方法,返回結(jié)果self.assertFalse('Foo'.isupper()) # assertFalse則正好相反,如果括號(hào)內(nèi)返回為假則斷言成功,否則為失敗def test_split(self):s = 'hello world'self.assertEqual(s.split(), ['hello', 'world'])# check that s.split fails when the separator is not a string with self.assertRaises(TypeError):s.split(2)if __name__ == '__main__':unittest.main()三、代碼解析:
在第三個(gè)用例里,定義了一個(gè)字符串,s='hello world', 然后進(jìn)行了斷言,斷言的條件里調(diào)用了一個(gè)split()方法,實(shí)際上初學(xué)者看到這會(huì)比較懵,s.split()到底返回的是什么,它是否等于逗號(hào)后邊['hello', 'world']?
學(xué)這個(gè)東西就是要多試試,那么接下來(lái)我們進(jìn)行一系列嘗試來(lái)認(rèn)識(shí)一下split()
啟動(dòng)命令行CMD,進(jìn)入python環(huán)境
嘗試1:定義一個(gè)字符串? s = 'hello world', 然后 print(s)回車,結(jié)果應(yīng)該是? hello world
嘗試2:如果我們敲入print(s.split())然后回車呢呢,結(jié)果應(yīng)該是['hello', 'world'], 到此我們就得到了答案,第三條用例里的斷言self.assertEqual(s.split(), ['hello', 'world'])是成功
嘗試3:如果我們print(s.split(2)) 會(huì)是什么結(jié)果?? 如果我們print(s.split('o'))又會(huì)是什么結(jié)果?
with self.assertRaises(TypeError):s.split(2)在第三個(gè)用例里,我們也看到了兩行代碼,split()函數(shù)我們已經(jīng)知道它能干什么了,那么with是什么?assertRaises在這又在干什么?
with,我們總提python之美,那么這就是美麗之處,with語(yǔ)句提供一個(gè)有效的處理異常和完成清理工作的機(jī)制,它讓代碼更簡(jiǎn)練,有點(diǎn)懵沒(méi)關(guān)系,換一個(gè)方式說(shuō),如果不用with,要達(dá)到同等效果的的話要用什么呢?try...except...finally,這是另一個(gè)課題了并不是此處的重點(diǎn),讀者朋友可以先忽略它不要打斷學(xué)習(xí)unittest的思路
assertRaises是什么呢?unittest?模塊提供了用于測(cè)試函數(shù)是否在給定無(wú)效輸入時(shí)引發(fā)特定異常的方法,這個(gè)方法就是assertRaises,我們?cè)诨厝タ创a,s.split(2), 很明顯我們前邊已經(jīng)嘗試過(guò)執(zhí)行參數(shù)為2的情況,報(bào)了異常,也就是2并不是split函數(shù)的合法參數(shù),我們傳給2這個(gè)參數(shù),它理應(yīng)報(bào)異常,那么好with self.assertRaises(TypeError): 在干什么,它想要的就是看看split()在得到了非法參數(shù)的時(shí)候是否報(bào)一個(gè)TypeError,此處讀者可能要整理一下思路,仔細(xì)閱讀此段內(nèi)容
最后的unittest.main(),有了它我們就有了一個(gè)簡(jiǎn)單的方式執(zhí)行這個(gè)腳本,unittest.main()提供了命令行界面運(yùn)行腳本的方式
假設(shè)我們上邊的腳本保存在文件testingunit.py里并將它保存在桌面,然后我們啟動(dòng)命令行,輸入“python C:\Users\davieyang\Desktop\testingunit.py”? 看看是個(gè)什么結(jié)果?
C:\Users\用戶名>python C:\Users\davieyang\Desktop\testingunit.py .... ---------------------------------------------------------------------- Ran 4 tests in 0.001sOK我們能看到4個(gè)....,它的意義我們共4個(gè)用例,點(diǎn)表示測(cè)試通過(guò),那么如果點(diǎn)表示測(cè)試通過(guò),什么表示測(cè)試失敗呢? 是“F”,如果測(cè)試遇到異常呢? 是“E”
如果我們執(zhí)行“python C:\Users\davieyang\Desktop\testingunit.py -v”又是什么結(jié)果?
C:\Users\用戶名>python C:\Users\davieyang\Desktop\testingunit.py -v test_isupper (__main__.TestStringMethods) ... ok test_list (__main__.TestStringMethods) ... ok test_split (__main__.TestStringMethods) ... ok test_upper (__main__.TestStringMethods) ... ok---------------------------------------------------------------------- Ran 4 tests in 0.002sOK?
轉(zhuǎn)載于:https://www.cnblogs.com/davieyang/p/10159630.html
總結(jié)
以上是生活随笔為你收集整理的单元测试框架之unittest(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 信用卡临时额度怎么变成固定额度
- 下一篇: 抢课啦!(排序)