
2.3.3 断言的分类与使用
pytest使用Python的assert函数,支持显示常见的Python子表达式的值,包括:调用、属性、比较、二进制和一元运算符。也就是Python语言有多少种判断,assert就有多少种断言,包括断言函数返回值是否相等、断言表达式执行后的结果是否正确、各种不同比较运算符的断言、比较各种数据类型(字符串、列表、字典、集合)不同的断言。
1.验证函数返回值是否相等
断言函数返回了某个值。如果此断言失败,则将看到函数调用的返回值。
示例代码如下:

执行效果如图2-2所示。

图2-2 断言返回值是否相等的执行效果
图2-2中部分框的含义如下:

2.表达式断言
通过表达式运算后的结果进行真假判断。
示例代码如下,如果值是偶数,不会报错。如果值是奇数,则表示断言失败,此时就会显示断言后面的提示信息:

执行结果如图2-3所示,a %2==0表达式后面的参数表示当出错时的提示信息:"你的值是奇数,它应该是偶数",F表示失败。

图2-3 整除断言执行结果
3.比较类型断言
比较类型断言包括相等、不等、包含、不包含、真、假等断言,以及长列表中的详细断言。下面通过代码分别演示。test_lessmore测试方法用于比较小于或等于及大于或等于。test_true测试方法用于比较真假,通过1<3返回值再与真假比较。test_not_eq测试方法用于比较不等于,以及判断是否不在其中。
示例代码如下:

Python的长列表比较智能,在test_long_list测试方法中:列表x的元素为0~100的所有自然数,列表y的元素为0~100的所有偶数,它们之间的不同会有50个,直接提示'1'!='2'。test_long测试方法将50个12和50个11进行比较,直接提示12!=11。
代码执行结果如下,仔细体会。

4.不同数据类型的比较断言
pytest当遇到比较断言时,它提供了具有丰富细节且差异化的支持。同时,当断言失败时,pytest也提供了非常人性化的失败说明,中间往往夹杂着相应变量的introspection(自己反省)信息,这个被称为断言的自省。那么,pytest是如何做到的呢?首先pytest发现测试模块,然后引入它们,与此同时,pytest会复写断言语句,但是,不是测试模块的断言语句并不会被复写。
下面情况执行时有着丰富的细节比对:
(1)比较字符串:显示上下文差异。
(2)比较列表:显示第一个失败的索引。
(3)比较字典:显示不同的条目。
(4)比较集合:显示不同的元素。

执行结果如图2-4~图2-7所示,分别比较的是字符串、列表、字典和集合,比对的细节很明确。
字符串的比较会具体到每个不同的字符,如图2-4所示。
列表中元素的比较会具体到每个索引,如图2-5所示。
字典类型的比较会具体到每个键值,相同的不显示,只显示不同的键,如图2-6所示。
集合类型会从左右两边显示不同,如图2-7所示。

图2-4 长字符串比较执行结果

图2-5 列表类型比较执行结果

图2-6 字典类型比较执行结果

图2-7 集合类型比较执行结果