一吼蚁、簡(jiǎn)介
unittest是python自帶的單元測(cè)試框架
主要有以下幾個(gè)概念:
1煤搜、test fixture:初始化和清理 測(cè)試數(shù)據(jù)、以及環(huán)境祠丝,比如在用例執(zhí)行前創(chuàng)建臨時(shí)文件和文件夾,糠馆,或者代理數(shù)據(jù)庫(kù)嘶伟、目錄,又或者啟動(dòng)服務(wù)器進(jìn)程
最簡(jiǎn)單的實(shí)現(xiàn)方式是通過(guò)自定義下面的2個(gè)方法:
- TestCase.setUp():在每個(gè)測(cè)試方法運(yùn)行之前都會(huì)運(yùn)行一次又碌,適合為每個(gè)用例都初始化一遍數(shù)據(jù)九昧,有幾個(gè)以test開頭的方法就執(zhí)行幾次
- TestCase.tearDown():在每個(gè)測(cè)試方法運(yùn)行之后都會(huì)運(yùn)行一次,適合為每個(gè)用例都清理一遍數(shù)據(jù)
2毕匀、test case:測(cè)試用例
所有的測(cè)試類都必須直接或間接的繼承自u(píng)nittest.TestCase類
3铸鹰、test suite:用例集合,組合起來(lái)批量執(zhí)行
4期揪、test runner:運(yùn)行用例并返回結(jié)果掉奄,可以使用圖形界面规个、文本界面凤薛,或者返回一個(gè)特殊值來(lái)指示執(zhí)行測(cè)試的結(jié)果
注意點(diǎn):測(cè)試用例中方法名需要以test開頭,不然是不會(huì)被test runner執(zhí)行的
二诞仓、用法
前置條件:在創(chuàng)建測(cè)試用例之前需要導(dǎo)入unittest
1個(gè)測(cè)試用例類下面可以有多個(gè)測(cè)試方法(test)或者叫做測(cè)試點(diǎn)缤苫,如下就有3個(gè)用例,其中TestStringMethods繼承了unittest.TestCase墅拭,實(shí)際工作中我們會(huì)寫test_case1活玲、test_case2......
import unittest
class TestStringMethods(unittest.TestCase): # 定義測(cè)試類
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_spilt(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
with self.assertRaises(TypeError):
s.split(2)
if __name__ == "__main__":
unittest.main()
# suite = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)
# unittest.TextTestRunner(verbosity=2).run(suite)
斷言
在開發(fā)一個(gè)程序的時(shí)候,與其讓它運(yùn)行時(shí)崩潰谍婉,不如在它出現(xiàn)錯(cuò)誤條件時(shí)就返回錯(cuò)誤舒憾,所以斷言是測(cè)試用例的核心,常見(jiàn)的就是assert斷言穗熬,一般來(lái)說(shuō)每個(gè)測(cè)試方法里都必須有斷言
比如判斷接口通不通镀迂,返回值對(duì)不對(duì),錯(cuò)誤描述信息是否一致等等唤蔗,我常用的就是下面2種:
- assertEqual(first, second, msg=message)
- assertNotEqual(first, second, msg=message)
斷言第一個(gè)參數(shù)和第二個(gè)參數(shù)是否相等探遵,如果相等,則輸出OK信息妓柜,若不相等則測(cè)試失敗箱季。其中 msg 為可選參數(shù),用于輸出測(cè)試失敗時(shí)提示信息棍掐。
self.assertEqual(response.get('success'), True)
self.assertEqual(form.external_id.data, response_external_id, msg=message.to_str('業(yè)務(wù)邏輯錯(cuò)誤'))
- 調(diào)用assertEqual()來(lái)檢查預(yù)期結(jié)果;
- assertTrue()或assertFalse()來(lái)驗(yàn)證條件;
- assertRaises()來(lái)驗(yàn)證是否引發(fā)了特定的異常藏雏。
使用上述方法而不是assert語(yǔ)句,是為了測(cè)試運(yùn)行程序可以累積所有測(cè)試結(jié)果并生成報(bào)告作煌。
其余用法可參考博客園上的一篇文章 https://www.cnblogs.com/feiyueNotes/p/7788995.html
運(yùn)行case
全局:unittest.main
或者下面的
suite = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)
unittest.TextTestRunner(verbosity=2).run(suite)
有時(shí)候case執(zhí)行時(shí)只是入?yún)⒅底兓蚺梗Y(jié)果都是一樣
這時(shí)我們可以采用入?yún)?shù)化的方式蝠嘉,借助parameterizd
但是uniittest框架不支持裝飾器,故只有使用@parameterized.expand創(chuàng)建的測(cè)試才會(huì)被執(zhí)行
@parameterized.expand([
('-9999', ''),
('', '-9999'),
('-8888', '-9999'),
])
def test_case_1(self, aaa, bbb):
****
代碼此處省略
****
參數(shù)化的case執(zhí)行:生成測(cè)試集然后運(yùn)行
if __name__ == '__main__':
suite = unittest.TestSuite(Classname, "test_case_n")
runner = unittest.TextTestResult()
runner.run(suite)