JSON响应排序方案:解决API预期与实际响应顺序不一致比对失败问题
API测试JSON响应数组顺序不匹配问题的解决方案
核心处理逻辑:比对前分别对预期、实际响应的Drivers数组按照指定字段DriverNumber做升序排序,消除顺序差异后再做全量字段比对,排序后天然可以识别出实际响应多出来的DriverNumber=4的差异数据,符合测试用例校验要求。
具体实现方案
方案1:Python测试脚本实现(最常用的轻量测试场景)
适配从Excel读取预期JSON、调用接口获取实际响应的场景,示例代码:import json # 1. 加载数据:your_expected_json_from_excel为从Excel读取的预期JSON字符串,your_actual_json_from_api为接口返回的响应字符串 expected_json = json.loads(your_expected_json_from_excel) actual_json = json.loads(your_actual_json_from_api) # 2. 对Drivers数组按DriverNumber升序排序 expected_json["Drivers"].sort(key=lambda x: x["DriverNumber"]) actual_json["Drivers"].sort(key=lambda x: x["DriverNumber"]) # 3. 直接比对两个JSON对象,需要输出差异可以引入deepdiff库实现 if expected_json == actual_json: print("测试用例通过") else: print("测试用例失败,存在字段差异")方案2:Postman测试脚本实现
如果你用Postman做接口自动化测试,直接在Tests标签页添加如下脚本即可:// 读取接口实际返回响应、提前存入环境变量的预期JSON const actualRes = pm.response.json(); const expectedRes = pm.environment.get("expected_driver_json"); // 封装排序逻辑 const sortByDriverNumber = (arr) => arr.sort((a,b) => a.DriverNumber - b.DriverNumber); // 分别对两个响应的Drivers数组排序 sortByDriverNumber(actualRes.Drivers); sortByDriverNumber(expectedRes.Drivers); // 执行比对校验 pm.test("响应内容校验通过", () => { pm.expect(actualRes).to.eql(expectedRes); });方案3:Java实现(JVM体系测试框架场景)
用Jackson解析JSON后排序即可,示例代码:import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.Comparator; // 解析JSON字符串 ObjectMapper mapper = new ObjectMapper(); JsonNode expected = mapper.readTree(expectedJsonStr); JsonNode actual = mapper.readTree(actualJsonStr); // 提取Drivers节点后排序 ArrayList<JsonNode> expectedDrivers = new ArrayList<>(); expected.get("Drivers").forEach(expectedDrivers::add); expectedDrivers.sort(Comparator.comparingInt(o -> o.get("DriverNumber").asInt())); ArrayList<JsonNode> actualDrivers = new ArrayList<>(); actual.get("Drivers").forEach(actualDrivers::add); actualDrivers.sort(Comparator.comparingInt(o -> o.get("DriverNumber").asInt())); // 替换原JSON的Drivers节点后做全量比对即可
优化建议
- 如果存在多个需要忽略顺序的数组字段,可以统一封装排序逻辑,无需重复编写
- 若存在无需校验的动态字段(比如动态时间戳、随机ID),可以提前过滤字段后再做比对
- 从Excel读取的预期JSON如果存在转义字符,需要先做转义还原再解析为JSON对象,避免解析报错
内容的提问来源于stack exchange,提问作者Shehnaz
相关产品推荐
相关产品推荐

