Python的pytest框架(2)--断言机制

接上篇文章,我们使用pytest框架,实现自动发现并执行用例,接着利用断言语句判断测试结果,最后生成报告。这篇文章我们就断言机制来展开,深入学习进阶pytest框架的断言机制:

目录

一、基本断言

使用Python原生assert语句

兼容unittest断言方法

二、断言重写

1. 使用assert语句配合自定义错误消息

2. 编写自定义断言函数

3. 使用unittest.TestCase及其断言方法

三、断言的丰富表达式

1、使用逻辑运算符组合断言

2、利用列表推导式或生成器表达式

3、结合使用上下文管理器和断言

4、使用集合操作验证元素存在性


一、基本断言

1、使用Python原生assert语句

pytest的断言机制基于Python语言的内置assert语句,并在此基础上进行了增强,使其更适合测试场景。pytest鼓励直接使用Python的assert语句来进行断言。在测试函数中,只需编写assert condition或assert expression,当条件为False或表达式求值结果为False时,assert语句将抛出AssertionError异常,标志着测试失败。常用的断言语句如下所示:

assert condition: 最基础的断言形式,检查 condition 是否为真。如果 condition 为假(即 False),则断言失败。

assert expr1 == expr2: 检查两个表达式(如变量、值或函数返回结果)是否相等。如果不相等,断言失败。

assert expr1 != expr2: 检查两个表达式是否不相等。如果相等,断言失败。

assert expr1 is expr2: 检查两个对象是否是同一个对象(即它们有相同的内存地址)。如果不是同一个对象,断言失败。

assert expr1 is not expr2: 检查两个对象是否不是同一个对象。如果是同一个对象,断言失败。

assert expr1 in collection: 检查 expr1 是否是 collection(如列表、元组、集合、字典键等)的成员。如果不是成员,断言失败。

assert expr1 not in collection: 检查 expr1 是否不是 collection 的成员。如果是成员,断言失败。

assert expr1 < expr2, assert expr1 <= expr2, assert expr1 > expr2, assert expr1 >= expr2: 对于数值或可比较的对象,检查它们之间的关系是否满足指定的条件(小于、小于等于、大于、大于等于)。如果不满足,断言失败。

assert almost_equal(expr1, expr2, *, rel_tol=..., abs_tol=...): (需导入 from pytest import approx)检查两个浮点数或可迭代的浮点数集合是否近似相等,可以指定相对误差(rel_tol)和绝对误差(abs_tol)。

assert raises(ExpectedException, func, *args, **kwargs): (需导入 from pytest import raises)检查调用 func(*args, **kwargs) 是否引发指定的异常 ExpectedException。如果没有引发该异常或引发了不同类型的异常,断言失败。

2、兼容unittest断言方法

pytest虽然鼓励使用原生assert,但也完全兼容unittest模块中的断言方法,如assertEqual、assertTrue、assertFalse、assertIn等。如果你更喜欢使用这些方法,pytest同样能够正确处理它们引发的异常。如:

from unittest import TestCaseclass TestMyClass(TestCase):def test_my_method(self):result = MyClass().my_method()self.assertEqual(result, expected_value)

使用unittest断言方法时,pytest会显示方法名和其参数作为错误消息的一部分,同样有助于理解测试失败的原因。

二、断言重写

在某些情况下,可能需要自定义断言行为,例如添加更详细的错误消息、改变失败条件,或者实现特定领域的复杂验证逻辑。pytest 允许通过以下方式实现断言重写:

1、使用assert语句配合自定义错误消息

pytest支持在assert语句后附加一个字符串作为自定义错误消息。当断言失败时,这个消息将与测试失败信息一起显示,提供额外的上下文信息。例如:

def divide(x,y):return x/ydef test_division():result = divide(10, 2)assert result == 5, f"期望输出值为5, 实际输出结果为{result}"

在这个例子中,如果result不等于5,pytest将显示你提供的错误消息,包含预期值和实际值。

2、编写自定义断言函数

对于特定领域的复杂验证逻辑,可以编写自定义的断言函数。这些函数内部执行具体的验证逻辑,并在断言失败时抛出AssertionError。例如:

def is_prime(number):if number < 2:return Falsefor i in range(2, int(number ** 0.5) + 1):if number % i == 0:return Falsereturn Truedef assert_is_prime(number, msg=None):if not is_prime(number):raise AssertionError(msg or f"{number} 不是质数")def test_primes():assert_is_prime(4)assert_is_prime(17)test_primes()

在这个例子中,assert_is_prime函数封装了对素数的验证逻辑。当提供的数不是素数时,函数抛出AssertionError,附带自定义的错误消息。

3、使用unittest.TestCase及其断言方法

pytest兼容unittest.TestCase及其丰富的断言方法。这些方法提供了更详细的错误消息和特定类型的断言。例如:

from unittest import TestCaseclass TestMyClass(TestCase):def test_my_method(self):result = MyClass().my_method()self.assertEqual(result, expected_value, msg="Custom error message")

在这个例子中,self.assertEqual方法不仅检查result是否等于expected_value,还接受一个可选的msg参数,用于指定自定义的错误消息。

三、断言的丰富表达式

pytest 的断言不仅限于简单的布尔条件判断,还可以利用 Python 的表达式能力创建更复杂的验证逻辑。一下一些示例:

1、使用逻辑运算符组合断言

利用 and、or 和 not 等逻辑运算符连接多个断言条件。

assert result is not None and result.success and len(result.data) > 0assert result is not None and result==0 or result==1

and 是两个条件需同时满足;or是两个条件满足其中一个就可以;not是取反

2、利用列表推导式或生成器表达式

对于需要验证集合中所有元素满足某种条件的情况,可以使用列表推导式或生成器表达式配合 all() 或 any() 函数。

assert all(isinstance(item, int) for item in my_list)assert any(isinstance(item, str) for item in my_list1)

all( )函数必须所有都满足条件,any( )函数只要有一个满足条件就通过

3、结合使用上下文管理器和断言

 在 with 语句中结合使用上下文管理器(如 contextlib.suppress 或自定义上下文管理器)和断言,以优雅地处理预期的异常或资源清理。

with pytest.raises(ValueError):function_that_should_throw_value_error()

断言在执行 function_that_should_throw_value_error() 函数时,是否抛出了 ValueError 异常。如果没有抛出该异常或者抛出了不同类型的异常,断言将失败。

4、使用集合操作验证元素存在性

expected_elements = {1, 3, 5}
result_list=[1, 3, 5, 5,3]
assert set(result_list).issubset(expected_elements)

还有很多多元、复合、甚至是依赖特定数据结构和算法逻辑的验证场景,我们都可以使用相应的表达式去构造复杂的验证逻辑。

希望本篇文章能有效帮助各位同学掌握pytest框架的断言方法!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1688官方API商品数据采集接口|阿里巴巴中国站获得1688商品详情 API 返回值说明

随着全球经济一体化和电子商务的快速发展&#xff0c;网络购物的需求日益增加。不断涌现的电商企业使得行业的竞争情况愈演愈烈。在这种情况下&#xff0c;企业不仅要加大经营力度&#xff0c;还要在自己的基础设施和技术上持续投入&#xff0c;才能更好的适应市场和消费习惯。…

飞桨Ai(一)基于训练后的模型进行信息提取

基准 本博客基于如下视频&#xff1a; 发票抬头信息抽取之环境搭建 - 基于飞浆开源项目发票抬头信息抽取之数据标准模型训练 - 基于飞浆开源项目 步骤 1、准备工作 下载python&#xff1a;【Python】Windows&#xff1a;Python 3.9.2 下载和安装&#xff08;建议3.9&#…

算法第42天动态规划4

416 分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等 def canPartition(nums:List[int])->bool:total_sumsum(nums)if total_sum%2!0:return Falsetarget_sumtotal_sum//2dp[[Fal…

数通HCIE考试分享:考前心态很重要,心情放松好过一次练习

誉天数通HCIE晚班火热预约中&#xff01;真机实验考前辅导备考资料&#xff0c;名师保驾护航&#xff0c;助你稳定通关&#xff01;识别二维码&#xff0c;即可获取免费试听名额&#xff01; 备考阶段 我是去年10月底完成了笔试考试&#xff0c;在笔试之前就将PY的课程过了一遍…

Spark面试整理-Spark集成Kafka

Apache Spark和Apache Kafka的集成使得实时数据流处理成为可能。Kafka是一个分布式流处理平台,主要用于构建实时数据管道和流应用。而Spark是一个大规模数据处理工具,可以对大量数据进行批处理和实时处理。 Spark集成Kafka主要通过Spark Streaming或者Structured Streaming实…

AI-Agent入门

主要参考资料 AI Agent&#xff08;或者LLM Agent&#xff09;深度讲解——组成、方法、案例及展望: https://zhuanlan.zhihu.com/p/676544930 产品经理研读&#xff1a;Agent的九种设计模式(图解代码): https://mp.weixin.qq.com/s/9CRzuNgnwyq3-tkqnTA6TA 特工宇宙与产品二姐…

力扣算法-回溯

递归 104.二叉树的最大深度 回溯 17.电话号码的字母组合 ①子集型回溯 78.子集 (1)选不选 (2)选哪个 131.分割回文串 &#xff08;1593.拆分字符串使唯一子字符串的数目最大 也可以用这个思路解&#xff1a;从结果角度&#xff0c;分割字符串&#xff09; ②组合型回溯…

[leetcode] 55. 跳跃游戏

文章目录 题目描述解题方法模拟java代码复杂度分析 相似题目 题目描述 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 tr…

CentOS系统常用命令

CentOS系统是基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的流行Linux发行版&#xff0c;它在服务器和桌面环境中广泛使用。以下是一些在CentOS系统中常用的命令及其用法&#xff1a; 1. **文件和目录操作** - ls&#xff1a;列出目录内容ls -lh # 以易读的格式…

SqL--DCL数据控制语言

文章目录 数据控制语言用户角色 赋权收权删除用户自定义角色 数据控制语言 用户 用户&#xff1a;用来登录数据库的账号 需要有权限的用户或者管理员用户system 创建用户&#xff1a; 语法&#xff1a; CREATE USER 用户名 IDENTIFIED BY 密码;注意&#xff1a;1.此时的用户…

杀死那个名为360安全的软件

背景 2023年底&#xff0c;闲来没事想起了xjun师傅2021年发的procexp驱动利用帖子时在群里讨论的&#xff0c;通过procexp驱动突破PPL后注入到csrss进程中&#xff0c;再通过csrss来结束那些个安全防护软件。于是在当时就有了如下成果&#xff1a; 这些弄完之后&#xff0c;觉…

冯诺依曼与进程【Linux】

文章目录 冯诺依曼体系结构&#xff08;从硬件的角度描述&#xff09;冯诺依曼体系结构&#xff08;从软件的角度描述&#xff09;操作系统&#xff08;软件&#xff09;理解管理系统调用和库函数进程查看进程的两种方式 通过系统调用获取进程的PID和PPID通过系统调用创建进程-…

C++ Primer是每位C++ coder心中的圣经吗?

首先&#xff0c;C Primer的作者是Stanley B. Lippman、Jos Lajoie和Barbara E. Moo。Stanley B. Lippman是C领域的知名专家&#xff0c;他在C标准委员会中担任过要职&#xff0c;对C语言的发展有深刻的理解。Jos Lajoie和Barbara E. Moo也都是C领域的资深专家&#xff0c;他们…

回归预测 | Matlab实现WOA-BP鲸鱼算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现WOA-BP鲸鱼算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现WOA-BP鲸鱼算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现WOA-BP鲸鱼算法优化BP神经网络多变量回归预测&#xff08;完整源码…

QT QThread +信号量 实现生成者和消费者

//本文详细描述QT 中QThread 信号量 实现生成者和消费者。 //调试通过。 //这个例子演示了怎样使用QSemaphore 信号量来保护对生成者线程和消费者线程共享的环形缓冲 //区的访问。 //生成者向缓冲区中写入数据&#xff0c;直到达到缓冲区的终点&#xff0c;这时它会从起点重…

各大厂都推出鸿蒙APP了,你就一定要学习一下鸿蒙APP测试了!

2023年8月&#xff0c;华为推出鸿蒙4.0&#xff0c;由于其广泛的用户基础和品牌传播力&#xff0c;在短短几个月的时间&#xff0c;使用鸿蒙4.0系统的设备就达到千万级别&#xff0c;并且在9月份发售Mate 6之后&#xff0c;还在装机量的增长更加迅猛。 基于此&#xff0c;11月…

AMD新一代AI PC芯片惊艳登场!颠覆商业计算领域!

AMD发布新一代AI PC芯片 前言 就在北京时间4月17日&#xff0c;AMD正式面向商业计算领域推出新一代AI PC创新产品&#xff01;他们宣布推出锐龙Pro 8040系列和AMD锐龙Pro 8000系列&#xff0c;扩展其商用移动和桌面AI个人电脑&#xff08;PC&#xff09;产品组合。 了解PRO 804…

【Vue3】setup语法糖的使用

文章目录 setup简介使用vite-plugin-vue-setup-extend插件 指定组件名字 setup简介 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖 相比较普通的<script> ,它有以下优势&#xff1a; 更少的样板内容&#xff0c;更简洁的代码。能够使用纯…

基于SpringBoot的“人职匹配推荐系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“人职匹配推荐系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 网上商城购物系统结构图 管理员登录界面图 个…

flask 应用程序

flask 程序示例 创建 hello.py 文件&#xff1a; # 导入 Flask 模块。Flask 类的一个对象是 wsgi 应用程序。 from flask import Flask# 创建app对象, Flask构造函数将当前模块的名称(__name__)作为参数。 app Flask(__name__)# route() 函数是一个装饰器&#xff0c;它告诉应…