前言

pytest提供的很多钩子(Hooks)方法方便我们对测试用例框架进行二次开发,可以根据自己的需求进行改造。

先学习下pytest_runtest_makereport这个钩子方法,可以更清晰的了解用例的执行过程,并获取到每个用例的执行结果。

pytest_runtest_makereport

先看下相关的源码,在​​_pytest/runner.py​​下,可以导入之后,点进去查看



from _pytest import runner

# 对应源码
def pytest_runtest_makereport(item, call):
""" return a :py:class:`_pytest.runner.TestReport` object
for the given :py:class:`pytest.Item` and
:py:class:`_pytest.runner.CallInfo`.
"""


这里item是测试用例,call是测试步骤,具体执行过程如下:

  • 先执行when='setup' 返回setup 的执行结果
  • 然后执行when='call' 返回call 的执行结果
  • 最后执行when='teardown'返回teardown 的执行结果

 

运行案例

1、该插件作用于pytest的钩子函数上,可以获取到测试用例不同执行阶段的结果(setup,call,teardown)

2、可以获取钩子方法的调用结果(返回一个result对象)和调用结果的测试报告(返回一个report对象)

conftest.py 写 pytest_runtest_makereport 内容,打印运行过程和运行结果



import pytest
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
print('------------------------------------')

# 获取钩子方法的调用结果
out = yield
print('用例执行结果', out)

# 从钩子方法的调用结果中获取测试报告
report = out.get_result()

print('测试报告:%s' % report)
print('步骤:%s' % report.when)
print('nodeid:%s' % report.nodeid)
print('description:%s' % str(item.function.__doc__))
print(('运行结果: %s' % report.outcome))


运行结果:执行三次的原因是此钩子函数会在测试用例执行的不同阶段(setup, call, teardown)都会调用一次


 testcase/test_getRegionCountry/test_GetRegionCountry.py::test_getRightrequest <pluggy.callers._Result object at 0x0000000004B7D828>

<TestReport 'testcase/test_getRegionCountry/test_GetRegionCountry.py::test_getRightrequest' when='setup' outcome='passed'>
setup
testcase/test_getRegionCountry/test_GetRegionCountry.py::test_getRightrequest
passed
<pluggy.callers._Result object at 0x0000000002FAA748>
<TestReport 'testcase/test_getRegionCountry/test_GetRegionCountry.py::test_getRightrequest' when='call' outcome='passed'>
call
testcase/test_getRegionCountry/test_GetRegionCountry.py::test_getRightrequest
passed
PASSED<pluggy.callers._Result object at 0x000000000303F5F8>
<TestReport 'testcase/test_getRegionCountry/test_GetRegionCountry.py::test_getRightrequest' when='teardown' outcome='passed'>
teardown
testcase/test_getRegionCountry/test_GetRegionCountry.py::test_getRightrequest
passed