API测试中如何断言校验array[3]数组元素的属性顺序
API测试中接口返回内容排列顺序校验方法
首先明确两类顺序校验的基础规则:
- 按照JSON官方规范,JSON对象(也就是键值对结构)的属性本身是无序的,绝大多数编程语言自带的JSON解析工具默认会把对象转成字典/HashMap结构,直接丢失原始属性排列顺序。
- JSON数组的元素顺序是规范明确要求有序的,数组排序校验是接口测试的常规校验点,你给出的示例属于这类场景。
注意:不要在无明确业务要求的场景下校验JSON对象的属性顺序,这类校验不仅不符合JSON规范,还会导致用例稳定性极差,上游服务只要换个JSON序列化工具配置就会导致用例误报。只有涉及签名计算依赖属性顺序、固定格式输出等强要求场景,才需要做这类校验。
数组元素排序场景的断言编写方案
你提供的示例是3个维度配置组成的数组,你标注的array[3]实际是长度为3的数组,索引从0开始计数,从示例里的dimOrder字段能看出来预期排序规则是按dimOrder升序排列,正确顺序应该是:
- dimOrder=1,dimId为
category#jewelry的Jewelry 1 - dimOrder=2,dimId为
category#womens-clothing的Women's Clothing - dimOrder=3,dimId为
category#handbags的Handbags
你贴出的当前返回顺序是[2,1,3],不符合排序预期。
常用的断言写法有两种,逻辑适配Postman、JMeter、Pytest、RestAssured等绝大多数测试工具/框架:
- 方案1:提取排序标识组成列表做全等断言
适合元素固定、预期顺序明确的场景,直接提取数组中每个元素的排序参照字段(可以是dimOrder、dimId或者其他你要校验的唯一标识)组成列表,和预期顺序列表做严格相等判断即可。
以Python脚本为例的代码参考:# 假设target_array是接口返回的目标维度数组 # 校验dimOrder顺序 actual_order = [item["dimOrder"] for item in target_array] expected_order = [1, 2, 3] assert actual_order == expected_order, f"排序不符合预期,实际dimOrder序列:{actual_order}" # 如果要校验特定元素的位置,也可以提取dimId做校验 actual_id_seq = [item["dimId"] for item in target_array] expected_id_seq = [ "category#jewelry", "category#womens-clothing", "category#handbags" ] assert actual_id_seq == expected_id_seq, f"元素位置不符合预期,实际dimId序列:{actual_id_seq}" - 方案2:相邻元素对比校验
适合排序规则固定、数组元素可能动态增减的场景,不需要提前写死全量预期列表,遍历数组逐个校验相邻元素满足排序规则即可:# 校验dimOrder升序 arr_length = len(target_array) for idx in range(arr_length - 1): current_val = target_array[idx]["dimOrder"] next_val = target_array[idx+1]["dimOrder"] assert current_val < next_val, f"排序错误:位置{idx}的dimOrder({current_val})大于位置{idx+1}的dimOrder({next_val})"
补充:JSON对象属性顺序的校验方法
如果确实有业务要求必须校验对象内部的属性排列顺序,注意不要用常规JSON解析方法把返回内容转成普通对象,否则顺序会丢失,可选两种实现方式:
- 直接对接口返回的原始响应字符串做校验,通过正则匹配各属性的出现位置,判断先后顺序符合预期
- 使用支持保留键值对顺序的JSON解析器加载返回内容,提取对象的键名组成列表,和预期的键顺序列表做全等断言即可,比如Python中使用
collections.OrderedDict接收解析结果,Java中Fastjson、Jackson都支持配置保留属性顺序后再做校验。
内容的提问来源于stack exchange,提问作者NAN
相关产品推荐
相关产品推荐

