![pytest框架与自动化测试应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/848/47216848/b_47216848.jpg)
2.3.3 断言的分类与使用
pytest使用Python的assert函数,支持显示常见的Python子表达式的值,包括:调用、属性、比较、二进制和一元运算符。也就是Python语言有多少种判断,assert就有多少种断言,包括断言函数返回值是否相等、断言表达式执行后的结果是否正确、各种不同比较运算符的断言、比较各种数据类型(字符串、列表、字典、集合)不同的断言。
1.验证函数返回值是否相等
断言函数返回了某个值。如果此断言失败,则将看到函数调用的返回值。
示例代码如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P42_31872.jpg?sign=1739296794-O8TQa9PIa7JgdEY5oBhdWzVCv0aTL5YD-0-66783130f490d08f5d37532d7e6a0c16)
执行效果如图2-2所示。
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P42_31873.jpg?sign=1739296794-jzA8KtYdWv0Fvm3K5WocLX3nQGlvcEHc-0-12187da3e1c944be4e53daf905af0d6e)
图2-2 断言返回值是否相等的执行效果
图2-2中部分框的含义如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P42_31874.jpg?sign=1739296794-D9IcIis4y76d4psLoSA4kL2QwDFWrUoG-0-555519c44d966dca1577f7d48ca57ebb)
2.表达式断言
通过表达式运算后的结果进行真假判断。
示例代码如下,如果值是偶数,不会报错。如果值是奇数,则表示断言失败,此时就会显示断言后面的提示信息:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P43_31876.jpg?sign=1739296794-YE8Pa91amneUDlte1TXHgr6XxoSYzNVL-0-fd2b55b946522a04c98cfbb27e5e42df)
执行结果如图2-3所示,a %2==0表达式后面的参数表示当出错时的提示信息:"你的值是奇数,它应该是偶数",F表示失败。
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P43_10636.jpg?sign=1739296794-XSRIOR5ye8GsS1BL1hY6NKrIi2TFWBdo-0-9f24e6971d82d9c86606a18503fdc67b)
图2-3 整除断言执行结果
3.比较类型断言
比较类型断言包括相等、不等、包含、不包含、真、假等断言,以及长列表中的详细断言。下面通过代码分别演示。test_lessmore测试方法用于比较小于或等于及大于或等于。test_true测试方法用于比较真假,通过1<3返回值再与真假比较。test_not_eq测试方法用于比较不等于,以及判断是否不在其中。
示例代码如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P43_31879.jpg?sign=1739296794-HsO3UW0LPLrYWsAMWPv0MBuyOaNMxGGM-0-5655da1f8154ad911547032ca4b69512)
Python的长列表比较智能,在test_long_list测试方法中:列表x的元素为0~100的所有自然数,列表y的元素为0~100的所有偶数,它们之间的不同会有50个,直接提示'1'!='2'。test_long测试方法将50个12和50个11进行比较,直接提示12!=11。
代码执行结果如下,仔细体会。
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P44_31882.jpg?sign=1739296794-SgchV6RPdPOWjKyHjVFFSohFZgpAmiOS-0-134de115034a14c99603d4537a67ddc7)
4.不同数据类型的比较断言
pytest当遇到比较断言时,它提供了具有丰富细节且差异化的支持。同时,当断言失败时,pytest也提供了非常人性化的失败说明,中间往往夹杂着相应变量的introspection(自己反省)信息,这个被称为断言的自省。那么,pytest是如何做到的呢?首先pytest发现测试模块,然后引入它们,与此同时,pytest会复写断言语句,但是,不是测试模块的断言语句并不会被复写。
下面情况执行时有着丰富的细节比对:
(1)比较字符串:显示上下文差异。
(2)比较列表:显示第一个失败的索引。
(3)比较字典:显示不同的条目。
(4)比较集合:显示不同的元素。
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P46_31886.jpg?sign=1739296794-4WMDcp2aRHPE9LP2b0KT20u5nMceKT7y-0-e8fff5cad72e4a3a491375c6758e421e)
执行结果如图2-4~图2-7所示,分别比较的是字符串、列表、字典和集合,比对的细节很明确。
字符串的比较会具体到每个不同的字符,如图2-4所示。
列表中元素的比较会具体到每个索引,如图2-5所示。
字典类型的比较会具体到每个键值,相同的不显示,只显示不同的键,如图2-6所示。
集合类型会从左右两边显示不同,如图2-7所示。
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P47_10932.jpg?sign=1739296794-GLFnlbTtnYX4lBdSLNHC6t4PZ379Hadm-0-e513eb7d701d4d7a28aff9fa4c30d93e)
图2-4 长字符串比较执行结果
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P47_10936.jpg?sign=1739296794-ORE13zCHAzzIndZRLEfaUd5Lxd056qNT-0-83fd4910d77d5bad8dfd88b6d39b1760)
图2-5 列表类型比较执行结果
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P47_10939.jpg?sign=1739296794-wBCgFmixhwVf7f5nX7MaZIYsZneuW99s-0-87b1610846b5d69a45e565962ca66943)
图2-6 字典类型比较执行结果
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P47_10942.jpg?sign=1739296794-QBOgKGAEYuGjKpQcywWpHBRFJZzIIXE2-0-b75d6fcbc04f2310cadfaadc1aac7e29)
图2-7 集合类型比较执行结果