postman动态断言
·
在Postman中,如果接口返回的数据是实时变更的(例如时间戳、动态生成的ID等),你可以使用动态断言来处理这些变化。以下是几种常见的处理方法:
### 1. 使用正则表达式匹配
如果返回的数据中包含动态部分,可以使用正则表达式来匹配这些部分。
pm.test("返回值包含动态时间戳", function () {
var responseText = pm.response.text();
var regex = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z/; // 匹配ISO 8601格式的时间戳
pm.expect(responseText).to.match(regex);
});
### 2. 忽略特定字段
如果某些字段是动态的,可以在断言时忽略这些字段。
pm.test("检查json数据,忽略动态字段", function () {
var jsonData = pm.response.json();
delete jsonData.timestamp; // 假设timestamp是动态字段
pm.expect(jsonData).to.eql({
"cityid": "101120101",
"city": "济南",
"wea": "晴",
"wea_img": "qing",
"tem": "28",
"tem_day": "31",
"tem_night": "21",
"win": "西风",
"win_speed": "2级",
"win_meter": "9km/h",
"air": "60"
});
});
### 3. 使用环境变量
如果某些动态数据在多个测试中重复使用,可以将其存储在环境变量中,并在断言时使用。
// 假设你已经将动态数据存储在环境变量中
pm.environment.set("dynamic_id", "1833430951772737537");
pm.test("检查json数据,使用环境变量", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.records[0].id).to.eql(pm.environment.get("dynamic_id"));
});
### 4. 使用动态生成器
如果某些数据是动态生成的,可以在请求前生成这些数据,并将其用于断言。
// 生成动态数据
var dynamicId = "1833430951772737537"; // 假设这是动态生成的ID
pm.environment.set("dynamic_id", dynamicId);
pm.test("检查json数据,使用动态生成的ID", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.records[0].id).to.eql(pm.environment.get("dynamic_id"));
});
### 5. 使用JSON Schema验证
如果返回的数据结构是固定的,但某些字段的值是动态的,可以使用JSON Schema来验证数据结构。
pm.test("验证JSON Schema", function () {
var schema = {
"type": "object",
"properties": {
"cityid": {"type": "string"},
"city": {"type": "string"},
"update_time": {"type": "string"},
"wea": {"type": "string"},
"wea_img": {"type": "string"},
"tem": {"type": "string"},
"tem_day": {"type": "string"},
"tem_night": {"type": "string"},
"win": {"type": "string"},
"win_speed": {"type": "string"},
"win_meter": {"type": "string"},
"air": {"type": "string"}
},
"required": ["cityid", "city", "update_time", "wea", "wea_img", "tem", "tem_day", "tem_night", "win", "win_speed", "win_meter", "air"]
};
pm.expect(tv4.validate(pm.response.json(), schema)).to.be.true;
});
接口返回数据:
{
"code": 200,
"success": true,
"data": {
"records": [
{
"id": "1833430951772737537",
"createUser": "1123598821738675201",
"createDept": "1123598813738675201",
"createTime": "2024-09-10 17:02:57",
"updateUser": "1802982657941934082",
"updateTime": "2024-09-11 17:13:29",
"status": 1,
"isDeleted": 0,
"tenantId": "000000",
"noticeTitle": "公告21",
"signDept": "1587724131710803970",
"signTime": "2024-09-11",
"content": "<p>先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。<br/>宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。<br/>侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。<br/>将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。<br/>亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。<br/>臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。<br/>先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。<br/>愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言。深追先帝遗诏,臣不胜受恩感激。<br/>今当远离,临表涕零,不知所言。</p>",
"toDeptId": null,
"toDeptIds": "1587339567565905922",
"wordSize": "发文字号",
"createNoticeTime": "2024-09-10",
"signStatus": 1,
"postName": "门店客服",
"toDeptName": "武汉分公司"
},
{
"id": "1833696067349041154",
"createUser": "1123598821738675201",
"createDept": "1123598813738675201",
"createTime": "2024-09-11 10:36:26",
"updateUser": "1123598821738675201",
"updateTime": "2024-09-11 10:36:28",
"status": 1,
"isDeleted": 0,
"tenantId": "000000",
"noticeTitle": "1111",
"signDept": "1587071656506957825",
"signTime": "2024-09-11",
"content": "<p>1111</p>",
"toDeptId": null,
"toDeptIds": "1587339567565905922,1589448214454476802,1589448585012846594,1590163832180928514,1590163923016970242,1590164315129868290,1590164369978781698,1590164732626694145,1590164615353954306,1590164543555858433,1590164485028540418,1590164798959611906,1590164854320230401,1590164983957778434,1590165423462117377,1590165495079858178",
"wordSize": "111",
"createNoticeTime": "2024-09-11",
"signStatus": 1,
"postName": "集团总经理",
"toDeptName": "武汉分公司,十堰分公司,襄阳分公司,南昌分公司,宁夏分公司,太原分公司,大同分公司,郑州分公司,重庆分公司,成都分公司,济南分公司,临沂分公司,青岛分公司,芜湖分公司,常州分公司,无锡分公司"
},
{
"id": "1833349359154941953",
"createUser": "1123598821738675201",
"createDept": "1123598813738675201",
"createTime": "2024-09-10 11:38:44",
"updateUser": "1123598821738675201",
"updateTime": "2024-09-10 15:58:40",
"status": 1,
"isDeleted": 0,
"tenantId": "000000",
"noticeTitle": "1234567890123456789012345678901234567890123456789012345678901234",
"signDept": "1587071656506957825",
"signTime": "2024-09-10",
"content": "<p>hahha </p>",
"toDeptId": null,
"toDeptIds": "1589448214454476802",
"wordSize": "22",
"createNoticeTime": "2024-09-10",
"signStatus": 1,
"postName": "集团总经理",
"toDeptName": "十堰分公司"
}
],
"total": 3,
"size": 10,
"current": 1,
"orders": [],
"optimizeCountSql": true,
"searchCount": true,
"maxLimit": null,
"countId": null,
"pages": 1
},
"msg": "操作成功"
}
验证数据结构
// 引入ajv库
const Ajv = require('ajv');
const ajv = new Ajv();
// 定义JSON Schema
const schema = {
"type": "object",
"properties": {
"code": {"type": "integer"},
"success": {"type": "boolean"},
"data": {
"type": "object",
"properties": {
"records": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {"type": "string"},
"createUser": {"type": "string"},
"createDept": {"type": "string"},
"createTime": {"type": "string"},
"updateUser": {"type": "string"},
"updateTime": {"type": "string"},
"status": {"type": "integer"},
"isDeleted": {"type": "integer"},
"tenantId": {"type": "string"},
"noticeTitle": {"type": "string"},
"signDept": {"type": "string"},
"signTime": {"type": "string"},
"content": {"type": "string"},
"toDeptId": {"type": ["string", "null"]},
"toDeptIds": {"type": "string"},
"wordSize": {"type": "string"},
"createNoticeTime": {"type": "string"},
"signStatus": {"type": "integer"},
"postName": {"type": "string"},
"toDeptName": {"type": "string"}
},
"required": ["id", "createUser", "createDept", "createTime", "updateUser", "updateTime", "status", "isDeleted", "tenantId", "noticeTitle", "signDept", "signTime", "content", "toDeptIds", "wordSize", "createNoticeTime", "signStatus", "postName", "toDeptName"]
}
},
"total": {"type": "integer"},
"size": {"type": "integer"},
"current": {"type": "integer"},
"orders": {"type": "array"},
"optimizeCountSql": {"type": "boolean"},
"searchCount": {"type": "boolean"},
"maxLimit": {"type": ["integer", "null"]},
"countId": {"type": ["integer", "null"]},
"pages": {"type": "integer"}
},
"required": ["records", "total", "size", "current", "orders", "optimizeCountSql", "searchCount", "maxLimit", "countId", "pages"]
},
"msg": {"type": "string"}
},
"required": ["code", "success", "data", "msg"]
};
// 验证JSON Schema
pm.test("验证JSON Schema", function () {
const responseData = pm.response.json();
const validate = ajv.compile(schema);
const valid = validate(responseData);
// 输出调试信息
console.log("Response Data:", JSON.stringify(responseData, null, 2));
console.log("Validation Result:", valid);
if (!valid) {
console.log("Validation Errors:", validate.errors);
}
pm.expect(valid).to.be.true;
});
### 总结
通过使用正则表达式、忽略特定字段、环境变量、动态生成器和JSON Schema,你可以有效地处理接口返回数据实时变更的情况,并进行相应的断言。这些方法可以帮助你确保API的响应在动态数据变化的情况下仍然符合预期。
更多推荐


所有评论(0)