在Postman中校验响应字段需先解析JSON,用pm.response.json()而非text();优先用_.get或可选链安全取嵌套值;结合to.have.property、is.a()、to.equal()实现存在性、类型、值三重校验;务必加状态码判断或try/catch防解析失败。

如何在 Postman 中校验响应字段值等于预期值
直接用 pm.expect() 配合 to.equal() 就能完成基础值比对,但实际中常因数据类型、嵌套结构或空值处理不当导致校验失败。
- 响应是 JSON 时,必须先用
pm.response.json()解析,不能直接对response.text()做字符串比对 - 字段路径错误(比如把
data.user.name写成user.name)会抛出TypeError: Cannot read property 'name' of undefined - 数字和字符串混用很危险:API 返回
"123"(字符串),而脚本写to.equal(123)会失败;建议统一转成字符串比对,或用to.deep.equal()处理复合结构
提取并校验嵌套 JSON 字段(如 data.items[0].id)
Postman 不支持原生 XPath 或 JSONPath 表达式,必须靠 JavaScript 路径访问。多层嵌套时推荐先解构再断言,避免一长串点号出错。
const res = pm.response.json();
// 安全取值,避免 undefined 报错
const id = _.get(res, 'data.items[0].id'); // 需提前在 Pre-request Script 引入 lodash(或用可选链)
pm.expect(id).to.equal('abc-123');
- 不推荐写
res.data.items[0].id—— 任一层为null/undefined就中断执行 - Postman 内置
lodash(版本 4.x),可用_.get(obj, path, defaultValue)安全取值 - 若不用 lodash,可用可选链操作符:
res?.data?.items?.[0]?.id(需确保 Postman 版本 ≥9.15,且脚本运行环境支持 ES2020)
校验字段存在性 + 类型 + 值三合一
只比对值不够,很多接口契约要求字段“必须存在且为字符串”。用 pm.expect() 链式调用可一次覆盖多个条件。
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
const json = pm.response.json();
pm.expect(json).to.have.property('status').that.is.a('string').and.to.equal('success');
-
to.have.property('xxx')检查字段是否存在(不关心值) -
.that.is.a('number')校验类型,支持'string'、'number'、'array'、'object'等 - 注意
is.a('string')和is.string效果不同:后者是 Chai 的旧写法,新版推荐带括号的a()
常见失败原因:响应未解析 / 状态码非 2xx 也执行校验
Postman 的 Tests 脚本默认在任何响应后都运行,哪怕返回 404 或 500。如果脚本里直接 pm.response.json(),遇到非 JSON 响应(如 HTML 错误页)会报 SyntaxError: Unexpected token 。
- 务必加状态码守卫:
if (pm.response.code === 200) { ... } - 更稳妥的做法是用
try/catch包裹 JSON 解析:
try {
const json = pm.response.json();
pm.expect(json.id).to.equal(1001);
} catch (e) {
pm.expect.fail('Response is not valid JSON: ' + e.message);
}
真正容易被忽略的是:Postman 默认不阻断后续测试——即使某个 expect 失败,后面的断言仍会执行。如果你依赖前面字段赋值给变量,出错后变量可能是 undefined,导致后续断言报错信息完全偏离真实问题。
















