Pytest学习笔记4-assert断言
前言
pytest作为单元测试框架,自然少不了断言功能,用过unittest的人都知道,在unittest中有丰富的断言方法,比如assertEqual()、assertIn()、assertTrue()、assertIs()等等,而在pytest中,并没有提供特殊的断言方法,而是直接使用python自带的关键字assert来进行断言操作。
下面我们就通过一些来看看在pytest中是如何进行断言操作的吧
常用断言
Pytest
里的断言实际上就是Python中的assert断言方法,常用断言方法如下:
- assert xx :判断 xx 为真
- assert not xx :判断 xx 不为真
- assert a in b :判断 b 包含 a
- assert a == b :判断 a 等于 b
- assert a != b :判断 a 不等于 b
举个:
import pytest
def test_demo1():
a = 1
assert a
def test_demo2():
a = 0
assert not a
def test_demo3():
s = 'hello'
assert 'h' in s
def test_demo4():
a = 3
assert a == 3
def test_demo5():
a = 4
assert a != 3
if __name__ == '__main__':
pytest.main()
运行结果如下:
如果想在异常的时候,能够输出一些提示信息,可在直接在断言后面加上提示信息,如下:
import pytest
def test_demo6():
a = 5
assert a == 3, "两者不相等"
运行结果:
异常断言
在实际测试的过程中,我们经常需要对特定异常进行断言,可以使用 pytest.raises 作为上下文管理器,当抛出异常时可以获取到对应的异常实例
举个:
import pytest
def test_zero_division():
1 / 0
if __name__ == '__main__':
pytest.main()
运行结果:
可以看到,这里程序异常了,所以我们需要捕获并断言异常。
断言场景:断言抛出的异常是否符合预期。
预期结果:ZeroDivisionError: division by zero,其中ZeroDivisionError为错误类型,division by zero为具体错误值。
断言方式: 断言异常的type和value值。
断言代码如下:
import pytest
def test_zero_division():
with pytest.raises(ZeroDivisionError) as excinfo:
1 / 0
# 断言异常类型 type
assert excinfo.type == ZeroDivisionError
# 断言异常 value 值
assert "division by zero" in str(excinfo.value)
if __name__ == '__main__':
pytest.main()
excinfo作为异常信息实例,拥有type 、value、.traceback等属性
excinfo.value的值是元组,所以要转成字符串
在上下文管理器的作用域中,raises代码必须是最后一行,否则,其后面的代码将不会执行
拓展:match
你也可以给pytest.raises()
传递一个关键字参数match
,来测试异常的字符串表示str(excinfo.value)
是否符合给定的正则表达式(和unittest
中的TestCase.assertRaisesRegexp
方法类似):
import pytest
def func():
raise ValueError("Exception 123 raised")
def test_match():
# pytest.raises()函数,
# 可以用元组的形式传递参数,只需要触发其中任意一个即可。
# 通过match可以设置通过正则表达式匹配异常。
with pytest.raises((ValueError, RuntimeError), match=r'.* 123 .*') as excinfo:
func()
assert “123” in str(excinfo.value)
if __name__ == '__main__':
pytest.main()
拓展:检查断言装饰器
pytest.mark.xfail()
也可以接收一个raises
参数,来判断用例是否因为一个具体的异常而导致失败:
@pytest.mark.xfail(raises=ZeroDivisionError)
def test_f():
1 / 0
执行结果:
如果
test_f()
触发的异常类型和raises指定的异常类型一致,则用例被标记为xfailed
如果
test_f()
测试成功,用例的结果是xpassed
,而不是passed
pytest.raises
适用于检查由代码故意引发的异常;而@pytest.mark.xfail()
更适合用于记录一些未修复的 Bug
参考
Pytest学习笔记4-assert断言的更多相关文章
- [转载]pytest学习笔记
pytest学习笔记(三) 接着上一篇的内容,这里主要讲下参数化,pytest很好的支持了测试函数中变量的参数化 一.pytest的参数化 1.通过命令行来实现参数化 文档中给了一个简单的例子, ...
- Pytest学习(二) - 断言的使用
一.前言 学习pytest总会习惯性的和unittest对比使用,自然就断言pytest和unittest也是有些区别的. 二.断言对比 unittest 断言 assertEqual(a, b) # ...
- pytest自动化7:assert断言
前言:assert断言就是将实际结果和期望结果做对比,符合预期结果就测试pass,不符合预期就测试failed. 实例1:简单断言 实例1优化版--增加异常信息文字描述 异常断言 excinfo 是一 ...
- Pytest(10)assert断言
前言 断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了.什么是断言呢? 简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试 failed ...
- pytest学习笔记
From: https://blog.csdn.net/gaowg11/article/details/54910974 由于对测试框架了解比较少,所以最近看了下pytest测试框架,对学习心得做个记 ...
- pytest 学习笔记一 入门篇
前言 之前做自动化测试的时候,用的测试框架为Python自带的unittest框架,随着工作的深入,发现了另外一个框架就是pytest (官方地址文档http://www.pytest.org/en/ ...
- pytest学习笔记(一)
这两天在学习pytest,之前有小用到pytest,觉得这个测试框架很灵巧,用在实现接口自动化(pytest+requests)非常的轻便,然后很有兴致的决定学习下,然后又发现了pytest-sele ...
- Pytest学习笔记11-重复执行用例插件pytest-repeat
前言 我们在平时做测试的时候,经常会遇到一些偶现的bug,通常我们会多次执行来复现此类bug,那么在自动化测试的时候,如何多次运行某个或某些用例呢,我们可以使用pytest-repeat这个插件来帮助 ...
- Pytest学习笔记12-配置文件pytest.ini
前言 pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行. 常用的配置项 marks 作用:测试用例中添加了自定义标记( ...
随机推荐
- ES6新增常用方法
字符串新增方法 padStart.padEnd 如果原字符串不够指定长度,则会在左侧(右侧)填充字符串,用以补全 padStart( length: number, fillStr?: string ...
- LINQ之查询语法
新开一节LINQ的入门讲解. LINQ(Language Integrated Query)语言集成查询,是C#语言的扩展,它的主要功能是从数据集中查询数据,就像通过sql语句从数据库查询数据一样(本 ...
- Linux的三剑客
首先,需要介绍一下管道和正则表达式,因为它经常和Linux三剑客一起使用. 一.管道Linux 提供管道符"|",将两个命令隔开,管道符左边命令的输出作为管道符右边命令的输入. c ...
- 使用Qt实现一个必应壁纸客户端
概要 必应的每日壁纸很好看,但是看不到一周以前的壁纸图片,日前使用python开发了必应壁纸收集站,可惜这样的收集站只能在线浏览,我在想要是有一款软件能够下载每日必应壁纸,并应用到windows的桌面 ...
- 理解RESTful架构——Restful API设计指南
理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...
- 强哥PHP面向对象学习笔记
面向对象编程OOP目标:重用性.灵活性.扩展性特点:封装.继承.多态 类的书写方法:class PersionName{} 特征:属性.其实就是变量行为:方法.其实就是函数 1.实例化对象2.对象中成 ...
- 如何在我的EC2实例状态更改时获取自定义电子邮件通知
具体详情,请参见: https://amazonaws-china.com/cn/premiumsupport/knowledge-center/ec2-email-instance-state-ch ...
- Java反射机制详情(2)
| |目录 运行环境 Java语言的反射机制 Class中的常用方法(获得类的构造方法) Class中的常用方法(获得类的属性) Class中的常用方法(获得类的方法) 反射动态调用类的成员 1.运行 ...
- mysql数据库-日志管理
MySQL 支持丰富的日志类型 事务日志:transaction log 事务日志的写入类型为"追加",因此其操作为"顺序IO":通常也被称为:预写式日志 wr ...
- 项目中添加lib依赖
Project Structure-->Artifacts