pytest的Hook函数之pytest.hookimpl(hookwrapper=True):获取测试用例结果

发布时间 2023-09-18 15:12:52作者: yimu-yimu

装饰器@pytest.hookimpl(hookwrapper=True),它的作用和装饰器@pytest.mark.hookwrapper是一样的

@pytest.hookimpl(hookwrapper=True)装饰的钩子函数,有以下两个作用:
(1)可以获取到测试用例不同执行阶段的结果(setup,call,teardown)
(2)可以获取钩子方法的调用结果(yield返回一个result对象)和调用结果的测试报告(返回一个report对象)
把这代码放在confest.py文件中

@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):   #对于给定的测试用例(item)和调用步骤(call),返回一个测试报告对象(_pytest.runner.TestReport)
    """
  每个测试用例执行后,制作测试报告
  :param item:测试用例对象
  :param call:测试用例的测试步骤
           执行完常规钩子函数返回的report报告有个属性叫report.when
            先执行when=’setup’ 返回setup 的执行结果
            然后执行when=’call’ 返回call 的执行结果
            最后执行when=’teardown’返回teardown 的执行结果
  :return:
  """
    # 获取常规钩子方法的调用结果,返回一个result对象
    out = yield
    # print("用例执行结果", out)
    # # 获取调用结果的测试报告,返回一个report对象, report对象的属性包括when(steup, call, teardown三个值)、nodeid(测试用例的名字)、outcome(用例的执行结果,passed,failed)
    report = out.get_result()
    if report.when == "call":  #  只获取call的结果(即只获取测试用例的结果)
        # print("测试报告: %s" % report)
        # print("步骤: %s" % report.when)
        # print("nodeid: %s" % report.nodeid)
        # print("description: %s" % str(item.function.__doc__))
        # print("运行结果: %s" % report.outcome)
        return report.outcome