前言
在python unittest測試框架中端三,提供了一系列的方法用于驗證程序的異常蛹找。
下面和我一起看看在unittest中沈矿,如何使用異常驗證來進行斷言惦辛,完成對應(yīng)的測試工作
assertRaises(exception, callable, *args, **kwds)
參數(shù)說明:
assertRaises(
exception, # 待驗證異常類型
callable, # 待驗證方法
*args, # 待驗證方法參數(shù)
**kwds # 待驗證方法參數(shù)(dict類型)
)
功能說明:
驗證異常測試痪欲,驗證異常(第一個參數(shù))是當調(diào)用待測試函數(shù)時悦穿,在傳入相應(yīng)的測試數(shù)據(jù)后,如果測試通過业踢,則表明待測試函數(shù)拋出了預期的異常栗柒,否則測試失敗。
下面我們通過一個示例來進行演示知举,如果驗證做除法時拋出除數(shù)不能為0的異常ZeroDivisionError瞬沦。
# _*_ coding:utf-8 _*_
__author__ = '苦葉子'
import unittest
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
# 除法函數(shù)
def div(a, b):
return a/b
# 測試用例
class demoRaiseTest(unittest.TestCase):
def test_raise(self):
self.assertRaises(ZeroDivisionError, div, 1, 0)
# 主函數(shù)
if __name__ == '__main__':
unittest.main()
test_raise方法使用了assertRaises方法來斷言驗證div方法除數(shù)為零時拋出的異常。
運行python raise_demo.py結(jié)果如下
.
-------------------------------------
Ran 1 test in 0.000s
OK
你還可以嘗試調(diào)整下數(shù)據(jù)雇锡,如下:
def test_raise(self):
self.assertRaises(ZeroDivisionError, div, 1,1)
執(zhí)行結(jié)果如下:
F
=====================================
FAIL: test_raise (__main__.demoRaiseTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "raise_demo.py", line 18, in test_raise
self.assertRaises(ZeroDivisionError, div, 1,1)
AssertionError: ZeroDivisionError not raised
----------------------------------
Ran 1 test in 0.000s
assertRaisesRegexp(exception, regexp, callable, *args, **kwds)
這里就不對參數(shù)進行說明了逛钻,該方法使用正則表達式方式來匹配異常斷言,能更加靈活锰提,實用更多的場景曙痘。
通常regexp參數(shù)是一個正常表達式芳悲,或包含正則表達式的字符串(使用re.search()函數(shù))
下面跟我一下看下assertRaisesRegexp的實際應(yīng)用示例
# _*_ coding:utf-8 _*_
__author__ = '苦葉子'
import unittest
import re
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
# 除法函數(shù)
def div(a, b):
return a/b
# 測試用例
class demoRaiseTest(unittest.TestCase):
def test_raise_regexp(self):
self.assertRaisesRegexp(
ZeroDivisionError, "integer division or modulo by zero", div, 2, 0)
# 主函數(shù)
if __name__ == '__main__':
unittest.main()
運行python test_raise_regexp.py上述示例,結(jié)果如下:
.
-----------------------------------
Ran 1 test in 0.001s
OK
我們修改下除數(shù)边坤,把
self.assertRaisesRegexp(
ZeroDivisionError, "integer division or modulo by zero", div, 2, 0)
改為:
self.assertRaisesRegexp(
ZeroDivisionError, "integer division or modulo by zero", div, 2, 2)
則執(zhí)行失敗名扛,因為匹配失敗了。
F
===================================
FAIL: test_raise_regexp (__main__.demoRaiseTest)
------------------------------------
Traceback (most recent call last):
File "test_raise_regexp.py", line 19, in test_raise_regexp
ZeroDivisionError, "integer division or modulo by zero",
AssertionError: ZeroDivisionError not raised
------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)
總結(jié)
今天我們就如何對被測對象的拋出的異常進行斷言驗證茧痒,做了基本的說明和示例肮韧,大家可以基于上述示例進行修改理解。深入掌握異常斷言原理和方法文黎。