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