在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&nbsp;</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的响应在动态数据变化的情况下仍然符合预期。

更多推荐