python unittest之异常测试

exception.png

前言

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

总结

今天我们就如何对被测对象的抛出的异常进行断言验证,做了基本的说明和示例,大家可以基于上述示例进行修改理解。深入掌握异常断言原理和方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 高级语言通常都内置了一套try...except...finally...的错误处理机制,Python也不例外。 ...
    时间之友阅读 857评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,678评论 19 139
  • 前言 python unintest单元测试框架提供了一整套内置的断言方法。 如果断言失败,则抛出一个Assert...
    苦叶子阅读 11,512评论 2 14
  • 一、简介 Python最强大的结构之一就是它的异常处理能力,所有的标准异常都使用类来实现,都是基类Exceptio...
    随风化作雨阅读 3,150评论 0 1
  • 醉酒 假象 你是我年少时的轻狂 希望 光芒 你是我年轻时的梦想 爱在深夜滚烫 岁月吻过的眼 承担不起过往 只是踌躇...
    煦吻静阅读 347评论 0 2

友情链接更多精彩内容