SoapUI 5.7.0中使用XQuery实现颜色存在性断言(无group by)
SoapUI 5.7.0中XQuery实现颜色存在性断言的解决方案
首先明确:SoapUI 5.7.0内置的XQuery引擎只支持XQuery 1.0,你尝试的group by是XQuery 3.0才加入的语法,所以会报错。下面提供几种可行的实现方式:
方法一:直接返回布尔验证结果(最简洁)
使用XQuery的every...satisfies结合distinct-values函数,直接返回是否三种颜色都存在的布尔值:
every $color in ("green", "yellow", "red") satisfies $color = distinct-values(//car/color)
配置断言步骤:
- 在SoapUI中创建XQuery断言,将上述代码粘贴进去
- 设置期望结果为
true(),当响应包含所有三种颜色时,断言通过;否则失败
方法二:返回去重后的颜色集合,再验证完整性
先通过distinct-values获取所有唯一颜色,再生成去重后的节点集合:
<Result> { for $color in distinct-values(//car/color) order by $color return <color>{$color}</color> } </Result>
执行后会得到无重复的颜色节点:
<Result> <color>green</color> <color>red</color> <color>yellow</color> </Result>
配置断言步骤:
- 用上述XQuery生成结果后,可搭配SoapUI的XPath Match断言,分别验证
//color[text()='green']、//color[text()='yellow']、//color[text()='red']都存在;或者直接验证count(//color)等于3且三个目标颜色都在结果中
替代写法(XQuery 1.0手动去重)
如果不想用distinct-values,也可以用XQuery 1.0的语法手动去重(逻辑清晰但效率略低):
<Result> { for $car in //car where not(exists(//car[position() < $car/position()]/color[text()=$car/color/text()])) order by $car/color return <color>{data($car/color)}</color> } </Result>
这个写法会遍历所有car节点,只保留每个颜色的第一个出现实例,最终同样得到去重后的颜色集合。
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

