前言
测试用例在执行完成后,想要获取测试用例的执行结果,可以通过hooks(钩子函数)来进行获取,其中pytest中就存在多个hooks的函数供我们使用,或者进行二次开发,从而完成我们想要的功能
pytest_runtest_makereport
pytest_runtest_makereport 是pytest中提供的方法,我们可以通过获取用例的执行结果,我们先在conftest.py文件中进行写入该方法的,然后进行二次开发,先看下pytest_runtest_makereport 这个方法中存在哪些内容
# coding:utf-8 import pytest @pytest.hookimpl(hookwrapper=True, tryfirst=True) def pytest_runtest_makereport(item, call): # 获取钩子方法的调用结果 out = yield report = out.get_result() print(report.__dict__)
通过执行测试用例后会发现
从上图执行结果中可以发现,可以很清楚的看到获取三次执行结果,其中分别是"setup", "call", "teardown",安静这里可以理解成,分别是执行用例前,执行测试用例,执行测试用例后
实例展示
我们通过实际案例看下,将上面的需要参数结果打印出来
# conftest.py 文件 # coding:utf-8 import pytest @pytest.hookimpl(hookwrapper=True, tryfirst=True) def pytest_runtest_makereport(item, call): # 获取钩子方法的调用结果 out = yield # 获取执行结果内容 report = out.get_result() print('测试报告:{}' .format(report)) print('当前执行步骤:{}' .format(report.when)) print('当前执行测试用例:{}' .format(report.nodeid)) print('当前用例描述:{}' .format(report.nodeid)) print('当前执行结果:{}' .format(report.outcome)) print('当前报错信息:{}' .format(report.longrepr)) print('执行时间:{}' .format(report.duration))
创建一个测试用例test01.py
# test01.py # coding:utf-8 def test(): '''用例描述''' print('测试用例1')
通过cmd进行执行pytest -s test01.py
可以通过上面的执行结果看到,我们的前置,用例,后置都是执行成功的,那么我们加上setup和teardown来看看执行结果如何
# test01.py # coding:utf-8 def setup(): print('测试执行开始') def teardown(): print('测试执行结束') def test(): '''用例描述''' print('测试用例1')
再次通过cmd进行执行
通过上图可以看出来,没有任何的变化,因为这里都是执行成功的
setup出现错误
上面介绍的都是setup和teardown都正确的是,这里我们将setup出现错误
# 前置代码出现错误 def setup(): assert 1 == 0
可以通过上图看到,当我们的前置执行错误后,执行完测试用例后,后置内容就不在进行执行
teardown出现错误
当teardown出现错误,我们看看如何执行的
def teardown(): assert 1 == 0
当teardown出现错误时,代码会全部执行完成
call(用例)执行错误
通过断言的情况下,将call(测试用例)执行出现错误
# test01.py # coding:utf-8 def setup(): print('测试执行开始') def teardown(): print('测试执行结束') def test(): '''用例描述''' print('测试用例1') assert 1 == 0
可以看到前置和用例后置都出现了错误,并将错误信息全部都打印出来了。
用例报错信息存储到log
通过上面的思路,我们可以将用例的执行报错信息,全部都获取到log中,方面后续查看,这里安静通过将报错信息存储在txt文件中,道理都是一样的
# coding:utf-8 import pytest @pytest.hookimpl(hookwrapper=True, tryfirst=True) def pytest_runtest_makereport(item, call): # 获取钩子方法的调用结果 out = yield # 获取执行结果内容 report = out.get_result() if report.when == 'call': # 只获取用例的执行情况 print('测试报告:{}' .format(report)) print('当前执行步骤:{}' .format(report.when)) print('当前执行测试用例:{}' .format(report.nodeid)) print('当前用例描述:{}' .format(report.nodeid)) print('当前执行结果:{}' .format(report.outcome)) print('当前报错信息:{}' .format(report.longrepr)) print('当前报错异常信息:{}' .format(call.excinfo)) print('执行时间:{}' .format(report.duration)) with open('error.txt', 'a+') as f: # 将报错信息存储在log文件中 f.write(report.nodeid) for i in str(report.longrepr): f.write(i)
这里通过运行cmd执行测试用例,执行完成后,我们看到当前目录下生成了一个error的文件,文件信息也是我们的报错信息
笔记
目前安静收集到pytest_runtest_makereport钩子函数中常用到的几个方法:
首先通过yield方法获取到执行结果测试报告
report = yield(返回值).get_result()
当前执行步骤:report.when
当前执行测试用例:report.nodeid
当前用例描述:report.nodeid
当前执行结果:report.outcome
当前报错信息:report.longrepr
当前报错异常信息:call.excinfo
执行时间:report.duration
标签:用例,hooks,format,runtest,print,pytest,report,执行 From: https://www.cnblogs.com/qican/p/17102802.html