亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

python 測試框架 unittest

2019-11-11 05:40:48
字體:
來源:轉載
供稿:網友

摘要這里將從(pythontesting.net)陸續編譯四篇 Python 測試框架的簡介,分別為:doctest、unittest、nose 和 pytest。本篇為第二篇:unittest

目錄[-]

unittest 概覽舉個例子啟動測試Test Discovery測試環境

unittest 與 doctest 一樣也是 Python 發行版自帶的包。如果你聽說過 PyUnit(OSC 開源項目頁面中就有 PyUnit 的頁面),那么這倆其實是同一個東西——PyUnit 是 unittest 的曾用名,因為 PyUnit 最早也是來源于 Kent 和 Erich 的 JUnit(xUnit 測試框架系列的 java 版本)

unittest 概覽


上一篇介紹的 doctest 不管是看起來還是用起來都顯得十分簡單,可以與源碼寫在一起,比較適合用作驗證性的功能測試。而本篇的 unittest 從名字上看,它是一個單元測試框架;從官方文檔的字數上看,它的能力應該比 doctest 強一些。

使用 unittest 的標準流程為:

從 unittest.TestCase 派生一個子類在類中定義各種以 “test_” 打頭的方法通過 unittest.main() 函數來啟動測試

unittest 的一個很有用的特性是 TestCase 的 setUp()tearDown() 方法,它們提供了為測試進行準備和掃尾工作的功能,聽起來就像上下文管理器一樣。這種功能很適合用在測試對象需要復雜執行環境的情況下。

舉個例子


這里依舊使用上篇中那個極簡的例子:unnecessary_math.py 文件中有一個multiply() 函數,功能與 * 操作符完全一樣。

test_um_test.py:

import unittestfrom unnecessary_math import multiplyclass TestUM(unittest.TestCase):    def setUp(self):        pass    def test_number_3_4(self):        self.assertEqual(multiply(3,4),12)    def test_string_a_3(self):        self.assertEqual(multiply('a',3),'aaa')if __name__ == '__main__':    unittest.main()

這個例子里,我們使用了 assertEqual() 方法。unittest 中還有很多類似的 assert 方法,比如 NotEqual、Is(Not)NoneTrue(False)、Is(Not)Instance 等針對變量值的校驗方法;另外還有一些如 assertRaises()、assertRaisesRegex() 等針對異常、警告和 log 的檢查方法;以及如assertAlmostEqual() 等一些奇怪的方法。

較詳細的 assert 方法可以參考 unittest 的文檔頁面。

啟動測試


上例中的結尾處,我們定義了一個對 unittest.main() 的調用,因此這個腳本是可以直接運行的:

$ python test_um_test.py..--------------------------------------Ran 2 tests in 0.01sOK

同樣 -v 參數是可選的,也可以在 unittest.main() 函數里直接指定:verbosity=1。

Test Discovery


這個分段標題我暫時沒想到好的翻譯方法,就先不翻了。

Test Discovery 的作用是:假設你的項目文件夾里面四散分布著很多個測試文件。當你做回歸測試的時候,一個一個地執行這些測試文件就太麻煩了。TestLoader.discover() 提供了一個可以在項目目錄下自動搜索并運行測試文件的功能,并可以直接從命令行調用:

$ cd PRoject_directory$ python -m unittest discover

discover 可用的參數有 4 個(-v -s -p -t),其中 -s-t 都與路徑有關,如上例中提前 cd 到項目路徑的話這倆參數都可以無視;-v 喜聞樂見;-p--pattern 的縮寫,可用于匹配某一類文件名。

測試環境


當類里面定義了 setUp() 方法的時候,測試程序會在執行每條測試項前先調用此方法;同樣地,在全部測試項執行完畢后,tearDown() 方法也會被調用。驗證如下:

import unittestclass simple_test(unittest.TestCase):    def setUp(self):        self.foo = list(range(10))    def test_1st(self):        self.assertEqual(self.foo.pop(),9)    def test_2nd(self):        self.assertEqual(self.foo.pop(),9)if __name__ == '__main__':    unittest.main()

注意這里兩次測試均對同一個實例屬性 self.foo 進行了 pop() 調用,但測試結果均為 pass,即說明,test_1sttest_2nd 在調用前都分別調用了一次 setUp()。

那如果我們想全程只調用一次 setUp/tearDown 該怎么辦呢?就是用 setUpClass()tearDownClass() 類方法啦。注意使用這兩個方法的時候一定要用 @classmethod 裝飾器裝飾起來:

import unittestclass simple_test(unittest.TestCase):    @classmethod    def setUpClass(self):        self.foo = list(range(10))    def test_1st(self):        self.assertEqual(self.foo.pop(),9)    def test_2nd(self):        self.assertEqual(self.foo.pop(),8)if __name__ == '__main__':    unittest.main()

這個例子里我們使用了一個類級別的 setUpClass() 類方法,并修改了第二次 pop() 調用的預期返回值。運行結果顯示依然是全部通過,即說明這次在全部測試項被調用前只調用了一次 setUpClass()。

再往上一級,我們希望在整個文件級別上只調用一次 setUp/tearDown,這時候就要用 setUpModule()tearDownModule() 這兩個函數了,注意是函數,與 TestCase 類同級:

import unittestdef setUpModule():    passclass simple_test(inittest.TestCase):    ...

一般 assert*() 方法如果拋出了未被捕獲的異常,那么這條測試用例會被記為 fail,測試繼續進行。但如果異常發生在 setUp() 里,就會認為測試程序自身存在錯誤,后面的測試用例和tearDown() 都不會再執行。即,tearDown() 僅在setUp() 成功執行的情況下才會執行,并一定會被執行。

最后,這兩個方法的默認實現都是什么都不做(只有一句 pass),所以覆蓋的時候直接寫新內容就可以了,不必再調用父類的此方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩一区二区三区在线播放| 精品亚洲永久免费精品| 7m精品福利视频导航| 亚洲人成网站777色婷婷| 国产婷婷97碰碰久久人人蜜臀| 亚洲国产精品久久91精品| 国产精品香蕉在线观看| 国产精品黄色av| 亚洲成人黄色在线观看| 亚洲国产精品悠悠久久琪琪| 欧美国产日韩视频| 国外成人在线播放| 在线日韩中文字幕| 欧美成人小视频| 亚洲国产欧美自拍| 日韩成人中文电影| 国产丝袜精品视频| 日韩美女写真福利在线观看| 国产精品久久久久久久久久久久| 国产精品视频xxx| 一级做a爰片久久毛片美女图片| 国产精品久久久精品| 国产+人+亚洲| 亚洲精品美女在线观看| 国产精品91一区| 久久成年人视频| 欧美大全免费观看电视剧大泉洋| 日韩在线观看成人| 欧美大胆在线视频| 日本亚洲精品在线观看| 国产精品永久免费在线| 丁香五六月婷婷久久激情| 最近中文字幕mv在线一区二区三区四区| 91精品久久久久久久久中文字幕| 成人在线激情视频| 亚洲精品v天堂中文字幕| 久久久久www| 亚洲国产高清福利视频| 国产一区私人高清影院| 国产丝袜一区视频在线观看| 色哟哟网站入口亚洲精品| 精品免费在线观看| 九九精品在线播放| 久久精品视频在线观看| 丝袜情趣国产精品| 精品中文字幕视频| 成人福利网站在线观看11| …久久精品99久久香蕉国产| 国产精品偷伦一区二区| 日韩在线视频一区| 26uuu另类亚洲欧美日本老年| 精品中文字幕在线观看| 欧美一区二区三区……| 国产欧美日韩精品专区| 国产精品99久久久久久白浆小说| 免费不卡在线观看av| 久久久国产精品亚洲一区| 在线视频中文亚洲| 亚洲精品日韩在线| 午夜美女久久久久爽久久| 热re91久久精品国99热蜜臀| 国产欧美精品在线| 亚洲午夜av久久乱码| 欧洲成人在线视频| 亚洲精品免费一区二区三区| 亚洲成人精品久久久| 青草热久免费精品视频| 亚洲国产精品系列| 亚洲高清久久久久久| 日韩av综合网| 欧美精品www| 亚洲欧美国产va在线影院| 久久国内精品一国内精品| 国产不卡一区二区在线播放| 亚洲第一福利视频| 国产成人涩涩涩视频在线观看| 中文字幕日韩欧美| 91黄色8090| 一区国产精品视频| 日韩电影中文字幕在线| 亚洲精品98久久久久久中文字幕| 国产精品日韩av| 久久手机免费视频| 国产精品一区二区久久| 亚洲精品国产精品乱码不99按摩| 精品一区二区三区电影| 国产精品久久久久久av福利| 91国内免费在线视频| 亚洲精品国精品久久99热| 欧美一区二区三区图| 成人天堂噜噜噜| 一区二区三区视频免费在线观看| 亚洲一区二区在线| 国产精品极品美女在线观看免费| 在线国产精品播放| 精品国产1区2区| 国产精品欧美一区二区| 国产视频精品免费播放| 国产在线a不卡| 亚洲成人久久久久| www.精品av.com| 日韩电视剧在线观看免费网站| 中文字幕视频在线免费欧美日韩综合在线看| 国产美女高潮久久白浆| 亚洲欧美一区二区三区久久| 久久五月天综合| 日韩风俗一区 二区| 成人黄色短视频在线观看| 欧美视频一区二区三区…| 日韩中文在线中文网在线观看| 亚洲国产精品久久久久秋霞蜜臀| 日韩在线视频导航| 日本一区二区三区在线播放| 97视频人免费观看| 日韩亚洲欧美中文在线| 一区二区欧美亚洲| 中文字幕免费国产精品| 岛国av一区二区在线在线观看| 国产精品免费小视频| 欧美最猛性xxxxx(亚洲精品)| 日韩中文字幕第一页| 亚洲精品免费在线视频| 欧洲精品毛片网站| 亚洲精品综合久久中文字幕| 亚洲国语精品自产拍在线观看| 国产午夜精品麻豆| 亚洲欧美国产一本综合首页| 国产日产欧美a一级在线| 亚洲色图欧美制服丝袜另类第一页| 久久男人资源视频| 国产性猛交xxxx免费看久久| 久久久久久国产| 亚洲图片欧洲图片av| 自拍偷拍免费精品| 欧美激情在线一区| 日韩亚洲国产中文字幕| 97香蕉超级碰碰久久免费软件| 久久视频免费在线播放| 在线精品国产成人综合| 亚洲成人精品在线| 亚洲性av在线| 成人激情视频免费在线| 日韩三级成人av网| 日本精品一区二区三区在线播放视频| 亚洲精品丝袜日韩| 精品国产一区二区三区在线观看| 性亚洲最疯狂xxxx高清| 欧美国产高跟鞋裸体秀xxxhd| 国产一区二区三区视频在线观看| 欧美激情亚洲一区| 91免费在线视频网站| 久久久爽爽爽美女图片| 午夜精品久久久久久久男人的天堂| 日韩精品免费在线视频| 欧美日韩亚洲一区二区三区| 欧美成人h版在线观看| 亚洲欧美日韩久久久久久| 69**夜色精品国产69乱| 国产精品精品久久久久久| 亚洲91精品在线观看| 亚洲人成在线观| 国产日韩在线播放| 国产精品中文久久久久久久| 精品久久久国产|