Postman中如何校验接口返回数组是否包含指定对象(原有写法失效)
Postman校验对象数组是否包含指定对象的实现方案
之前脚本不生效的核心原因
你写的pm.expect(jsonData).to.include(myObject)没法正常校验,本质是漏了深度比对修饰符。Postman底层用的Chai断言库中,include默认做引用层级的严格比对:碰到数组里的对象元素时,只会判断两个对象是不是同一个内存引用,根本不会逐字段匹配内部的键值对。哪怕两个对象的键、值看起来完全一模一样,只要不是同一个内存实例,断言就会直接判定不匹配。
可直接复用的修正脚本
场景1:要求数组内的对象和目标对象完全匹配(无多余字段)
只要在原有断言语句里加上deep修饰符,开启逐键值深度比对就能正常校验,完整脚本如下:
// 解析接口返回的JSON响应 const jsonData = pm.response.json(); // 定义需要校验存在的目标对象 const targetObject = { id: 3, name: "project three" }; pm.test('响应数组中存在指定对象', () => { // 加上deep修饰符,实现对象字段的逐行深度匹配 pm.expect(jsonData).to.deep.include(targetObject); });
场景2:只校验指定键值,允许对象存在其他额外字段
如果接口返回的对象附带了其他不需要校验的字段(比如创建时间、操作人、状态码等),上面的完全匹配逻辑会校验失败,这时可以通过数组遍历实现部分匹配判断:
const jsonData = pm.response.json(); const targetObject = { id: 3, name: "project three" }; pm.test('响应数组中存在带指定键值的对象', () => { // 遍历整个数组,只要存在一个元素匹配目标的所有指定键值就算通过 const isMatchExist = jsonData.some(item => { // 逐字段校验目标要求的属性是否和数组元素一致 return Object.keys(targetObject).every(key => { return item[key] === targetObject[key]; }); }); // 匹配失败时抛出明确提示,方便排查问题 pm.expect(isMatchExist, "未在响应数组中找到带指定键值的对象").to.be.true; });
内容的提问来源于stack exchange,提问作者Volodumr
相关产品推荐
相关产品推荐

