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