举例
# 异常信息
def f():
return 3
def test_function():
a = f()
assert a % 2 == 0, "判断 a 为偶数,当前 a 的值为:%s" % a
运行结果: 可以看到,在断言之后可以输出具体原因
常用断言
pytest 里面断言实际上就是 python 里面的 assert 断言方法,常用的有以下几种 assert xx :判断 xx 为真 assert not xx :判断 xx 不为真 assert a in b :判断 b 包含 a assert a == b :判断 a 等于 b assert a != b :判断 a 不等于 b
异常断言
为了编写有关引发的异常的断言,可以将其 pytest.raises用作上下文管理器。 通常我们要断言它抛的异常是不是预期的,比如执行:1/0,预期结果是抛异常:ZeroDivisionError: division by zero,那我们要断言这个异常。通常是断言异常的type和value的值。这里1/0的异常类型是ZeroDivisionError,异常的value值是"integer division or modulo by zero"。
def test_zero_division():
assert 1/0
使用断言处理 1,直接用pytest.raises()处理异常,直接断言,不添加assert语句,用例直接通过
def test_zero_division2():
with pytest.raises(ZeroDivisionError):
1 / 0
2,将异常信息存储到一个变量中,变量的类型则为异常类,包含异常的type、value和traceback等信息excinfo是一个ExceptionInfo实例,是实际引发的异常的包装。
def test_zero_division():
with pytest.raises(ZeroDivisionError,message="捕获异常") as exinfo:
1/0
assert exinfo.type == ZeroDivisionError
assert str(exinfo.value) == "division by zero"
可以看出来,这个测试用例,捕获到特定的一场,用例通过 需要注意:断言type的时候,不需要给异常类型添加引号。需要把value的值转换成str类型的才可以比较,而且值是要加引号的。
但是当没有捕获到想要的一场,用例执行失败,raises里面的message关键字参数消息指定自定义失败消息 3.可以将match关键字参数传递给上下文管理器,以测试正则表达式与异常的字符串表示形式是否匹配,在用例中定义抛出的异常信息是否与预期的异常信息匹配,若不匹配则用例执行失败
def test_zero_division():
with pytest.raises(ZeroDivisionError,match='division_test') as exinfo:
1/0
assert exinfo.type == ZeroDivisionError
def test_zero_division():
with pytest.raises(ZeroDivisionError,match='division by') as exinfo:
1/0
assert exinfo.type == ZeroDivisionError
|