如何在Postman中不区分大小写检查updatedBy.name字段的升序排序?
问题:验证接口数据按updatedBy.name不区分大小写升序排序的正确性
需求场景
需要验证接口返回的5000+条数据是否按updatedBy.name字段不区分大小写升序排序,但现有测试逻辑遇到大写字母或null值时会失败。
响应体示例
{ "data": [ { "id": 1117, "acceptance": { "externalId": "33232" }, "statusIdFrom": { "id": 1, "name": "Create" }, "statusIdTo": { "id": 1, "name": "Create" }, "createdAt": "2021-11-26T06:20:08.717Z", "updatedBy": { "id": 15, "name": "fabric", "fullname": "fabric", "departmentId": 1 } }, { "id": 1118, "acceptance": { "externalId": "33234" }, "statusIdFrom": { "id": 1, "name": "Create" }, "statusIdTo": { "id": 1, "name": "Create" }, "createdAt": "2021-11-26T07:57:34.108Z", "updatedBy": { "id": 15, "name": "production", "fullname": "production", "departmentId": 1 } }, { "id": 1119, "acceptance": { "externalId": "33236" }, "statusIdFrom": { "id": 1, "name": "Create" }, "statusIdTo": { "id": 11, "name": "Delete" }, "createdAt": "2021-11-26T07:57:35.238Z", "updatedBy": { "id": 15, "name": "warehouse", "fullname": "warehouse", "departmentId": 1 } } ], "quantity": 5449 }
现有测试代码的问题
方案1(Lodash默认排序)
以下代码仅在名称全小写时有效,遇到大写字母会失败——因为Lodash默认排序是区分大小写的(大写字母ASCII值小于小写,会排在前面):
let resp = pm.response.json(); console.log(resp.data); var _ = require('lodash'); let expectedSortedOrder = _.orderBy(resp.data, ['updatedBy.name'],['asc']); console.log(expectedSortedOrder); pm.test('sort column', () => { pm.expect(resp.data).to.eql(expectedSortedOrder); });
方案2(手动校验)
以下代码遇到updatedBy或name为null时会直接崩溃,因为没有处理空值的情况:
pm.test("sort column", () => { const response = pm.response.json(); // Extract all ids in an array const art = response.data.map(item => item.updatedBy.name); // Check that all are ascending function isAscending(a) { return a.every((x, i) => { return i === 0 || x >= a[i-1]; }); } pm.expect(isAscending(art)).to.be.true; });
可行解决方法
方法1:改进Lodash排序,兼容空值和不区分大小写
通过自定义迭代器处理空值,并将名称统一转小写后排序:
let resp = pm.response.json(); var _ = require('lodash'); // 自定义排序规则:处理空值,转小写后排序,空值默认排在最前 let expectedSortedOrder = _.orderBy(resp.data, [item => { // 可选:若要将空值排在最后,可把''换成'zzzzz'这类大值 return item?.updatedBy?.name?.toLowerCase() || ''; }], ['asc']); pm.test('数据按updatedBy.name不区分大小写升序排序', () => { pm.expect(resp.data).to.eql(expectedSortedOrder); });
方法2:手动校验排序逻辑,兼容空值和大小写
遍历数据逐个比较,明确处理空值场景,同时做不区分大小写的比较:
pm.test("数据按updatedBy.name不区分大小写升序排序", () => { const response = pm.response.json(); const data = response.data; const isSortedAscending = data.every((currentItem, index) => { if (index === 0) return true; // 第一项无需比较 const prevName = data[index-1]?.updatedBy?.name; const currentName = currentItem?.updatedBy?.name; // 空值处理规则:null/undefined排在最前面 if (prevName == null && currentName == null) return true; if (prevName == null) return true; if (currentName == null) return false; // 不区分大小写比较 return prevName.toLowerCase() <= currentName.toLowerCase(); }); pm.expect(isSortedAscending).to.be.true; });
说明
- 两种方法都解决了区分大小写排序失败和空值崩溃的问题
- 可根据需求调整空值的排序位置(比如把空值排在最后,只需修改对应逻辑)
内容的提问来源于stack exchange,提问作者Dmitriy Petrov
相关产品推荐
相关产品推荐

