pytest-json-report默认不捕获接口响应体,需通过pytest_json_extra钩子手动注入response.json()等数据到report.user_properties,注意异常处理与大小限制。

pytest-json-report 生成的 JSON 报告里没有接口响应体?
不是插件问题,是它默认只记录测试结果(pass/fail)、耗时、用例名,response.json() 这类运行时数据根本不会自动捕获。想校验返回 JSON,得自己把数据塞进去——要么在测试函数里主动写入,要么用 fixture 拦截响应。
常见错误现象:pytest --json-report 生成的 report.json 文件里搜不到 "data" 或 "code" 字段,误以为插件支持自动解析接口返回。
- 必须手动将响应内容存到
pytest的test_report对象里,或通过extra参数传给插件 - 推荐在 fixture 中统一处理:用
requests.Response对象调用.json(),再用pytest_json_extra钩子注入 - 注意异常分支:如果接口返回非 JSON(如 502、空响应、HTML 错误页),
.json()会抛JSONDecodeError,必须try/except包裹,否则测试直接中断
如何把接口响应 JSON 写进 pytest-json-report 的 report.json?
核心是利用插件提供的 pytest_json_extra 钩子函数,在测试执行后往报告里加字段。不能靠装饰器或 print,必须走这个钩子路径。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 在
conftest.py里定义pytest_json_extra函数,接收report和config参数 - 用
report.user_properties存原始响应(response.text)或解析后结构(response.json()),例如:report.user_properties.append(("response_json", resp_json)) - 确保你的测试函数把
response对象存到了report.user_properties或通过pytest.mark传参带过去;否则钩子拿不到数据 - 避免直接存大文件或二进制响应体,会撑爆
report.json;超 10KB 建议只存status_code、keys()、len(data)等摘要信息
用 pytest-check 替代断言 + pytest-json-report 能否自动记录失败详情?
可以,但和 pytest-json-report 是两套逻辑:pytest-check 只负责让单个测试不因一个 assert 失败就退出,它的失败信息默认写进 pytest 的 stdout,不会自动进 report.json。
要让它出现在 JSON 报告里,仍需配合钩子:
- 在
pytest_runtest_makereport钩子里检查report.failed且"check" in report.longreprtext - 从
report.longreprtext提取关键校验点(比如 “expected key ‘msg’”),写入report.user_properties - 别依赖
pytest-check自动注入 JSON 字段——它没这个设计,强行读sys.stdout捕获也不稳定 - 更稳的做法:用
pytest-assume+ 自定义 fixture 封装assert,每次校验都显式调用record_property("json_check", {...})
校验 JSON 结构时,$ref、nullable、enum 怎么对应到 Python 断言?
OpenAPI 规范里的这些字段,Python 测试里没法直接“映射”,得拆解成具体判断。比如 "nullable": true 不代表字段可为 None 就完事,还要看它在响应里实际是否出现、类型是否匹配。
典型处理方式:
-
$ref→ 手动展开引用的 schema,提取properties定义,用jsonschema.validate()校验,错误信息比手写 assert 清晰 -
"nullable": true→ 先检查字段是否存在(key in data),再检查值是否为None或符合类型(如isinstance(data.get("id"), (int, type(None)))) -
"enum": ["open", "close"]→ 不要用in粗暴判断,先确认字段存在且非空,再做assert data["status"] in {"open", "close"},避免KeyError掩盖真实问题 - 性能影响:每轮测试跑完整
jsonschema校验会慢 20–50ms,高频用例建议只在校验入口响应或 nightly pipeline 里启用
真正麻烦的不是怎么写校验逻辑,而是谁来维护 JSON Schema 和测试断言的一致性——接口字段一变,分散在各处的 assert key in data 很容易漏改。不如把 schema 当唯一源,测试只负责调用校验函数。


















