![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=1739589248-IqQnxyHRGy4z8GTay0HswYagLAU6XmSL-0-688128cd4486ed09ca85a153911b897a)
运行的结果是正常的,但如果把异常的类型修改就会出现执行测试不通过。大家可以动手试试,具体执行自己体会。
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P48_31888.jpg?sign=1739589248-LzLSIY2V3OA2uIgbvoaHYtEZ2y70cGBa-0-de1c7c61cc83e09c7e70b7fbc3644df5)
同时程序可以在抛出指定异常时,断言属性中的值是否正确。
其中,excinfo是ExceptionInfo的一个实例,它封装了异常的信息。常用的属性包括:.type、.value和.traceback。
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P48_31889.jpg?sign=1739589248-RsdtPv24RlYKLrXEvB0gw6uU4bYkjffq-0-066a97696ef07555014273c7744e2936)
注意:在上下文管理器的作用域中,raises代码必须是最后一行,否则其后面的代码将不会被执行。
所以,如果上述例子缩进到与函数调用为同一个层级,则测试将永远成功,代码如下:
![](https://epubservercos.yuewen.com/E902B4/26581161801257906/epubprivate/OEBPS/Images/Figure-P49_31891.jpg?sign=1739589248-wOeXi28tzNB5G5HBftmFPm08cRnyHboe-0-ae6c56c912d8a87d98c24204f1622c12)
这是因为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=1739589248-H5GWhb6MDGBRAuTCvMzHYrIgnmfsrz7a-0-c627478ff3b5ebe26a437ceca5ba7763)
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=1739589248-zwnpuREteQRmZJy1PcLIAyqztPhKYF1H-0-c0a758a1ee9670d3950694752577a84f)