pytest测试用例编写----预期的异常测试(Expecting Exceptions)
在pytest中测试预期的异常使用pytest.raises。
with pytest.raises(TypeError): tasks.add(task='not a Task object')
上面这个语句的意思是:无论什么时候,当tasks.add(task='not a Task object')抛出TypeError时,测试通过;当tasks.add(task='not a Task object')没有抛出异常,或者抛出的异常不是TypeError类的异常时,都是失败的。
with pytest.raises(ValueError) as excinfo: tasks.start_tasks_db('some/great/path', 'mysql')
注:在包含pytest.raises()的with语句块中,要抛出异常的语句一定是最后一个语句,如果不是,抛出异常语句后面的语句不会执行;上例中,在tasks.start_tasks_db('some/great/path', 'mysql')后面如果有其他语句的话,都不会执行;(更多详细信息使用help(pytest.raises)查看,使用前先import pytest)
with pytest.raises(ValueError) :使用with语句进行上下文管理,调用pytest的raises方法可以得到一个ExceptionInfo类型的返回值,这个返回值包含了ValueError异常发生时的所有上下文信息,我们可以使用他们来判断异常的发生是否符合预期。
exception_msg = excinfo.value.args[0] assert exception_msg == "db_type must be a 'tiny' or 'mongo'"
注:ExceptionInfo类型继承自Python的基本异常类Exception,它主要使用的3个属性是:type,value和traceback;上例中就是读取了value属性中的args属性(捕获异常提供的参数列表)。python基础异常类Exception的默认行为是接受所有传递的参数并将它们以元组形式存储在 .args 属性中。
关于python使用基本异常类Exception的args属性的补充说明;详见URL:https://blog.csdn.net/Enjolras_fuu/article/details/83629064
以下实例说明了Exceptioninfo类型常用的三个属性(value、type和traceback)的用法:
运行:pytest -s -k "raise" test_pytest_example.py
说明:
type属性:是指捕获的异常是那种类型如:ValueError,TypeError等
Value属性:记录了捕获的异常返回的信息,它的args属性是一个列表用于读取异常信息
traceback属性:捕获异常的运行跟踪信息。