pytest实例,pytest断言捕捉结果
Pytest获取测试用例执行结果(hook函数:pytest _ runtest _ make report)_ MB 62 af F3 AFB 54 FB _ 51 CTO博客的技术博客
简介pytest测试框架提供的很多hook函数方便我们对测试框架进行二次开发,可以根据自己的需求进行修改。
比如:hook方法:pytest_runtest_makereport,可以清晰的了解测试用例的执行过程,获得每个测试用例的执行结果。
test _ runtest _ makereport方法介绍。首先,看相关的源代码。在file _pytest/runner.py下,可以导入并查看它:
源代码:from _pytest导入运行程序
#对应的源代码
def pytest _ runtest _ make report(item,call):
返回a:py:class:` _ py test . runner . test report `对象
对于给定的:py:class:`pytest.Item 和
:py:class:` _ py test . runner . callinfo`。
Decorator pytest . hook inpl(hook wrapper=true,tryfirst=true)说明:@ pytest . hook inpl(hook wrapper=true)修饰的钩子函数有以下两个函数:
1.你可以得到测试用例不同执行阶段的结果(设置、调用、拆卸)。
2.可以得到hook方法pytest _ runtest _ makereport (item,call)的调用结果(yield在测试用例执行后返回一个result对象)和调用结果result对象中的测试报告(返回一个report对象)
Py _ runtest _ makereport (item,call) hook函数参数说明:1。Item是测试用例对象;
2.调用是测试用例的测试步骤;具体实施过程如下:
先执行when=setup ,返回setup用例前置操作函数的执行结果。
然后执行when=call 并返回调用测试用例的执行结果。
最后执行when=teardown 并返回teardown用例后操作函数的执行结果。
第一种情况,conftest.py文件,写pytest_runtest_makereport钩子方法,打印运行过程和运行结果。# conftest.py
导入pytest
@ pytest . hook impl(hook wrapper=True,tryfirst=True)
def pytest _ runtest _ make report(item,call):
打印(-)
#获取hook方法的调用结果并返回一个结果对象
输出=产量
打印(“用例执行结果”,输出)
#从hook方法的调用结果中获取测试报告
report=out.get_result()
打印(“测试报告:% s“%报告”)
打印(步骤:%s% report.when)
print( nodeid:% s % report . nodeid)
print( description:% s % str(item . function . _ _ doc _ _))
Print((运行结果:%s% report.outcome))test_a.py编写一个简单的用例:def test_a():
用例描述:test_a
打印( 123 )运行结果:
结果分析:从结果可以看出,测试用例的执行过程将经历三个阶段:
setup-call-teardown的每个阶段都返回结果对象和TestReport对象,以及对象属性。(setup和teardown以上用例默认不可用,结果全部通过。)
第二种情况,给测试用例写一个fixture()函数,增加测试用例的前后操作;Conftest.py如下所示:
导入pytest
@ pytest . hook impl(hook wrapper=True,tryfirst=True)
def pytest _ runtest _ make report(item,call):
打印(-)
#获取钩子方法的调用结果
输出=产量
打印(“用例执行结果”,输出)
#从hook方法的调用结果中获取测试报告
report=out.get_result()
打印(“测试报告:% s“%报告”)
打印(步骤:%s% report.when)
print( nodeid:% s % report . nodeid)
print( description:% s % str(item . function . _ _ doc _ _))
打印((运行结果:%s% report.outcome))
@pytest.fixture(scope=session ,autouse=True)
定义fix_a():
打印(“安装操作前”)
产量
打印运行结果(“拆卸后操作”):
第三种情况,fixture()函数的setup前置函数在执行时出现异常,即setup执行结果失败,那么后续的call测试用例、teardown后置操作函数都不会执行。
此时的状态是error,意味着测试用例还没有开始执行就已经异常了。(运行前功能时出现异常)
导入pytest
@ pytest . hook impl(hook wrapper=True,tryfirst=True)
def pytest _ runtest _ make报告(项目,呼叫):
打印(-)
# 获取钩子方法的调用结果
输出=产量
打印(用例执行结果,out)
# 从钩子方法的调用结果中获取测试报告
report=out.get_result()
打印(测试报告:%s %报告)
打印(步骤:%s % report.when)
打印( nodeid:% s %报告。nodeid)
打印(描述:% s % str(项目。功能。_ _ doc _ _))
打印((运行结果:%s % report.outcome))
@pytest.fixture(scope=session ,autouse=True)
定义fix_a():
打印(设置前置操作)
断言1==2
产量
打印(拆卸后置操作)运行结果:
第四个案例设置前置操作函数正常执行,测试用例呼叫执行发生异常。
此时的测试用例执行结果为不成功的
# conftest.py
导入pytest
@ pytest。hook impl(hook wrapper=True,tryfirst=True)
def pytest _ runtest _ make报告(项目,呼叫):
打印(-)
# 获取钩子方法的调用结果
输出=产量
打印(用例执行结果,out)
# 3.从钩子方法的调用结果中获取测试报告
report=out.get_result()
打印(测试报告:%s %报告)
打印(步骤:%s % report.when)
打印( nodeid:% s %报告。nodeid)
打印(描述:% s % str(项目。功能。_ _ doc _ _))
打印((运行结果:%s % report.outcome))
@pytest.fixture(scope=session ,autouse=True)
定义fix_a():
打印(设置前置操作)
产量
打印(拆卸后置操作)# test_a.py
定义测试_a():
用例描述:test_a
打印( 123 )
断言1==0运行结果:
第五个案例设置前置操作函数正常执行,测试用例呼叫正常执行,拆卸后置操作函数执行时发生异常。
测试用例正常执行,但是测试结果中会有错误,因为拆卸后置操作函数在执行时发生异常
# conftest.py
导入pytest
@ pytest。hook impl(hook wrapper=True,tryfirst=True)
def pytest _ runtest _ make报告(项目,呼叫):
打印(-)
# 获取钩子方法的调用结果
输出=产量
打印(用例执行结果,out)
# 从钩子方法的调用结果中获取测试报告
report=out.get_result()
打印(测试报告:%s %报告)
打印(步骤:%s % report.when)
打印( nodeid:% s %报告。nodeid)
打印(描述:% s % str(项目。功能。_ _ doc _ _))
打印((运行结果:%s % report.outcome))
@pytest.fixture(scope=session ,autouse=True)
定义fix_a():
打印(设置前置操作)
产量
打印(拆卸后置操作)
引发异常(拆卸失败了)# test_a.py
定义测试_a():
用例描述:test_a
打印( 123 )运行结果:
第六个案例:只获取呼叫结果场景:编写测试用例时,在保证设置前置操作函数和拆卸后置操作函数不报错的前提下,我们一般只需要关注测试用例的执行结果,即只需要获取测试用例执行呼叫的结果。
解决办法:因为前面的pytest_runtest_makereport钩子方法执行了三次。所以在打印测试报告的相关数据之气可以加个判断:if report.when==call 。
导入pytest
from _pytest导入运行程序
# 对应源码
def pytest _ runtest _ make报告(项目,呼叫):
返回答:py:class:` _ py测试。奔跑者。测试报告对象
对于给定的:py:class:`pytest.Item 和
:py:class:` _ py测试。奔跑者。callinfo `
@ pytest。hook impl(hook wrapper=True,tryfirst=True)
def pytest _ runtest _ make报告(项目,呼叫):
打印(-)
# 获取钩子方法的调用结果
输出=产量
#打印(用例执行结果:,out)
# 从钩子方法的调用结果中获取测试报告
report=out.get_result()
if report.when==call :
打印(测试报告:%s %报告)
打印(步骤:%s % report.when)
打印( nodeid:% s %报告。nodeid)
打印(描述:% s % str(项目。功能。_ _ doc _ _))
打印((运行结果:%s % report.outcome))
@pytest.fixture(scope=session ,autouse=True)
定义fix_a():
打印(设置前置操作)
产量
打印(拆卸后置操作)运行结果:
Conftest.py移除pytest_runtest_makereport的hook方法,正常执行测试用例# conftest.py。
导入pytest
@pytest.fixture(scope=session ,autouse=True)
定义fix_a():
打印(“安装操作前”)
产量
打印(拆卸后操作)# test_a.py
定义测试_a():
用例描述:test_a
打印( 123 )运行结果:
期待陌生,拥抱惊喜。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。