2015-10-23 50 views
0

我已經在這個腳本斷言Xpath的錯誤而在soapUI的/常規斷言(通過響應XML斷言在常規方法的元素)

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) 
       } 
      } 

我打電話斷言方法像下面從腳本assertion

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) 

      } 
+0

變量名和參數名是最好的開始與小寫字母 –

+0

@tim_yates感謝。我會改變的。任何關於錯誤的想法。 – user1207289

+0

這可能會修復它 –

回答

0

的問題是在你的斷言運行,因爲強似陣列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功能不無返回,在默認情況下常規的回報您使用的最後一個對象,在這種情況下,參數stringToAssert因此您是做這樣的事情:

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

這就是爲什麼你的斷言失敗。所以改變從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') 

希望它能幫助,

+0

謝謝。現在這個錯誤消失了。我會將其標記爲答案,儘管我沒有看到預期的結果。我得到'assert true == context.Change.assertions(holder,「// ns0:some_Date」)| | | | | | | | | [email protected](toString()拋出java.lang.NullPointerException) | | [// ns0:some_Date]'現在。任何想法? – user1207289

+0

@ user1207289還有其他錯誤,我會更新我的答案。 – albciff

+0

謝謝。這工作得很好。 'some_id'是一個錯字。我會編輯。除此之外,我更新了一點,只有一切都匹配時纔會返回true。我將在上面的編輯中包含最終版本。 – user1207289