使用pytest_runtest_logreport方法进行测试日志记录的实践
前言
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
钩子函数的运行机制如下:
-
在 pytest 执行过程中,当一个测试项(例如测试函数或测试方法)开始设置、调用、拆除时,pytest 会触发
pytest_runtest_logreport
钩子函数。 -
钩子函数接收一个参数
report
,它是一个TestReport
对象,包含了当前测试项的详细信息,如测试项的名称、结果状态等。 -
钩子函数根据
report
对象的when
属性,可以判断当前的测试阶段。when
属性可取的值有:'setup'
:表示当前处于测试项的设置阶段,即在执行测试项之前进行的准备工作。
'call'
:表示当前处于测试项的调用阶段,即执行测试项本身的阶段。'teardown'
:表示当前处于测试项的拆除阶段,即在执行测试项之后进行的清理工作。
-
根据不同的测试阶段,钩子函数可以执行相关的处理操作,例如打印日志、记录结果、生成报告等。
总结一下,pytest_runtest_logreport
钩子函数可以在测试项的设置、调用和拆除阶段捕获并处理相应的日志报告。开发人员可以根据需要编写自定义的钩子函数,实现对测试过程的监控、记录和分析。
最后
通过使用 pytest_runtest_logreport 方法,我们可以方便地记录测试执行期间的各种事件和日志信息。这为测试过程的分析和调试提供了强大的工具。我们可以根据具体需求自定义 pytest_runtest_logreport 函数,以满足不同的日志记录需求。
转载自:https://juejin.cn/post/7291931852788449334