『德不孤』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 ...
随机推荐
- 【Java常用类】System
System System类代表系统,系统级的很多属性和控制方法都放置在该类的内部. 该类位于java.lang包.由于该类的构造器是private的,所以无法创建该类的对象,其内部的成员变量和成员方 ...
- Android Native -- Message/Handler/Looper机制(应用篇)
⌈Android Native消息队列处理系列文章⌋ Android Native -- Message/Handler/Looper机制(原理篇) Android Native -- Message ...
- 二进制方式搭建Kubernetes高可用集群
转:https://jiangxl.blog.csdn.net/article/details/120428703 详细:https://developer.aliyun.com/article/78 ...
- http中的8种请求介绍
HTTP协议的8种请求类型介绍 HTTP协议中共定义了八种方法或者叫"动作"来表明对Request-URI指定的资源的不同操作方式,具体介绍如下: OPTIONS:返回服务器针对特 ...
- Java方法内联
一.概念 方法内联就是把调用方函数代码"复制"到调用方函数中,减少因函数调用开销的技术 函数调用过程 1.首先会有个执行栈,存储它们的局部变量.方法名.动态连接 2.当一个方法 ...
- ApacheCN Python 译文集 20211108 更新
Think Python 中文第二版 第一章 编程之路 第二章 变量,表达式,语句 第三章 函数 第四章 案例学习:交互设计 第五章 条件循环 第六章 有返回值的函数 第七章 迭代 第八章 字符串 第 ...
- HTML横向二级导航
图片素材没有发,就一个logo还有一个Nav背景图. 效果 HTML <!DOCTYPE html> <html lang="zh-cn"> <hea ...
- Eclipse不能启动,提示:The Eclipse executable launcher was unable to locate its companion launcher jar
原因分析:JDK版本与eclipse不匹配 如jdk和eclipse版本号必须统一,64位都是64位,32位都是32位. jdk版本可以用命令,cmd进入命令窗口,然后输入java -version, ...
- VC里打开网页
转载请注明来源:https://www.cnblogs.com/hookjc/ 1 ShellExecute 开放分类: API 编程 ShellExecute函数原型及参数含义如下: She ...
- PMD的使用学习
是什么? 静态代码分析器 能找出什么问题? 可能的 bugs - 空的 try/catch/finally/switch 声明 死码 - 未使用的本地变量,参数和私有方法 次优代码 - 无用的 Str ...