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

news/2025/1/2 2:37:43/

接上篇文章,我们使用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同样能够正确处理它们引发的异常。如:

python">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语句后附加一个字符串作为自定义错误消息。当断言失败时,这个消息将与测试失败信息一起显示,提供额外的上下文信息。例如:

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

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

2、编写自定义断言函数

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

python">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及其丰富的断言方法。这些方法提供了更详细的错误消息和特定类型的断言。例如:

python">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 等逻辑运算符连接多个断言条件。

python">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() 函数。

python">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 或自定义上下文管理器)和断言,以优雅地处理预期的异常或资源清理。

python">with pytest.raises(ValueError):function_that_should_throw_value_error()

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

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

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

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

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


http://www.ppmy.cn/news/1426259.html

相关文章

pycharm-git 配置(1)

1.安装git2.pycharm 中配置git 插件 弹出Git版本号&#xff0c;即配置成功。3.创建本地仓库 VCS->VCS operations->create repository->设置本地目录 左下角可以看到git本地仓库git可以看到push,commit。 4.配置远方仓库&#xff0c;此时确保git上是有这个项目…

transformer上手(3) —— 开箱即用的 pipelines

1 开箱即用的 pipelines Transformers 库将目前的 NLP 任务归纳为几下几类&#xff1a; 文本分类&#xff1a;例如情感分析、句子对关系判断等&#xff1b;对文本中的词语进行分类&#xff1a;例如词性标注 (POS)、命名实体识别 (NER) 等&#xff1b;文本生成&#xff1a;例如…

【C语言回顾】数组

前言1. 数组2. 一维数组2.1 一维数组的创建2.2 一维数组的初始化2.3 一维数组的使用2.3.1 一维数组的下标2.3.2 一维数组的输入和输出 2.4 一维数组在内存中的存储 3. 二维数组3.1 二维数组的创建3.2 二维数组的初始化3.3 二维数组的使用3.3.1 二维数组的下标3.3.2 二维数组的输…

微信小程序英文版:实现一键切换中英双语版(已组件化)

已经重新优化代码做成了组件&#xff0c;需要可自取&#xff1a;https://github.com/CrystalCAI11/wechat-language-compoment 所有操作都打包在组件里不需要在额外的地方添加代码&#xff0c;直接在你需要的页面里导入组件&#xff0c;再在对应页面的onLoad()里set文本就行了。…

哈尔滨等保测评知识分享(七)

21.测评方式 &#xff08;1&#xff09;访谈&#xff1a; 测评人员通过与测评对象有关人员&#xff08;个人/群体&#xff09;进行交流、讨论等活动获取相关证据表明测评对象安全保护措施是否落实的一种方法。在访谈的范围上&#xff0c;应基本覆盖所有的安全相关人员类型&am…

使用Termux在Android设备上编译运行SpecCPU2006

Spec CPU 2006 的使用说明&#xff08;曲线救国版&#xff09; 因本部分实验用到的Spec CPU2006依赖于多个编译工具包&#xff0c;因此对源码的编译要在配置好环境的Linux设备上运行&#xff0c;根据实验发现&#xff0c;现有的环境&#xff08;包括adb和termux&#xff09;都不…

MS SQL Server partition by 函数实战 统计与输出

目录 需求 范例运行环境 表及视图样本设计 数据统计实现 小结 需求 假设有一课程项目&#xff0c;我们需要统计该项目中的课件数量&#xff0c;并提取课程信息&#xff0c;如课程标题名称、排序号等&#xff0c;如果使用 GROUP BY 聚合函数&#xff0c;则只能统计返回课件…

TS为什么被叫做类型体操

目录 1.简单类型系统 2.支持泛型系统 3、类型编程的类型系统 类型系统不止ts有&#xff0c;比如说java、c都有&#xff0c;为什么只有ts被称为类型体操 本文将讲述为什么ts被称为类型体操。静态类型编程语言都有一套自己的类型系统&#xff0c;从简单到复杂可以分为3类。 1…