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