麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Python > 正文

python 測(cè)試框架 unittest

2019-11-11 05:43:20
字體:
供稿:網(wǎng)友

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

目錄[-]

unittest 概覽舉個(gè)例子啟動(dòng)測(cè)試Test Discovery測(cè)試環(huán)境

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

unittest 概覽


上一篇介紹的 doctest 不管是看起來還是用起來都顯得十分簡(jiǎn)單,可以與源碼寫在一起,比較適合用作驗(yàn)證性的功能測(cè)試。而本篇的 unittest 從名字上看,它是一個(gè)單元測(cè)試框架;從官方文檔的字?jǐn)?shù)上看,它的能力應(yīng)該比 doctest 強(qiáng)一些。

使用 unittest 的標(biāo)準(zhǔn)流程為:

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

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

舉個(gè)例子


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

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()

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

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

啟動(dòng)測(cè)試


上例中的結(jié)尾處,我們定義了一個(gè)對(duì) unittest.main() 的調(diào)用,因此這個(gè)腳本是可以直接運(yùn)行的:

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

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

Test Discovery


這個(gè)分段標(biāo)題我暫時(shí)沒想到好的翻譯方法,就先不翻了。

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

$ cd PRoject_directory$ python -m unittest discover

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

測(cè)試環(huán)境


當(dāng)類里面定義了 setUp() 方法的時(shí)候,測(cè)試程序會(huì)在執(zhí)行每條測(cè)試項(xiàng)前先調(diào)用此方法;同樣地,在全部測(cè)試項(xiàng)執(zhí)行完畢后,tearDown() 方法也會(huì)被調(diào)用。驗(yàn)證如下:

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()

注意這里兩次測(cè)試均對(duì)同一個(gè)實(shí)例屬性 self.foo 進(jìn)行了 pop() 調(diào)用,但測(cè)試結(jié)果均為 pass,即說明,test_1sttest_2nd 在調(diào)用前都分別調(diào)用了一次 setUp()

那如果我們想全程只調(diào)用一次 setUp/tearDown 該怎么辦呢?就是用 setUpClass()tearDownClass() 類方法啦。注意使用這兩個(gè)方法的時(shí)候一定要用 @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()

這個(gè)例子里我們使用了一個(gè)類級(jí)別的 setUpClass() 類方法,并修改了第二次 pop() 調(diào)用的預(yù)期返回值。運(yùn)行結(jié)果顯示依然是全部通過,即說明這次在全部測(cè)試項(xiàng)被調(diào)用前只調(diào)用了一次 setUpClass()

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

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

一般 assert*() 方法如果拋出了未被捕獲的異常,那么這條測(cè)試用例會(huì)被記為 fail,測(cè)試?yán)^續(xù)進(jìn)行。但如果異常發(fā)生在 setUp() 里,就會(huì)認(rèn)為測(cè)試程序自身存在錯(cuò)誤,后面的測(cè)試用例和tearDown() 都不會(huì)再執(zhí)行。即,tearDown() 僅在setUp() 成功執(zhí)行的情況下才會(huì)執(zhí)行,并一定會(huì)被執(zhí)行。

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 色999国产| 国产91影院 | 国产精品美女久久久久久不卡 | 国产自在自线午夜精品视频在 | 4p一女两男做爰在线观看 | 国产亚洲精品久久久久久久久 | 国产日产精品久久久久快鸭 | 欧美一级特黄aaaaaa在线看首页 | 暴力肉体进入hdxxxx古装 | 深夜福利视频免费观看 | 国产精品自拍99 | 香蕉久久久久 | 国产亚洲网 | 成人免费久久网 | 操操插插 | 欧美精品一区二区久久 | 涩涩操 | 免费一及片 | 亚洲免费看片网站 | 久久国产精品久久精品国产演员表 | 亚洲综合一区二区三区 | 免费观看国产精品视频 | 久久国产精品久久久久久电车 | omofun 动漫在线观看 | 春光影院理论片 | 欧美一级不卡视频 | 成人一级免费视频 | 黄色视屏免费观看 | 亚洲综合网站 | 欧美成人免费一区二区三区 | 看免费毛片 | 免费观看一级黄色片 | 欧美亚洲国产一区二区三区 | 在线成人精品视频 | 激情国产视频 | 未成年人在线观看 | 男女羞羞在线观看 | 欧美激情猛片xxxⅹ大3 | 在线观看免费视频麻豆 | 中文字幕在线观看二区 | 99精品热视频 |