Pytest之断言
时间:2022-07-23
本文章向大家介绍Pytest之断言,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文4633字,阅读约需12分钟
在上一篇Pytest系列文章:Pytest之收集用例及命令行参数,主要介绍Pytest用例收集规则及常用的命令行参数。
在自动化测试过程中,需要判断预期结果和实际结果是否一致,这时需要使用到断言。
什么是断言呢?简单来说就是实际结果和期望结果去对比。
一
断言用法
在pytest中,使用assert进行断言,格式为:assert 表达式。
如果表达式返回结果为True,则断言成功,否则断言失败。
二
常用断言
unittest
的三种断言:
assertIn(expect,result)断言包含(被包含的写前面);
assertEqual(expect,result)断言相等;
assertTure(条件)断言是否为真。返回Ture或False;
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()
运行结果如下:
Testing started at 18:22 ...
C:Users96984DesktopcodepytestvenvScriptspython.exe "C:ruanjianpycharm2019.3PyCharm 2019.3.1pluginspythonhelperspycharm_jb_pytest_runner.py" --path C:/Users/96984/Desktop/code/pytest/demo/demo_pytest.py
Launching pytest with arguments C:/Users/96984/Desktop/code/learn_pytest/demo/demo_pytest.py in C:Users96984Desktopcodelearn_pytestdemo
============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 -- C:Users96984Desktopcodelearn_pytestvenvScriptspython.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.8', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'html': '2.1.1', 'metadata': '1.10.0'}, 'JAVA_HOME': 'C:\Program Files\Java\jdk1.8.0_77'}
rootdir: C:Users96984Desktopcodelearn_pytestdemo
plugins: html-2.1.1, metadata-1.10.0
collecting ... collected 5 items
demo_pytest.py::test_demo1 PASSED [ 20%]
demo_pytest.py::test_demo2 PASSED [ 40%]
demo_pytest.py::test_demo3 PASSED [ 60%]
demo_pytest.py::test_demo4 PASSED [ 80%]
demo_pytest.py::test_demo5 PASSED [100%]
============================== 5 passed in 0.06s ==============================
Process finished with exit code 0
三
异常断言
在测试过程中,有时需要对特定异常进行断言,可以使用 pytest.raises 作为上下文管理器,当抛出异常时可以获取到对应的异常实例。
import pytest
def test_zero_division():
1 / 0
if __name__ == '__main__':
pytest.main()
运行结果:
================================== FAILURES ===================================
_____________________________ test_zero_division ______________________________
def test_zero_division():
> 1 / 0
E ZeroDivisionError: division by zero
所以我们需要捕获并断言异常。
断言场景:断言抛出的异常是否符合预期。
预期结果:ZeroDivisionError: division by zero,其中ZeroDivisionError为错误类型,division by zero为具体错误值。
断言方式: 断言异常的type和value值。
断言代码如下:
import pytest
def test_zero_division_long():
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()
代码详细说明:
① pytest.raises 捕获异常,源码如下:
def raises( # noqa: F811
expected_exception: Union["Type[_E]", Tuple["Type[_E]", ...]],
*args: Any,
**kwargs: Any
) -> Union["RaisesContext[_E]", _pytest._code.ExceptionInfo[_E]]:
__tracebackhide__ = True
for exc in filterfalse(
inspect.isclass, always_iterable(expected_exception, BASE_TYPE) # type: ignore[arg-type] # noqa: F821
):
msg = "exceptions must be derived from BaseException, not %s"
raise TypeError(msg % type(exc))
message = "DID NOT RAISE {}".format(expected_exception)
if not args:
match = kwargs.pop("match", None)
if kwargs:
msg = "Unexpected keyword arguments passed to pytest.raises: "
msg += ", ".join(sorted(kwargs))
msg += "nUse context-manager form instead?"
raise TypeError(msg)
return RaisesContext(expected_exception, message, match)
else:
func = args[0]
if not callable(func):
raise TypeError(
"{!r} object (type: {}) must be callable".format(func, type(func))
)
try:
func(*args[1:], **kwargs)
except expected_exception as e:
# We just caught the exception - there is a traceback.
assert e.__traceback__ is not None
return _pytest._code.ExceptionInfo.from_exc_info(
(type(e), e, e.__traceback__)
)
fail(message)
raises.Exception = fail.Exception # type: ignore
② excinfo作为异常信息实例,拥有type 、value等属性,源码如下:
@property
def type(self) -> "Type[_E]":
"""the exception class"""
assert (
self._excinfo is not None
), ".type can only be used after the context manager exits"
return self._excinfo[0]
@property
def value(self) -> _E:
"""the exception value"""
assert (
self._excinfo is not None
), ".value can only be used after the context manager exits"
return self._excinfo[1]
③ excinfo.value的值是元组,所以要转成字符串。
以上
That‘s all
- 项目心得:广度遍历搜索部门处理业务
- 使用JAVA开发微信公众平台(一)——环境搭建与开发接入
- BZOJ4805: 欧拉函数求和(杜教筛)
- centos7.x下搭建netcore环境和helloworld的demo
- ARM coretex M4 系统定时器
- 用实例说明如何用JavaScript生成XML
- 51nod 1244 莫比乌斯函数之和(杜教筛)
- 几个比较有意思的JS脚本
- Java多线程高并发学习笔记——阻塞队列
- 使用javascript+xml实现分页
- 使用OAuth打造webapi认证服务供自己的客户端使用
- 洛谷P3381 【模板】最小费用最大流(dijstra费用流)
- 使用OAuth打造webapi认证服务供自己的客户端使用(二)
- JavaScript基础1
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- lombok 表达式的相关特性
- 写给前端程序员的英文学习指南
- 浅谈spring aop的实现原理和实现过程
- Cypress系列(60)- 运行时的截图和录屏
- 请停止使用Excel进行数据分析,升级到Python吧
- git版本控制器的相关操作
- 离线 Android Studio 环境
- Actor:人生如戏全靠演技--“三维度”逻辑编程语言的设计(3) 角色是一种特定的关系名不正言不顺角色才是真正的主人演员的天分再好的演技也需要角色好演员更需要好剧本
- 2.CSS选择器-CSS基础
- es6 随性学习之let,const与var的区别
- 04-操作文件和目录 遇到的坑
- 1.CSS单位-CSS进阶
- Geode集群搭建
- 2.CSS特性-CSS进阶
- 5.图片-HTML基础