结构校验是什么
用 JSON Schema 对接口响应做结构校验:字段类型、必填项、枚举、嵌套结构、格式约束。它与「断言具体值」互补——值随数据变化,结构必须稳定;接口悄悄改类型、漏字段、扩枚举时,schema 校验能第一时间报警,是契约测试里最轻量的入口。
基本信息
| 规范版本 | draft-07、2020-12 常用,注意校验器对版本的支持范围 |
|---|---|
| 常用关键字 | type、required、properties、enum、items、format |
| 组合关键字 | allOf、anyOf、oneOf、not 表达复杂约束 |
| 复用 | $ref 与 $defs 抽取公共结构,避免复制粘贴 |
| Python 工具 | jsonschema 库的 validate 直接校验字典 |
| Node 工具 | ajv 编译 schema 后校验,性能好、报错细 |
最小示例
最小示例
from jsonschema import validate
schema = {
"type": "object",
"required": ["id", "status"],
"properties": {
"id": {"type": "integer"},
"status": {"enum": ["active", "closed"]},
},
}
validate(instance=resp.json(), schema=schema) # 结构不符即抛异常典型使用场景
- 契约回归:发版前后用同一份 schema 对比结构稳定性
- 第三方接口验收:先约定 schema,再核对返回值
- 批量巡检:核心接口各写一份 schema,定时全量扫一遍
- Mock 数据校验:确认桩数据符合真实接口结构
- 文档辅助:由 schema 生成示例与字段说明
- CI 快速拦截:在流水线早期抓 breaking change
- 上线前回归:高频接口的 schema 校验并入冒烟套件,结构一漂就报警
常见关键字怎么用
| 关键字 | 检查什么 | 注意 |
|---|---|---|
| required | 字段是否缺失 | 漏字段是最常见的破坏性变更 |
| type | 类型是否漂移 | 整数变字符串是典型事故 |
| enum | 取值是否在集合内 | 后端扩枚举时要同步更新 |
| format | 日期、邮箱等格式 | 多数实现默认不强制,需显式开启 |
| additionalProperties | 未声明字段策略 | 置 false 会把新增字段判失败,按需使用 |
format 约束在多数校验器里默认只警告或跳过,关键格式(日期、金额字符串)要另写显式断言补上。
schema 按接口独立成文件进版本库,随接口文档一起评审:接口改字段时 schema 的 diff 就是最好的变更记录。
schema 写太死(全字段 required 加禁止新增字段)会把合法的新增字段判为失败,破坏性检查只在契约冻结期使用。