在soapui/groovy中进行断言时出现Xpath错误(在groovy方法中传递response xml asser



我在脚本断言

def holder = new XmlHolder( messageExchange.responseContentAsXml )

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <ns0:SOME_SEARCHResponse xmlns:ns0="urn:AA:BBB:CCC:some_WS">
         <ns0:some_ID>22222</ns0:Some_ID>
         <ns0:some_ID>33333</ns0:Some_ID>
         <ns0:Status>OK</ns0:Response>
...
...

下面是断言方法,它在脚本库

def assertions(xmlHolder, String... StringToAssert){
                StringToAssert.each{
               return xmlHolder.containsKey(StringToAssert)
               }
            }

我正在从脚本断言

调用断言方法如下
assert true==context.Change.assertions(holder,"//ns0:Some_ID")

但是收到下面的错误,我不知道错误是从哪里来的。

net.sf.saxon.trans.XPathException: XPath syntax error at char 1 on line 2 in {n[Ljava.lang.String}: Unexpected token "[" in path expression

编辑@albciff注释后的最终版本如下

def assertions(xmlHolder,String... stringToAssert){
                  def results = stringToAssert.collect{ element ->
                  return xmlHolder.containsKey(element)
                }
                return results.every{it==true}
               //return results.contains(true)
            }

问题在于断言函数定义,因为不是单独传递数组StringToAssert的每个元素,而是传递整个数组。这就是为什么你得到Unexpected token "[" in path expression,因为在你的例子中,xmlHolder.containsKey接收["//ns0:Some_ID"]而不是//ns0:Some_ID,所以持有者试图从数组中评估[

所以你必须纠正你的功能:

   StringToAssert.each{
       return xmlHolder.containsKey(StringToAssert)
   }

转到如下:

   StringToAssert.each{ element ->
       // now you pass the element of the array instead the whole array
       return xmlHolder.containsKey(element)
   }

或者使用collect在一个列表中获得所有containsKey的结果:

    def results = StringToAssert.collect{ elem ->
        return xmlHolder.containsKey(elem)
    }
除此之外,你的代码中还有另一个问题。你的XPath是不正确的,在你的xml <some_ID>开始小写,但你的XPath不是"//ns0:Some_ID",也因为在你的XPath ns0前缀没有定义,最好使用*通配符来匹配节点,所以最后你的XPath必须是"//*:some_ID"

最后是在你的断言,你比较assertions函数的结果与true:

assert true==context.Change.assertions(holder,"//ns0:Some_ID")

因为你的assertions函数不返回任何东西,默认情况下,groovy返回你使用的最后一个对象,在本例中是参数stringToAssert,所以你实际上是在做这样的事情:

assert true==["//ns0:Some_ID"] 

这就是assert失败的原因。因此,更改assertions函数的返回值。

如果所有的东西都被纠正,代码可能看起来像:

import com.eviware.soapui.support.XmlHolder
def xml = '''<ns0:SOME_SEARCHResponse xmlns:ns0="urn:AA:BBB:CCC:some_WS">
         <ns0:some_ID>22222</ns0:some_ID>
         <ns0:some_ID>33333</ns0:some_ID>
         <ns0:Status>OK</ns0:Status>
     </ns0:SOME_SEARCHResponse>'''
def holder = new XmlHolder( xml )
def assertions(xmlHolder, String... stringToAssert){
    // check if xmlHolder contains at least one
    // element defined in the xpaths arrays
    def results = stringToAssert.collect{ elem ->
        return xmlHolder.containsKey(elem)
    }
     // if at least one xpath is satisfied returns true
    return results.contains(true)
}
assert true==holder.containsKey('//*:some_ID')

希望有帮助,

最新更新