前言
在python unittest测试框架中,提供了一系列的方法用于验证程序的异常。
下面和我一起看看在unittest中,如何使用异常验证来进行断言,完成对应的测试工作
assertRaises(exception, callable, *args, **kwds)
参数说明:
assertRaises(
exception, # 待验证异常类型
callable, # 待验证方法
*args, # 待验证方法参数
**kwds # 待验证方法参数(dict类型))
功能说明:
验证异常测试,验证异常(第一个参数)是当调用待测试函数时,在传入相应的测试数据后,如果测试通过,则表明待测试函数抛出了预期的异常,否则测试失败。
下面我们通过一个示例来进行演示,如果验证做除法时抛出除数不能为0的异常ZeroDivisionError。
# _*_ coding:utf-8 _*_
__author__ = '苦叶子'
import unittest
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
# 除法函数
def div(a, b):
return a/b
# 测试用例
class demoRaiseTest(unittest.TestCase):
def test_raise(self):
self.assertRaises(ZeroDivisionError, div, 1, 0)
# 主函数
if __name__ == '__main__':
unittest.main()
test_raise方法使用了assertRaises方法来断言验证div方法除数为零时抛出的异常。
运行python raise_demo.py结果如下
.
-------------------------------------Ran 1 test in 0.000s
OK
你还可以尝试调整下数据,如下:
def test_raise(self):
self.assertRaises(ZeroDivisionError, div, 1,1)
执行结果如下:
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)
这里就不对参数进行说明了,该方法使用正则表达式方式来匹配异常断言,能更加灵活,实用更多的场景。
通常regexp参数是一个正常表达式,或包含正则表达式的字符串(使用re.search()函数)
下面跟我一下看下assertRaisesRegexp的实际应用示例
# _*_ coding:utf-8 _*_
__author__ = '苦叶子'
import unittest
import re
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
# 除法函数
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)
# 主函数
if __name__ == '__main__':
unittest.main()
运行python test_raise_regexp.py上述示例,结果如下:
.
-----------------------------------Ran 1 test in 0.001s
OK
我们修改下除数,把
self.assertRaisesRegexp(
ZeroDivisionError, "integer division or modulo by zero", div, 2, 0)
改为:
self.assertRaisesRegexp(
ZeroDivisionError, "integer division or modulo by zero", div, 2, 2)
则执行失败,因为匹配失败了。
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)
总结
今天我们就如何对被测对象的抛出的异常进行断言验证,做了基本的说明和示例,大家可以基于上述示例进行修改理解。深入掌握异常断言原理和方法。