Pytest 异常处理
同学们大家好,这个章节我们来学习 pytest 中如何处理异常。
简介
异常处理是指在测试过程中捕获和处理代码中抛出的异常。
在 Pytest 中,可以使用 pytest.raises
上下文管理器来捕获代码执行过程中抛出的特定异常,并允许对该异常进行断言。
在 pytest 中,异常处理是很常用的一种操作。它的作用是确保当代码执行过程中发生预期的异常时,程序能够正确地处理这些异常,并且不影响后续的执行。在 pytest 中也专门提供了 pytest点raises 这个工具来帮助我们捕获和断言异常。
常用的异常处理方法
try...except
pytest.raises()
下面我们来看看具体的处理方法。其实处理异常的主要方法有两种。第一种可以直接使用传统的 try except 语句,或者也可以使用 pytest 提供的 pytest点raises 来处理。下面我们分别来介绍一下。
try ...except 的使用
try:
可能产生异常的代码块
except [ (Error1, Error2, ... ) [as e] ]:
处理异常的代码块1
except [ (Error3, Error4, ... ) [as e] ]:
处理异常的代码块2
except [Exception]:
处理其它异常
try :
a = int(input("输入被除数"))
b = int(input("输入除数"))
c = a / b
print("您输入的两个数相除的结果是:", c)
except (ValueError, ArithmeticError):
print("程序发生了数字格式异常、算数异常之一")
except :
print("未知异常")
print("程序继续运行")
首先来看如何使用传统的 try except 语句可以用来捕获代码中的异常,然后执行相应的处理逻辑。比如说这里的例子,我们可以在 try 语句块中写上可能引发异常的代码,然后在 except 语句块中捕获并处理这些异常。如果异常是我们预期的某种异常或者错误类型,我们就执行相应的处理,否则就可以捕获其他所有的异常。在这个例子当中,我们是输入两个数字后进行除法运算,这时候可能会碰到数字格式错误或除数为零的情况。使用 try except,可以捕获这些错误并输出适当的提示。
运行结果:
我们可以执行一下这个例子,看看运行结果。可以看到控制台打印了 except 代码块中的日志信息。说明这个时候已经捕获到了对应的异常,并且开始执行 except 中的逻辑了。
pytest.raises() 的使用
- 可以捕获特定的异常。
- 获取捕获的异常的细节(异常类型,异常信息)。
- 发生异常,后面的代码将不会被执行。
下面我们再来看看 pytest点raises 的用法。它不仅可以捕获指定的异常,还可以验证异常的类型和异常信息,甚至在测试失败时给出详细的异常信息。如果抛出的异常符合我们预期的类型和信息,测试就会通过,否则,测试失败。举个例子,如果某个函数应该抛出一个 ValueError 异常,我们就可以用 pytest点raises 来验证这一点。
pytest.raises() 用法详细讲解可参考 Pytest 的官网
这里给大家提供了 pytest 官网中对于异常处理的文档地址,大家感兴趣可以去看一看。
代码示例:
import pytest
def test_raise():
with pytest.raises(ValueError, match='must be 0 or None'):
raise ValueError("value must be 0 or None")
def test_raise1():
with pytest.raises(ValueError) as exc_info:
raise ValueError("value must be 42")
assert exc_info.type is ValueError
assert exc_info.value.args[0] == "value must be 42"
这里给大家把官方给出的示例单独拿出来了,我们来看看这里的用法。第一个测试函数中使用了 with pytest点raises 上下文管理器来捕获 ValueError 类型的异常,这里的 ValueError 是我们期望捕获的异常类型。match等于must be 0 or None 这个参数表示我们还期望异常的消息包含指定的字符串。也就是说这里捕获的异常消息应该包含 must be 0 or none,如果消息中没有这个内容,测试就会失败。在 with 块内,我们显式地抛出了一个 value error 异常,并提供了消息 value must be 0 or none。这个异常是为了模拟我们想要捕获的异常,确保我们的异常处理逻辑正常工作。而在 with 块内,我们显式地抛出了一个 value error 异常,并提供了消息 value must be 0 or none。这个异常是为了模拟我们想要捕获的异常,确保我们的异常处理逻辑正常工作。总之,如果抛出的异常类型是 value error,且其消息匹配 must be 0 or none,测试通过;否则测试失败。然后第二个测试函数中还演示了另一种获取断言异常的用法。with pytest点raises(value error) as exc_info: 这行代码与 test_raise 类似,作用是捕获 value error 异常,但它没有直接在 raises 中指定异常消息,而是通过 exc_info 获取异常的详细信息。在 with 块内,抛出了一个 value error 异常,消息为 value must be 42。在 with 块外,exc_info 对象被用来断言捕获到的异常类型和异常消息。assert exc_info点type is ValueError 这行断言用来验证捕获的异常类型确实是 ValueError。如果异常类型不是 ValueError,测试将失败。assert exc_info点value点args[0]等于等于value must be 42 这行断言验证异常的消息是否与我们期望的 value must be 42 相同。exc_info点value 获取到的是异常实例,而 args[0] 则是异常的第一个参数,也就是异常的消息内容。
运行结果:
搞清楚代码逻辑之后我们可以看看执行结果,可以看到这两个测试用例都是通过的。
下面给大家演示一下具体操作。好,我们进入到项目当中,这里已经准备好了一个测试文件,并且准备好了测试用例,用了三种异常处理的方法。那么在第一种当中的话,我们用的是传统的 try except 来执行一下,看看哎。可以看到我们给定的这两组会报异常的数据,这个时候的话其实它已经被 except 所捕获,然后的话给出了对应的一个提示信息。然后第二种的话,我们是用了这个 patest 点rice,然后在这个里面我们是直接捕获了这个除数不能为 0 的这样的一个异常。实行一下可以发现它的测试结果也是通过的,用这种方式也可以完成这个异常的一个断言。那么第三种方式的话,我们其实是直接把通过 patest rises 的这个异常把它保存了下来,并且的话可以去断言它异常的类型,还有它异常里的一个提示信息哎。执行一下会发现我们在这边它的类型,还有它的提示信息也都可以获取到。
./assets/Pytest异常处理.mp4
总结
- Pytest 异常处理的方法。
最后来总结一下。这个章节我们学习了 pytest.raises 和传统的 try except 语法来灵活地捕获和处理异常,确保在测试过程中遇到异常时能够准确地验证程序是否按照预期的方式处理这些异常。好了,关于 pytest 中的异常处理就先介绍到这里。