pytest-json-report 默认生成非标准json,需显式启用--json-report并指定路径,旧版本存在datetime等类型序列化问题,应升级至≥1.5.0,避免与--junitxml混用,json结构中duration为秒级float、outcome为字符串,不兼容junit需另用转换工具。

直接用 pytest-json-report 默认生成的不是标准 JSON,而是带 Python 对象引用(如 datetime、Decimal)的非序列化数据,会报 TypeError: Object of type datetime is not JSON serializable —— 这是绝大多数人卡住的第一步。
安装后必须加 --json-report 且禁用默认输出
很多人装完就跑 pytest,发现没生成 report.json,其实插件默认不激活。必须显式启用,并关闭 pytest 原生控制台输出,否则 JSON 文件可能为空或损坏:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 运行命令必须包含
--json-report - 建议加上
--json-report-file report.json显式指定路径 - 加上
-s或--capture=no会影响 JSON 内容完整性,慎用;若需调试,优先用--log-cli-level=INFO - 避免同时使用
--junitxml,二者日志结构冲突,可能导致 JSON 字段缺失
遇到 TypeError: Object of type datetime is not JSON serializable
这是插件底层未处理 pytest 内部时间对象导致的。它不依赖你写自定义 encoder,而是靠插件自己的序列化逻辑 —— 但该逻辑在旧版本(
- 升级到
pytest-json-report>=1.5.0(pip install -U pytest-json-report) - 确认安装后执行
pytest --version能看到插件版本号,避免被缓存旧版覆盖 - 如果仍报错,检查是否手动 patch 了
pytest_runtest_makereporthook —— 自定义 hook 会绕过插件的defaultencoder
生成的 JSON 结构不符合 CI/CD 工具解析预期
比如 Jenkins 的 JUnit Parser 插件读不了,或前端图表工具无法提取 duration 字段,问题往往出在字段层级或值类型上:
-
tests数组里每个用例的duration是 float 秒(不是毫秒),单位要对齐消费方要求 -
outcome值为"passed"/"failed"/"skipped",不是布尔或数字,别硬转 - 错误堆栈在
trace字段下,是字符串而非 list,不要当成数组遍历 - 想兼容 JUnit 格式?别改 JSON 输出,改用
pytest-junitxml+ XSLT 转换,pytest-json-report不承诺 JUnit 兼容性
真正麻烦的是混合使用 fixtures(尤其是 session-scoped)和自定义异常类时,repr 信息会被截断或丢掉 —— 这部分 JSON 生成逻辑不在用户可控范围,得看插件是否调用了 py.io.saferepr。能做的只有:保持 pytest 和插件版本匹配,别在 conftest.py 里 monkey patch TestReport 类。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










