![pytest框架与自动化测试应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/848/47216848/b_47216848.jpg)
2.3.4 触发一个指定异常的断言
在进行异常测试时,会有这样的场景,程序希望在某时某地抛出一个指定的异常,如果的确抛出这个指定的异常,则程序是正确的。如果抛出的异常不是指定的那个异常或者不抛出异常,则表示程序是错误的。
使用raises引起一个指定的异常,再通过测试方法检查代码是否可抛出这个异常,如果抛出此异常,则表示程序是正确的,如果不抛出或者抛出的不正确,则表示程序是错误的。这样我们就可以检查代码是否抛出一个指定的异常。
引起一个解释器请求退出的异常,通过test_mytest测试方法实现断言并判断是否是指定的异常,示例代码如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P48_31887.jpg?sign=1738987133-YorOAlL4zmgri4Rrd6SRTv3FZ1slv0rd-0-038fcc5984d53917d19a90b2533dcb12)
运行的结果是正常的,但如果把异常的类型修改就会出现执行测试不通过。大家可以动手试试,具体执行自己体会。
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P48_31888.jpg?sign=1738987133-CtnayvvU48zIIHZDfAmjAowAs98F1ugt-0-49514a566eb295b13524385d060650ee)
同时程序可以在抛出指定异常时,断言属性中的值是否正确。
其中,excinfo是ExceptionInfo的一个实例,它封装了异常的信息。常用的属性包括:.type、.value和.traceback。
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P48_31889.jpg?sign=1738987133-JNjZ48gWP82XzxaXBOjnnjpVNnyDac81-0-4f4c3625a494adb03e47b49248523cdc)
注意:在上下文管理器的作用域中,raises代码必须是最后一行,否则其后面的代码将不会被执行。
所以,如果上述例子缩进到与函数调用为同一个层级,则测试将永远成功,代码如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P49_31891.jpg?sign=1738987133-7DH0T87dA14Qi6AwsPupWZqa6r6anqWk-0-30dd7314a3b8d1eb3166f0adcb64c1f4)
这是因为assert '456' in str(excinfo.value)并不会被执行。
也可以给pytest .raises()传递一个关键字参数match,来测试异常的字符串表示str(excinfo.value)是否符合给定的正则表达式(和Unittest中的TestCase.assertRaisesRegexp方法类似),代码如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P49_31893.jpg?sign=1738987133-etMU1873rX3S6ZuuSIrWPTgYxb9FG4e3-0-e1e214c1736ab021e1deed082bb7955e)
pytest实际调用的是re.search()方法,用来进行上述检查,match=r'.*40011.*',r表示原始,*表示所有,这个正则表达式的意思是字符串中包含40011,同时pytest.raises()也支持检查多个期望异常(以元组的形式传递参数),这时只需触发其中任意一个。
把要断言的属性内容写成40011而不是40013,执行结果如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P49_31895.jpg?sign=1738987133-Tmkbhr9wr6oDKd778MUJLoewfzOG10kP-0-7a62751ccb7f9cb745d91378910c76c6)