本文总结使用pytest编写自动化测试时常用的assert断言。
说明
本文将从以下几点做总结:
在断言方面,pytest框架比其他类似的框架(比如unittest)更加简洁,易用,我想这是我选择pytest作为自动化测试框架之一的原因之一。
pytest的assert断言关键字支持使用python内置的assert表达式。可以理解为pytest的断言就是直接使用python自带的assert关键字。
python assert的概念:
Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。
我们可以在在assert后面添加任何符合python标准的表达式,如果表达式的值通过bool转换后等于False,则意味着断言结果为失败。
以下举例常用的表达式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
在编写测试时,为了提高易用性,我们想知道断言失败时的一些关于失败的原因等说明信息,assert也能满足该功能。
请看示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
在某些测试用例中,比如异常测试用例,测试的结果必然是失败并应该爆出异常的。这时候自动化测试用例的期望结果就是该异常。如果期望结果等于该异常,那么测试用例执行通过,否则用例结果为失败。pytest提供为为预期异常作断言的方法:pytest.raises()。一般结合with上下文管理器使用。
使用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
接下来看看没有爆出预期异常的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
|
判定用例执行结果为失败。
上面我们只是断言了异常的类型。但有的时候我们想更进一步断言异常的说明信息,pytest也可以做到。with pytest.raises()执行结束后会生成一个ExceptionInfo的实例对象。该对象包含type , value, traceback属性。value属性就是我们需要的异常说明信息。
见示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
|
控制台输出的“Captured stdout call”就是异常的信息,包含类型,异常说明,异常跟踪信息。
可以通过assert断言这些信息。
也可以通过给pytest.raises()传入match关键字参数来完成E.value的断言,这里运用到的是python中正则表达式的原理。
示例:
该示例意味断言通过
1 2 3 |
|
该示例意味断言失败:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
如果,某个测试用例可能出现不同的预期异常,只要爆出的异常在预期的几个异常之内,那么如何断言呢。解决方法很简单,原理和接口都没变,只是在pytest.raises()中传入异常类型的参数,从传入一个异常类型,改变为传入一个异常类型组成的元组。同样只是传入一个参数。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
这种行为,相当于改变了pytest的运行方式,虽然只是一种锦上添花的改变。我们通过编写hook函数来改变pytest的行为。hook函数是pytest提供的,有很多,各个hook函数的详细定义应该参考pytest的官方文档。
为失败断言自定义说明信息是通过pytest_assertrepr_compare这个hook函数完成的。
先看没有编写pytest_assertrepr_compare这个hook函数时,默认的失败断言说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
再看编写pytest_assertrepr_compare这个hook函数后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
pytest还提供其他的hook函数,这些函数的作用就是用来改变pytest的运行方式和运行效果。所以编写第三方插件一般是使用这些hook函数。
?现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!?希望能帮助到你!【100%无套路免费领取】