带通配符的SoapUI XPath断言

3
有没有办法在XPath测试中使用通配符来进行断言呢?我查看了SoapUI的文档,他们说你可以这样做:
<path1>
  <path2>*</path2>
</path1>

我勾选了“允许通配符”复选框。

我的问题是:我想要断言我的日期以2012-08-22开始,但对分钟和秒数不在意。我猜想我的表达式应该是类似于2012-08-22*,但它不起作用。

2个回答

4
你正在做的听起来应该可行。这里有一个快速的例子,我使用了来自http://www.geonames.org/export/web-services.html#timezone的rest服务。我正在使用他们提供的演示。 http://api.geonames.org/timezone?lat=47.01&lng=10.2&username=demo 输出为:
<geonames>
   <timezone tzversion="tzdata2012c">
      <countryCode>AT</countryCode>
      <countryName>Austria</countryName>
      <lat>47.01</lat>
      <lng>10.2</lng>
      <timezoneId>Europe/Vienna</timezoneId>
      <dstOffset>2.0</dstOffset>
      <gmtOffset>1.0</gmtOffset>
      <rawOffset>1.0</rawOffset>
      <time>2012-07-25 04:39</time>
      <sunrise>2012-07-25 05:50</sunrise>
      <sunset>2012-07-25 21:00</sunset>
   </timezone>
</geonames>

如果您在结果上进行xpath匹配并使用“从当前选择”按钮,则会得到
//geonames/timezone/time 2012-07-25 04:39
如果您将其更新为
//geonames/timezone/time 2012-07-25 *
这样做很好,当使用新的lat和lng更新其余请求时,断言仍将通过,因为它不检查时间。 如果这没有帮助,请提供完整的断言,也许我可以提供更多帮助。
*注意:对于soap请求,请确保声明命名空间,然后使用正确的格式。
//ns1:message

我有soapUI 3.6.1,但它无法工作。我收到以下断言失败的错误信息: XPathContains comparaison failed, expecting [2012-08-25*], actual was [2012-08-25T00:00:00-04:00] - Gab
奇怪,你似乎发现了3.6.1的问题。我在那个版本中尝试时也遇到了同样的问题。唯一让通配符在那个版本中工作的方法是拉取整个请求,而不是特定字段,//ns1:message,从当前选择,然后将字段更新为*。如果可以的话,我会升级。 - Steve Miskiewicz

1

这可能有点麻烦,但以下是您可以做的:

1)使用断言选项卡找出Xpath“基础”(听起来您已经在此处)。我使用了此公共网站进行测试:http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl

我使用CornerPoints方法,并将'hawaii'作为单个参数。

我创建了此“基础”Xpath:

declare namespace ns1='http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl';
declare namespace SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/';
declare namespace SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/';

/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:CornerPointsResponse/listLatLonOut

(it will write the declare statements for you if you click declare)
(which you can test out in the assertions window)

2) 创建一个属性步骤

3) 创建一个属性传输步骤

4) 创建一个Groovy脚本

5) 添加一个属性...我称之为misc

6) 添加一个传输步骤

* transfer from the CornerPoints - Request 1 --- Response

* paste the Xpath stuff in the box under the 'transfer from'

* Transfer to your property 

(You can test with the little play button)

7) 在您的Groovy脚本中添加类似以下内容:

def x = context.expand( '${Properties#misc}' )
def parts = x.tokenize(',')
for (def part in parts)
{
    log.info(part)
    if (part.startsWith("-153"))
        log.info("good")
}

在Groovy步骤中,您可以执行任何必要的操作以获取您的(部分)数据。我添加的示例代码从包含CDATA的长行中获取纬度/经度,然后检查一些数据的起始部分...这只是一个示例。
请记住,您可以使用Groovy和Java字符串方法:

http://groovy.codehaus.org/groovy-jdk/java/lang/String.html

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html

更多Groovy技巧: http://www.soapui.org/Scripting-Properties/tips-a-tricks.html

我其实是想避免使用Groovy的。 - Gab
不确定在这种情况下该怎么办,但是您可以通过在实际的SOAP请求中执行Groovy断言来大大减少我最初建议的内容。然后您就不需要额外的3个步骤,只需要在实际的断言中添加一些Groovy代码即可。 - chrismead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接