## 第二章 第一讲:基础断言:使用‘assert’语法 前置知识点: 1.什么是assert? 在python中,assert是一种用于【调用】和【测试】的关键字,它用于在代码中插入调试断言 2.assert的基本语法和用途: 语法: assert expression[,argument] 用途:assert 语句用于检查一个条件(expression)是否为True - 如果条件为True:程序将继续正常执行下一条语句; - 如果条件为False:assert预计将会引发一个AssertionError异常 - [argument]部分是可选的,它可以是一个字符串或任何其它对象 - 当断言失败时,argument会作为AssertionError的参数,方便你提供一些关于断言失败的信息 ##### assert 简单示例: ```python x = 10 assert x > 11 assert x > 5 ``` **在这个例子中,assert x > 11 检查变量 x 是否大于 11。因为 x 的值为 10,条件为 False,所以程序会抛出异常:AssertionError。** **如果assert x > 5 检查变量 x 是否大于 5。因为 x 的值为 10,条件为 True,所以程序会继续正常执行后续代码(如果有)** ###### 带有错误信息的断言示例: ```python x = 10 assert x > 11, f"不不不,x={x},不大于11" ``` **我们可以看到在控制台上有类似的异常输出:AssertionError: 不不不,x=10,不大于11** #### assert在测试中应用示例: ```python def test_a(): result = 2 + 3 assert result == 5, f"result不等于5,result={result}" ``` 在这个pytest测试test_a中,assert result == 5 用于验证 2 + 3 是否等于5,如果结果等于5,测试通过; 如果结果不等于5,pytest就会报告AssertionError异常以及相关信息,如:result不等于5,result=6等 ## 第二章 第一讲内容: 1. 基本用法:通过标准 Python `assert` 验证预期值 在pytest测试框架中,你可以使用标准的Python assert 语句来验证测试中的预期值和结果: 例如: ```python def f(): return 3 def test_b(): assert f() == 4 ``` - 上述示例代码定义了一个函数f(),它返回值为3,我们又写了个test_b测试用例,使用assert f() == 4 来断言函数f的返回值应该等于4 - 这当中的预期值就是 4 ,结果就是函数f的返回值 - 观察命令行的输出结果,pytest明确指出断言失败的具体位置(如:test_assert1.py:6),断言失败的异常:AssertionError - 并且展示了实际的比较情况,即:assert 3 == 4,同时说明3是函数f()的返回值 1. 断言失败提示:显示子表达式值、自定义错误消息 - 知识点1:pytest支持显示常见子表达式的值,这些子表达式包括:函数调用、属性访问、比较操作、二元和一元运算符等 - 子表达式的概念: - 在python代码中,一个复杂的表达式可以由多个较小的部分组成,这些较小的部分就是子表达式 - 例如:a+b*c 这个表达式中,a,b,c,b*c都是子表达式 - 在pytest的断言中,常见的子表达式类型包括:函数调用(如:func())、属性访问(如:obj.attr)、比较操作(如:a > b) - 二元运算符(如:a + b)、一元运算符(如-a)等 - 显示子表达式值的作用: - 当pytest中的断言失败时,它会显示这些子表达式的值,帮助我们理解为什么断言失败 - 断言失败返回内容示例: ```python > assert result == 6 E assert 5 == 6 E + where 5 = add(2, 3) ``` *pytest不仅告诉我们result的实际值5和预期值6不相等,还显示了5时通过add(2,3)得到的* *add(2,3)就是一个函数调用类型的子表达式,通过显示子表达式的值,就可以清楚的看到计算过程中,哪个部分导致断言失败,方便结果调试* - 知识点2:可以使用地道的Python结构,无需编写样板代码,同时又不会丢失内省信息 - 如何理解“无需编写样板代码” - 样板代码是指为了实现某种功能而必须编写的一些重复、机械的代码,但这些代码本身并不直接实现核心功能; - 在测试中,有些测试框架可能需要编写大量的特定格式的代码来进行断言、获取详细的失败信息等; - 而Pytest使用标准的Python assert 语句,就可以像在普通的python代码中一样编写断言逻辑,不需要额外编写复杂的、固定格式的代码来实现类似功能 - 如何理解“不会丢失内省信息” - 内省信息时指程序在允许时能够获取自身信息(自身结构、属性、行为)的能力 - 在Pytest中主要指“断言失败时关于代码执行的详细信息”,如:子表达式的值,调用栈等; - Pytest支持我们使用简洁的assert语句,避免了样板代码,但它依然能够提供丰富的内省信息,帮助我们理解失败原因 - 例如前面的示例add函数,Pytest咋断言失败时展示了add(2,3)的返回值,这就是内省信息的一部分 - **总结:不需要写大量的特定格式的代码来进行断言,获取详细的失败信息等的同时,pytest还能够返回断言失败时关于代码执行的详细信息** 例如上述例子中,当assert f() = 4失败时,pytest展示了f()的返回值3,这就是显示子表达式值的表现 - 知识点3:还可以为断言指定自定义错误消息(如下面的示例中:“a + b != 7,因为 a = {a},b = {b}”就是自定义的错误消息) - 例如: ```python def test_c(): - a = 2 - b = 3 - assert a+b == 7,f"a + b != 7,因为 a = {a},b = {b}" ``` - 断言 introspection 细节:自动展示调用、属性、比较等信息 - Pytest在断言失败时,会自动展示丰富的关于调用、属性、比较等操作的细节信息,这些信息统称为断言的内省信息 - 例如在比较操作中,如前面的assert f() == 4,Pytest不仅告诉你比较的两个值(3和4),还指出了3是函数f()的返回值 - 在属性访问情况下,如果又类似:class MyClass:value = 5,然后在测试中 obj = MyClass();assert obj.value == 10 - 断言失败时,Pytest会展示obj.value的实际值5以及预期值10 - 示例代码: ```python class MyClass: name = "张三" def test_class_attribute(): obj = MyClass() assert obj.name == "李四" ``` - 对于函数调用,除了展示返回值,还能提供函数参数等信息(如果相关) - 比如:def add(a,b):return a + b ,在测试中assert add(2,3) == 6,断言失败时会展示add(2,3)的返回值5,预期值6
超详细Pytest学习笔记06:基础断言assert
于 2025-10-05 20:59:24 首次发布