『德不孤』Pytest框架|『德不孤』Pytest框架 — 8、Pytest断言
目录
- 1、什么是断言
- 2、Pytest断言
- 3、Pytest的断言方式及应用场景
- (1)使用assert语句
- (2)断言预期的异常
- (3)拓展
- 4、优化断言
- 5、使用标记检查异常
1、什么是断言 对于测试来讲,不管是功能测试,自动化测试,还是单元测试,一般都会预设一个正确的预期结果,而在测试执行的过程中会得到一个实际的结果。
测试的成功与否就是拿实际的结果与预期的结果进行比较,这个比的过程就是断言(assert)。
2、Pytest断言
- 与Unittest不同,Pytest使用的是Python自带的
assert
关键字来进行断言。 assert
关键字后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行则为成功,否则用例执行失败。
Pytest里面的断言实际上就是Python里面的
assert
断言方法。1)比较大小与是否相等:
assert a == b
:判断a等于bassert a !=b
:判断a不等于b
assert a in b
:判断b包含aassert a not in b
:判断b不包含a
提示:b可以是字符串,可以是列表,元组等都可以。
assert isinstance(a,int)
:判断a是否是int类型数据。
assert xx
:判断xx结果为真。assert not xx
:判断xx结果不为真。
#用于判断素数
def is_prime(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True# 判断是否为素数
def test_true():
assert is_prime(13)
# 或者不为素数
assert not is_prime(13)
基本上常用的就这么几种。
(2)断言预期的异常
将异常信息存储到一个变量中,变量的类型则为异常类,包含异常的
type
、value
和traceback
等信息import pytestdef test_exception_value():
with pytest.raises(ZeroDivisionError) as zero:
1 / 0# 此处可以是方法,也可以是表达式# print(zero)
# print(zero.tb)#
# print(zero.typename)# 字符串"ZeroDivisionError"
# print(zero.type)# 异常类型
print(zero.traceback)
assert "division by zero" in str(zero.value)
assert zero.type == ZeroDivisionError
assert zero.typename == "ZeroDivisionError"if __name__ == '__main__':
pytest.main()
注意:在上下文管理器的作用域中,raises代码必须是最后一行,否则其后面的代码将不会执行。(3)拓展
如果我们不知道预期异常的是什么,我们可以使用 match 和 raise 进行自定义异常。
给
pytest.raises()
函数传递一个关键字参数match
,通过match
设置的字符串正则表达式匹配异常信息。和
Unittest
中的TestCase.assertRaisesRegexp
方法类似。【『德不孤』Pytest框架|『德不孤』Pytest框架 — 8、Pytest断言】示例:
import pytest# myfunc函数会抛出一个异常,
def myfunc():
raise ValueError("Exception 123 raised")def test_match():
# pytest.raises()函数,
# 可以用元组的形式传递参数,只需要触发其中任意一个即可。
# 通过match可以设置通过正则表达式匹配异常。
with pytest.raises((ValueError, RuntimeError), match=r'.* 123 .*') as ve:
myfunc()
# 说明:myfunc()抛出的异常被match设置的字符串匹配到
# 也就是捕获到了该异常。
# 然后下面是断言,123是否包含在捕获异常的说明中。assert "123" in str(ve.value)if __name__ == '__main__':
pytest.main()
4、优化断言 我们可以在异常的时候,输出一些提示信息,这样报错后,可以方便我们来查看原因。
示例如下:
import pytestdef func():
return 100def test_case_666():
a = func()
assert a % 3 == 0, "判断a是否能被3整除,当前a的值为:%s" %aif __name__ == '__main__':
pytest.main()"""
运行结果:========没加注释的测试结果==========
Expected :0
Actual:1
def test_case_666():
a = 100
>assert a % 3 == 0
Eassert 1 == 0test_01.py:55: AssertionErrorAssertion failed========添加注释的测试结果==========
Expected :0
Actual:1
def test_case_666():
a = 100
>assert a % 3 == 0, "判断a是否能被3整除,当前a的值为:%s" %a
EAssertionError: 判断a是否能被3整除,当前a的值为:100
Eassert 1 == 0test_01.py:53: AssertionErrorAssertion failed
"""
5、使用标记检查异常 使用注释:
@pytest.mark.xfail(raises=ZeroDivisionError)
示例:
import pytest@pytest.mark.xfail(raises=ZeroDivisionError)
def test_exception_value():
1 / 0if __name__ == '__main__':
pytest.main()# 说明代码:
# 预期抛出ZeroDivisionError异常,
# 实际测试用例执行也抛出了ZeroDivisionError异常。
# 测试结果:该用例是xfailed
推荐阅读
- Go|Go Exec 僵尸与孤儿进程
- 『德不孤』Pytest框架|『德不孤』Pytest框架 — 7、Pytest预期失败
- 『无为则无心』Python面向对象|『无为则无心』Python面向对象 — 47、Python中的self详解
- 孤身只影
- 《后来的我们》--孤独是常态
- 无法抓取一粒
- 贾平凹--自在的禅意
- 『亲爱的』下个七年请多多指教
- 孤独是场渴望倾听的故事
- 我的孤单,名正言顺|二七章(男闺蜜学习期满未能归来)