likes
comments
collection
share

使用pytest_runtest_logreport方法进行测试日志记录的实践

作者站长头像
站长
· 阅读数 31

前言

pytest_runtest_logreport 钩子函数介绍

pytest_runtest_logreport 是 pytest 框架中的一个钩子函数,用于处理测试期间发生的各种事件。它会在每个测试项(例如测试用例或测试函数)执行期间被调用,提供了丰富的信息和操作选项。

该方法接收一个名为 "report" 的参数,该参数是一个包含测试报告相关信息的对象。我们可以通过分析 report 对象的属性来获取有关测试的重要信息,例如测试结果、日志输出等。

以下是 report 对象常用的一些属性:

  • report.when: 测试发生的时间点,例如:"call" 表示测试函数调用前,"teardown" 表示测试函数执行后。
  • report.outcome: 测试结果,例如:"passed" 表示测试通过,"failed" 表示测试失败。
  • report.longrepr: 详细的测试结果信息,例如失败时的堆栈跟踪信息。

使用场景

在编写测试用例时,我们希望能够详细了解每个测试的执行情况,包括测试开始、测试结束、测试失败等。pytest_runtest_logreport 方法为我们提供了一种机制,可以捕获并记录这些关键事件和相关日志信息。

下面通过一个案例来说明如何使用 pytest_runtest_logreport 方法记录测试日志。

conftest.py

def pytest_runtest_logreport(report):
    print(f"======={report}")
    outcome = report.outcome
    if report.when == "call":
        print("开始执行测试:", report.nodeid)
        if outcome == "passed":
            print("测试通过:", report.nodeid)
        elif outcome == "failed":
            print("测试失败:", report.nodeid)
            print("错误信息:", report.longrepr)

test_demo.py

def test_addition():
    assert 2 + 2 == 4

在上面的示例中,我们编写了一个简单的测试用例 test_demo,它断言 2 + 2 是否等于 4。同时,我们定义了一个 pytest_runtest_logreport 函数,并根据 report 的属性来输出不同的日志信息。

当我们运行该测试用例时,pytest_runtest_logreport 方法会被调用三次:when=="setup",when=="call",when=="teardown"。我们看输出结果:

=======<TestReport 'test_dir/test_demo.py::test_addition' when='setup' outcome='passed'>
PASSED=======<TestReport 'test_dir/test_demo.py::test_addition' when='call' outcome='passed'>
开始执行测试: test_dir/test_demo.py::test_addition
测试通过: test_dir/test_demo.py::test_addition
=======<TestReport 'test_dir/test_demo.py::test_addition' when='teardown' outcome='passed'>

运行机制

pytest_runtest_logreport钩子函数的运行机制如下:

  1. 在 pytest 执行过程中,当一个测试项(例如测试函数或测试方法)开始设置、调用、拆除时,pytest 会触发 pytest_runtest_logreport 钩子函数。

  2. 钩子函数接收一个参数 report,它是一个 TestReport 对象,包含了当前测试项的详细信息,如测试项的名称、结果状态等。

  3. 钩子函数根据 report 对象的 when 属性,可以判断当前的测试阶段。when 属性可取的值有:

    • 'setup':表示当前处于测试项的设置阶段,即在执行测试项之前进行的准备工作。
    • 'call':表示当前处于测试项的调用阶段,即执行测试项本身的阶段。
    • 'teardown':表示当前处于测试项的拆除阶段,即在执行测试项之后进行的清理工作。
  4. 根据不同的测试阶段,钩子函数可以执行相关的处理操作,例如打印日志、记录结果、生成报告等。

总结一下,pytest_runtest_logreport 钩子函数可以在测试项的设置、调用和拆除阶段捕获并处理相应的日志报告。开发人员可以根据需要编写自定义的钩子函数,实现对测试过程的监控、记录和分析。

最后

通过使用 pytest_runtest_logreport 方法,我们可以方便地记录测试执行期间的各种事件和日志信息。这为测试过程的分析和调试提供了强大的工具。我们可以根据具体需求自定义 pytest_runtest_logreport 函数,以满足不同的日志记录需求。

转载自:https://juejin.cn/post/7291931852788449334
评论
请登录