结论:应使用 pm.expect(jsonData).to.have.property("key") 判断字段存在,因其仅检查 key 是否声明,不误判 null、false 等 falsy 值,且避免 JSON 解析失败导致中断。

直接说结论:用 pm.expect(jsonData).to.have.property("key"),不是 .to.include(),也不是 jsonData.key !== undefined —— 后两者在字段为 null 或 false 时会误判。
为什么不能用 jsonData.key !== undefined 判断字段存在
这个写法看似直观,但实际会漏掉两种关键情况:
- 字段值是
null(JSON 中合法值),jsonData.key !== undefined返回true,但它确实存在;但你想确认的是“字段被定义”,不是“值非 undefined” - 字段值是
false、0、""等 falsy 值,同样可能被误认为“不存在” - 更隐蔽的问题:如果响应体根本不是 JSON(比如返回了 HTML 或空字符串),
pm.response.json()会直接抛错,整个断言中断,不会进入后续判断
pm.expect(...).to.have.property() 的正确用法
这是 Chai 断言库提供的语义最准确的方式,只检查对象是否**声明了该 key**,不关心值是什么类型或真假值。
- 基础写法:
pm.expect(jsonData).to.have.property("data") - 嵌套字段要先确保上层存在,否则报错:
pm.expect(jsonData).to.have.property("result").that.is.an("object"); pm.expect(jsonData.result).to.have.property("items") - 检查数组长度 + 元素字段(常见于
data[0].id):pm.expect(jsonData.data).to.be.an("array").and.to.have.length.above(0); pm.expect(jsonData.data[0]).to.have.property("id") - 注意:如果字段名含点号(如
"user.name"),.property()不支持路径解析,得改用_.has()(需先引入 Lodash)或手动拆解
遇到 TypeError: Cannot read property 'xxx' of null 怎么办
这是最常卡住新手的错误,本质是 jsonData 解析失败或某层为 null。必须加防御性判断:
- 先确保响应可解析:
try { var jsonData = pm.response.json(); } catch (e) { tests["JSON parse failed"] = false; return; } - 再逐层检查非空:
pm.expect(jsonData).to.exist; pm.expect(jsonData.data).to.exist;(.to.exist检查是否非null且非undefined) - 不要写
jsonData.data.items[0].id这种长链访问,拆成多步断言,失败时能准确定位哪一层缺失
字段存在性不是“有没有值”,而是“键有没有被定义”。很多接口文档写“字段可选”,但测试时你得明确知道:它出现时必须有这个 key,哪怕值是 null —— 这才是契约的真实含义。别省那两行防御代码,线上环境里,少一次 undefined 报错,就少一次排查半夜告警。










