-
与unittest不同,pytest使用的是python自带的assert关键字来进行断言
-
assert关键字后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行成功,否则用例执行失败
举例
# 异常信息
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


2293

被折叠的 条评论
为什么被折叠?



