校验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
相关产品推荐
相关产品推荐

