『德不孤』Pytest框架 — 8、Pytest断言
1、什么是断言
对于测试来讲,不管是功能测试,自动化测试,还是单元测试,一般都会预设一个正确的预期结果,而在测试执行的过程中会得到一个实际的结果。
测试的成功与否就是拿实际的结果与预期的结果进行比较,这个比的过程就是断言(assert)。
2、Pytest断言
- 与Unittest不同,Pytest使用的是Python自带的
assert关键字来进行断言。 assert关键字后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行则为成功,否则用例执行失败。
3、Pytest的断言方式及应用场景
(1)使用assert语句
Pytest里面的断言实际上就是Python里面的assert断言方法。
1)比较大小与是否相等:
assert a == b:判断a等于bassert a !=b:判断a不等于b
2)判断包含或不包含:
assert a in b:判断b包含aassert a not in b:判断b不包含a
提示:b可以是字符串,可以是列表,元组等都可以。
3)对类型的判断:
assert isinstance(a,int):判断a是否是int类型数据。
4)判断方法或者函数的返回值是否为真:
assert xx:判断xx结果为真。assert not xx:判断xx结果不为真。
例如:
#用于判断素数
def is_prime(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
# 判断是否为素数
def test_true():
assert is_prime(13)
# 或者不为素数
assert not is_prime(13)
基本上常用的就这么几种。
(2)断言预期的异常
将异常信息存储到一个变量中,变量的类型则为异常类,包含异常的type、value和traceback等信息
import pytest
def test_exception_value():
with pytest.raises(ZeroDivisionError) as zero:
1 / 0 # 此处可以是方法,也可以是表达式
# print(zero) <ExceptionInfo ZeroDivisionError('division by zero') tblen=1>
# print(zero.tb)# <traceback object at 0x0000021B6068BD48>
# print(zero.typename) # 字符串"ZeroDivisionError"
# print(zero.type) # 异常类型<class 'ZeroDivisionError'>
print(zero.traceback)
assert "division by zero" in str(zero.value)
assert zero.type == ZeroDivisionError
assert zero.typename == "ZeroDivisionError"
if __name__ == '__main__':
pytest.main()
注意:在上下文管理器的作用域中,raises代码必须是最后一行,否则其后面的代码将不会执行。
(3)拓展
如果我们不知道预期异常的是什么,我们可以使用 match 和 raise 进行自定义异常。
给pytest.raises()函数传递一个关键字参数match,通过match设置的字符串正则表达式匹配异常信息。
和Unittest中的TestCase.assertRaisesRegexp方法类似。
示例:
import pytest
# myfunc函数会抛出一个异常,
def myfunc():
raise ValueError("Exception 123 raised")
def test_match():
# pytest.raises()函数,
# 可以用元组的形式传递参数,只需要触发其中任意一个即可。
# 通过match可以设置通过正则表达式匹配异常。
with pytest.raises((ValueError, RuntimeError), match=r'.* 123 .*') as ve:
myfunc()
# 说明:myfunc()抛出的异常被match设置的字符串匹配到
# 也就是捕获到了该异常。
# 然后下面是断言,123是否包含在捕获异常的说明中。
assert "123" in str(ve.value)
if __name__ == '__main__':
pytest.main()
4、优化断言
我们可以在异常的时候,输出一些提示信息,这样报错后,可以方便我们来查看原因。
示例如下:
import pytest
def func():
return 100
def test_case_666():
a = func()
assert a % 3 == 0, "判断a是否能被3整除,当前a的值为:%s" %a
if __name__ == '__main__':
pytest.main()
"""
运行结果:
========没加注释的测试结果==========
Expected :0
Actual :1
<Click to see difference>
def test_case_666():
a = 100
> assert a % 3 == 0
E assert 1 == 0
test_01.py:55: AssertionError
Assertion failed
========添加注释的测试结果==========
Expected :0
Actual :1
<Click to see difference>
def test_case_666():
a = 100
> assert a % 3 == 0, "判断a是否能被3整除,当前a的值为:%s" %a
E AssertionError: 判断a是否能被3整除,当前a的值为:100
E assert 1 == 0
test_01.py:53: AssertionError
Assertion failed
"""
5、使用标记检查异常
使用注释:@pytest.mark.xfail(raises=ZeroDivisionError)
示例:
import pytest
@pytest.mark.xfail(raises=ZeroDivisionError)
def test_exception_value():
1 / 0
if __name__ == '__main__':
pytest.main()
# 说明代码:
# 预期抛出ZeroDivisionError异常,
# 实际测试用例执行也抛出了ZeroDivisionError异常。
# 测试结果:该用例是xfailed
『德不孤』Pytest框架 — 8、Pytest断言的更多相关文章
- 『德不孤』Pytest框架 — 1、Pytest测试框架介绍
目录 1.什么是单元测试框架 2.单元测试框架主要做什么 3.单元测试框架和自动化测试框架有什么关系 4.Pytest测试框架说明 5.Pytest框架和Unittest框架区别 (1)Unittes ...
- 『德不孤』Pytest框架 — 2、Pytest的基本使用
目录 1.Pytest安装 2.Pytest常用插件 3.Pytest运行的第一个例子 4.Pytest框架的运行方式 5.在PyCharm中以Pytest的方式运行测试用例 1.Pytest安装 C ...
- 『德不孤』Pytest框架 — 3、Pytest的基础说明
目录 1.Pytest参数介绍 2.Pytest框架用例命名规则 3.Pytest Exit Code说明 4.pytest.ini全局配置文件 5.Pytest执行测试用例的顺序 1.Pytest参 ...
- 『德不孤』Pytest框架 — 10、setUp()和tearDown()函数
目录 1.setUp()和tearDown()函数介绍 2.setUp()和tearDown()函数作用 3.setUp()和tearDown()函数说明 4.示例 (1)方法级 (2)类级 (3)函 ...
- 『德不孤』Pytest框架 — 11、Pytest中Fixture装饰器(一)
目录 1.Fixture装饰器的用途 2.Fixture参数说明 3.Fixture装饰器简单应用 4.yield执行后置函数 1.Fixture装饰器的用途 做测试前后的初始化设置,如测试数据准备, ...
- 『德不孤』Pytest框架 — 14、Pytest中的conftest.py文件
目录 1.conftest.py文件介绍 2.conftest.py的注意事项 3.conftest.py的使用 4.不同位置conftest.py文件的优先级 5.conftest.py中Fixtu ...
- 『德不孤』Pytest框架 — 15、Pytest参数化
目录 1.Pytest参数化说明 2.Pytest参数化方式 3.parametrize装饰器参数说明 4.Pytest参数化(单个参数) 5.Pytest参数化(多个参数) 6.ids参数说明 1. ...
- 『德不孤』Pytest框架 — 6、Mark分组执行测试用例
目录 1.Pytest中的Mark介绍 2.Mark的使用 3.Mark的注册和使用 4.使用Mark完成失败重试 5.扩展 1.Pytest中的Mark介绍 Mark主要用于在测试用例/测试类中给用 ...
- 『德不孤』Pytest框架 — 12、Pytest中Fixture装饰器(二)
目录 5.addfinalizer关键字 6.带返回值的Fixture 7.Fixture实现参数化 (1)params参数的使用 (2)进阶使用 8.@pytest.mark.usefixtures ...
随机推荐
- 【reverse】逆向7 堆栈图
[reverse]逆向7 堆栈图 前言 本章就是开始画堆栈图来打基础拉,堆栈熟悉了之后就可以开始C语言的逆向了. 这一章使用的exe文件,我已经上传到了我的个人网盘中,点击下载 1.准备工作 先看这张 ...
- Docker 与 K8S学习笔记(十九)—— Pod的配置管理
我们在部署应用时常常会考虑将应用程序与配置文件相分离,这样可以使应用程序更好的复用,并且通过不同配置也能实现更灵活的功能.将应用制作成镜像后,我们可以在启动容器时通过环境变量或挂载文件的方式注入,但是 ...
- Vi方向键变乱码 退格键不能使用
Ubuntu下,使用vi的时候有点问题,就是在编辑模式下使用方向键的时候,并不会使光标移动,而是在命令行中出现[A [B [C [D之类的字母,而且编辑错误的话,就连平时关于的退格键(Backspac ...
- 免密码提交gitlab
在你的用户目录下新建一个文本文件.git-credentials echo 'https://henry:123456@ggithub.com' > /root/.git-credentials ...
- Zookeeper 源码解析-环境准备
为了深入学习Zookeeper,准备把zookeeper源码导入eclipse中学习 一.Ant环境准备 因为我自己用的是Mac,直接输入命令:brew install ant即可 如果是window ...
- springboot 修改关闭banner的方法
一.修改banner. 1.1 替换banner: 需要在resources(classpath)目录中创建文件 banner.txt 1.2 上图 banner.txt 里面可以使用文字,也可以 ...
- Google hacker
转载请注明来源:https://www.cnblogs.com/hookjc/ Google Hacking其实并算不上什么新东西,在早几年我在一些国外站点上就看见过相关的介绍,但是由于当时并没有重视 ...
- axios ajax fetch 区别以及优缺点
将jQuery的ajax.axios和fetch做个简单的比较,所谓仁者见仁智者见智,最终使用哪个还是自行斟酌 1.jQuery ajax $.ajax({ type: 'POST', url: ur ...
- web容器、sevlet容器、spring容器、springmvc容器之间的关系
原文链接:http://www.cnblogs.com/jieerma666/p/10805966.html https://blog.csdn.net/zhanglf02/article/detai ...
- php函数(parse_str()
parse_str()函数 把查询字符串解析到变量中 parse_str(string, array); string 规定要解析的字符串 array 存储变量的数组名称 例子: <?php p ...