2.3.4 触发一个指定异常的断言
在进行异常测试时,会有这样的场景,程序希望在某时某地抛出一个指定的异常,如果的确抛出这个指定的异常,则程序是正确的。如果抛出的异常不是指定的那个异常或者不抛出异常,则表示程序是错误的。
使用raises引起一个指定的异常,再通过测试方法检查代码是否可抛出这个异常,如果抛出此异常,则表示程序是正确的,如果不抛出或者抛出的不正确,则表示程序是错误的。这样我们就可以检查代码是否抛出一个指定的异常。
引起一个解释器请求退出的异常,通过test_mytest测试方法实现断言并判断是否是指定的异常,示例代码如下:
运行的结果是正常的,但如果把异常的类型修改就会出现执行测试不通过。大家可以动手试试,具体执行自己体会。
同时程序可以在抛出指定异常时,断言属性中的值是否正确。
其中,excinfo是ExceptionInfo的一个实例,它封装了异常的信息。常用的属性包括:.type、.value和.traceback。
注意:在上下文管理器的作用域中,raises代码必须是最后一行,否则其后面的代码将不会被执行。
所以,如果上述例子缩进到与函数调用为同一个层级,则测试将永远成功,代码如下:
这是因为assert '456' in str(excinfo.value)并不会被执行。
也可以给pytest .raises()传递一个关键字参数match,来测试异常的字符串表示str(excinfo.value)是否符合给定的正则表达式(和Unittest中的TestCase.assertRaisesRegexp方法类似),代码如下:
pytest实际调用的是re.search()方法,用来进行上述检查,match=r'.*40011.*',r表示原始,*表示所有,这个正则表达式的意思是字符串中包含40011,同时pytest.raises()也支持检查多个期望异常(以元组的形式传递参数),这时只需触发其中任意一个。
把要断言的属性内容写成40011而不是40013,执行结果如下: