pytest-reportlog 是第三方日志插件,以 jsonl 格式记录测试事件(如开始、通过、失败等),不生成 html 报告或统计,仅忠实记录“发生了什么”和“何时发生”,适用于 ci 排查与 elk 分析。

pytest-reportlog 是什么,它能记录什么
它不是 pytest 内置插件,而是第三方日志输出插件,作用是把测试执行过程中的每个关键事件(如测试开始、通过、失败、跳过、错误、会话结束)以 JSON 行格式(JSONL)写入文件。它不生成 HTML 报告,也不做聚合统计,只忠实记录“发生了什么”和“什么时候发生的”。如果你需要排查 CI 中某次测试挂在哪一步、哪个 fixture 没执行完、或想用 ELK 做日志分析,pytest-reportlog 就是那个最轻量又最透明的日志源。
安装与启用 reportlog 的最小配置
直接 pip 安装即可,无需额外配置文件:
pip install pytest-reportlog
运行时加 --report-log 参数指定输出路径:
pytest --report-log report.jsonl
注意以下三点:
-
--report-log后面的路径必须是文件路径,不能是目录;如果父目录不存在,pytest 不会自动创建,会报OSError: No such file or directory - 日志是追加写入(append),每次运行都会新增行,不会覆盖——所以长期使用需自己轮转或清理
report.jsonl - 它默认不捕获 stdout/stderr 输出内容,如需记录 print 或 logging.info,得额外加
-s或--capture=no,否则那些输出只在终端闪一下,不会进 report.jsonl
reportlog 日志中关键字段怎么看
每行是一个 JSON 对象,核心字段包括 event(事件类型)、nodeid(测试标识符)、duration(耗时秒数)、when(阶段:setup/call/teardown)、outcome(结果:passed/failed/skipped/error)。
常见误读点:
-
event值为test_report时才代表一个测试项的完整生命周期;collect_report是收集阶段,跟实际执行无关 - 一个测试函数可能对应多条
test_report记录(比如参数化测试),每条的nodeid含索引,如test_example.py::test_add[1-2] -
duration只统计call阶段,setup 和 teardown 耗时不计入——若要总耗时,得匹配同一nodeid的 setup + call + teardown 三条记录手动累加
如何配合其他工具做进一步分析
report.jsonl 是标准 JSONL,可直接用 Python、jq、pandas 流式处理:
例如用 jq 查看所有失败项:
jq 'select(.outcome == "failed")' report.jsonl
或用 Python 提取耗时超 1 秒的测试:
import json<br>with open("report.jsonl") as f:<br> for line in f:<br> record = json.loads(line)<br> if record.get("event") == "test_report" and record.get("duration", 0) > 1:<br> print(record["nodeid"], record["duration"])
注意:report.jsonl 不包含 traceback 文本——失败详情藏在 longrepr 字段里,但它是嵌套结构,且含 ANSI 转义符;真正做自动化解析时,建议优先用 pytest --tb=short --no-header 配合 --log-file 单独捕获 traceback,别指望靠 reportlog 把错误堆栈还原清楚。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











