测试开发技术网站
博客
设计
设计
开发
Python
测试
unittest
运维
Linux基础应用
CI/CD
CI/CD
数据库
数据库
云计算
云计算
云原生
云原生
爬虫
爬虫
数据分析
数据分析
人工智能
人工智能
登录
注册
Pytest----如何对捕获的异常的类型和内容进行断言
收藏本文
作者:redrose2100 类别: 日期:2022-09-02 03:02:01 阅读:723 次 消耗积分:0 分
[TOC] ![](https://redrose2100.oss-cn-hangzhou.aliyuncs.com/img/7cd47362-951c-11ee-986a-0242ac110004.png) # 一、对异常类型进行断言 对捕获的异常进行断言主要用于在比如异常测试时,当我们给定了特殊的数据时,程序如果产生了我们期望的异常那么对测试而言是正确的,此时就可以通过对捕获的异常类型进行断言,当然对捕获的异常类型进行断言完全可以使用python语言中的try…except 结构进行判断,比如对一个除法函数,当我们给定除数为0时,那么程序报除数为0的异常是正确的,如下为使用python语法中的try…except结构实现的测试代码 ```python def div(a,b): return a/b def test_demo(): try: c=div(10,0) except Exception as e: assert isinstance(e,ZeroDivisionError) ``` 执行结果如下,即此用例通过。 ```bash $ pytest ========================================================================= test session starts ========================================================================== platform win32 -- Python 3.9.13, pytest-7.1.2, pluggy-1.0.0 rootdir: D:\redrose2100-book\ebooks\Pytest企业级应用实战\src collected 1 item test_demo.py . [100%] ========================================================================== 1 passed in 0.07s =========================================================================== ``` 通过上面的测试代码也看得出,通过try…except结构对异常类型进行断言显得优点繁琐,pytest提供了一种更加便捷的方式,使用with pytest.raise(异常类型)的格式,如下代码 ```python import pytest def div(a,b): return a/b def test_demo(): with pytest.raises(ZeroDivisionError): c=div(10,0) ``` 执行结果如下,可以看得出,此时用例通过,即此时异常类型确实与期望的一致。 ```bash $ pytest ========================================================================= test session starts ========================================================================== platform win32 -- Python 3.9.13, pytest-7.1.2, pluggy-1.0.0 rootdir: D:\redrose2100-book\ebooks\Pytest企业级应用实战\src collected 1 item test_demo.py . [100%] ========================================================================== 1 passed in 2.11s =========================================================================== ``` # 二、对捕获的异常信息进行断言 对捕获的异常信息进行断言,同样可以使用Python语言中的try…except结构,如下代码 ```python def div(a,b): return a/b def test_demo(): try: c=div(10,0) except Exception as e: assert "division by zero" in str(e) ``` 执行结果如下,可以看得出,此时捕获的异常的信息与期望是一致的。 ```bash $ pytest ========================================================================= test session starts ========================================================================== platform win32 -- Python 3.9.13, pytest-7.1.2, pluggy-1.0.0 rootdir: D:\redrose2100-book\ebooks\Pytest企业级应用实战\src collected 1 item test_demo.py . [100%] ========================================================================== 1 passed in 2.03s =========================================================================== ``` 虽然上面的代码可以对异常的信息进行断言,但是明显显得过于繁琐,在pytest框架中,同样也提供了一种比较方便的方式用于对捕获到的异常信息进行断言,如下代码,通过使用with pytest.raise(异常类型) as e,此时异常的信息均在对象e的value属性中,如下代码即断言期望的异常信息在e.value中 ```python import pytest def div(a,b): return a/b def test_demo(): with pytest.raises(ZeroDivisionError) as e: c=div(10,0) assert "division by zero" in str(e.value) ``` 执行结果如下,即此时异常信息中包含division by zero字符串。 ```bash pytest ========================================================================= test session starts ========================================================================== platform win32 -- Python 3.9.13, pytest-7.1.2, pluggy-1.0.0 rootdir: D:\redrose2100-book\ebooks\Pytest企业级应用实战\src collected 1 item test_demo.py . [100%] ========================================================================== 1 passed in 2.02s =========================================================================== ``` # 三、同时对捕获的异常类型和异常信息进行断言 这里同样还是不厌其烦首先使用python的语法中的try…except结构对捕获到的异常类型和异常信息进行断言,不小小看了这些基本的或者看上去不怎么高明的手段,其实很多时候在工作中,当我们并未掌握一个框架或者工具提供的巧妙的方法,并不是说我们不能工作了,而完全可以采用我们所掌握的手段的达到同样的目的。如下代码,这里采用了两次断言,分别对异常类型和异常信息进行了断言。 ```python def div(a,b): return a/b def test_demo(): try: c=div(10,0) except Exception as e: assert isinstance(e, ZeroDivisionError) assert "division by zero" in str(e) ``` 执行结果如下,可以看出此时是完全可以对异常类型和异常信息进行断言的。 ```bash $ pytest ========================================================================= test session starts ========================================================================== platform win32 -- Python 3.9.13, pytest-7.1.2, pluggy-1.0.0 rootdir: D:\redrose2100-book\ebooks\Pytest企业级应用实战\src collected 1 item test_demo.py . [100%] ========================================================================== 1 passed in 2.10s =========================================================================== ``` 这里同样pytest也提供了一种更加简洁方便的方法,如下代码,通过指定异常类型以及通过正则表达式来匹配异常信息的方式同时对异常类型和异常信息进行断言 ```python import pytest def div(a,b): return a/b def test_demo(): with pytest.raises(ZeroDivisionError,match=r"division\s*by\s*zero"): c=div(10,0) ``` 执行结果如下,即用例通过,即捕获的异常类型时ZeroDivisionError,而且异常信息也能匹配到正则表达式"division\s*by\s*zero",这样就显得整洁多了。而且用起来也非常的方便。 ```bash $ pytest ========================================================================= test session starts ========================================================================== platform win32 -- Python 3.9.13, pytest-7.1.2, pluggy-1.0.0 rootdir: D:\redrose2100-book\ebooks\Pytest企业级应用实战\src collected 1 item test_demo.py . [100%] ========================================================================== 1 passed in 2.00s =========================================================================== ``` # 四、对一个函数可能产生的异常进行断言 通过pytest.raise还可以对一个函数可能产生的异常进行断言,在如下格式的调用中,会执行func函数,并将args和**kwargs传入func函数,然后判断此时func中报出的异常是否与第一个参数异常一致。 ```python pytest.raises(ExpectedException, func, args, **kwargs) ``` 如下代码展示了两个用例分别去调用除法计算函数div,均断言会产生除数为零的异常。 ```python import pytest def div(a,b): return a/b def test_demo01(): pytest.raises(ZeroDivisionError,div,10,0) def test_demo02(): pytest.raises(ZeroDivisionError,div,10,5) ``` 执行结果如下,显然test_demo02中不会产生除数为零的异常,因此此用例会失败。 ```bash pytest ========================================================================= test session starts ========================================================================== platform win32 -- Python 3.9.13, pytest-7.1.2, pluggy-1.0.0 rootdir: D:\redrose2100-book\ebooks\Pytest企业级应用实战\src collected 2 items test_demo.py .F [100%] =============================================================================== FAILURES =============================================================================== _____________________________________________________________________________ test_demo02 ______________________________________________________________________________ def test_demo02(): > pytest.raises(ZeroDivisionError,div,10,5) E Failed: DID NOT RAISE
test_demo.py:10: Failed ======================================================================= short test summary info ======================================================================== FAILED test_demo.py::test_demo02 - Failed: DID NOT RAISE
===================================================================== 1 failed, 1 passed in 2.14s ====================================================================== ```
始终坚持开源开放共享精神,同时感谢您的充电鼓励和支持!
版权所有,转载本站文章请注明出处:redrose2100, http://blog.redrose2100.com/article/361
上一篇:
Pytest----断言assert的使用方法
下一篇:
Pytest----如何重写断言assert语句的报错信息
搜索
个人成就
出版书籍
《Pytest企业级应用实战》
测试开发技术全栈公众号
测试开发技术全栈公众号
DevOps技术交流微信群
加微信邀请进群
常用网站链接
开源软件洞察
云原生技术栈全景图
Python语言官方文档
Golang官方文档
Docker官方文档
Jenkins中文用户手册
Scrapy官方文档
VUE官方文档
Harbor官方文档
openQA官方文档
云原生开源社区
开源中国
Kubernetes中文文档
Markdown语法官方教程
Kubernetes中文社区
Kubersphere官方文档
BootStrap中文网站
JavaScript中文网
NumPy官方文档
Pandas官方文档
GitLink确实开源网站
数据库排名网站
编程语言排名网站
SEO综合查询网站
数学加减法练习自动生成网站
Kickstart Generator
文章分类
最新文章
最多阅读
特别推荐
×
Close
登录
注册
找回密码
登录邮箱:
登录密码:
图片验证码:
注册邮箱:
注册密码:
邮箱验证码:
发送邮件
注册邮箱:
新的密码:
邮箱验证码:
发送邮件