You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

校验SOAP响应XML row节点date升序的Groovy脚本实现方法

Groovy校验SOAP响应date字段升序实现方案

实现思路

  • 利用Groovy内置的XmlSlurper组件解析XML报文,无需额外引入第三方依赖,适配绝大多数接口测试场景(比如SoapUI等工具内置的Groovy环境可直接运行)。
  • 遍历XML中所有row节点,提取每个节点下的date字段值存入列表。由于示例中date为yyyyMMdd格式的字符串,其字典排序规则和日期自然升序规则完全一致,无需额外做日期类型转换,降低代码复杂度。
  • 将提取到的原始date列表,与按升序排序后的新列表做全等对比:二者完全一致则说明符合升序要求(允许相邻日期相等的非严格升序场景,匹配示例中两个20220502的合法场景)。
  • 断言失败时输出清晰的错误日志,标注原始序列、预期序列和第一个出错的位置,方便快速定位问题。

可直接运行的脚本代码

// 替换为实际的SOAP响应XML文本,在SoapUI等工具中可直接取上下文的response变量值
def xmlContent = '''<tree>
 <row>
  <id>123</id>
  <date>20220501</date>
 </row>
 <row>
  <id>242</id>
  <date>20220502</date>
 </row>
 <row>
  <id>125</id>
  <date>20220502</date>
 </row>
</tree>'''

// 解析XML提取所有row下的date值
def xmlRoot = new XmlSlurper().parseText(xmlContent)
def originalDateList = xmlRoot.row.collect { it.date.text() }

// 前置校验:避免XML结构错误导致提取不到date值
assert !originalDateList.isEmpty() : "解析失败:未在row节点下找到任何date字段,请检查响应XML结构是否符合预期"

// 生成升序排序的对比列表,sort(false)表示不修改原列表,返回新的排序后列表
def ascSortedDateList = originalDateList.sort(false)

// 执行升序断言
assert originalDateList == ascSortedDateList : """
断言失败:date字段不符合升序排列规则
原始date序列:${originalDateList}
预期升序序列:${ascSortedDateList}
首个异常位置索引(从0开始计数):${(0..<originalDateList.size()).find { originalDateList[it] != ascSortedDateList[it] }}
"""

// 校验通过提示
println "校验通过:所有row节点下date字段符合升序要求,提取到的date序列为:${originalDateList}"

注意事项

  • 你提供的XML示例中<id>标签存在闭合错误(写成了<id>123<id>,正确闭合应为<id>123</id>),实际标准SOAP响应不会有这类问题,如果遇到非标准XML需要先修正格式再解析,否则XmlSlurper会抛出解析异常。
  • 如果你的date字段不是yyyyMMdd格式,只要是ISO标准格式(比如yyyy-MM-dd、yyyy-MM-dd HH:mm:ss),字符串字典序依然和日期升序规则一致,可直接复用该逻辑;如果是MM/dd/yyyy这类非字典序匹配的日期格式,需要在提取字段时先将字符串转为Date对象再存入列表,否则排序结果会出错。
  • 如果需要严格升序(即后一个日期必须严格大于前一个,不允许相等),只需要在现有断言基础上增加一行校验:assert originalDateList.unique().size() == originalDateList.size() : "校验失败:存在重复日期值,不符合严格升序要求"。

内容的提问来源于stack exchange,提问作者Amirtaraj R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:45:58