簡體   English   中英

如何在響應中聲明空標記?

[英]How can you assert a null tag in a response?

我正在使用數據源來驅動測試步驟,該步驟發送SOAP請求並獲取SOAP響應。

當我驗證響應時,有時我希望其中一個字段有一個值(字符串),有時我希望它不會被初始化為一個值(即。 <message/>而不是<message></message> )。 在比較Excel(我的數據源)中的VS和空字段時, <message/>是否與<message></message>不同,老實說我不知道​​。 我所知道的是,soapUI不喜歡將空的Excel字段與<message/>

我想建立一個足夠聰明的斷言,以便能夠斷言兩種情況。 如果我期望一個空結果,它將聲明該字段應為空。 如果我期望一個字符串,它將聲明字符串在那里。

當將空的預期結果(從Excel電子表格中讀入)與空字段(或者更確切地說,沒有任何值的字段)進行比較時,soapUI Pro中的默認功能似乎不起作用。


功能測試示例:

我正在測試創建帳戶的API。 所以,我在數據中提供它來創建帳戶:

<username>username</username>
<password>password</password>

從那以后,我期待以下回應:

<code>0</code>
<resultMessage>Created successfully!</resultMessage>

我的數據源(Excel電子表格)具有以下信息:(前兩個字段是輸入,后兩個是預期結果)

用戶名,密碼,0,創建成功!

因此,soapUI會比較相應的字段,並且工作正常。

破損測試示例:

現在,假設我想測試未創建帳戶時會發生什么:

<username>bad username</username>
<password>bad password</password>

從那以后,我收到以下回復:

<code>-1</code>
<resultMessage/>

我的數據源(Excel電子表格)具有以下信息:(前兩個字段是輸入,后兩個是預期結果,第四個字段是空的

用戶名不好,密碼錯誤,-1,

所以這一次,我有一個空值來與<resultMessage/>進行比較。 唯一的問題是它沒有正確地比較兩個空字段。

我收到以下錯誤:

[Match content of [resultMessage]] XPathContains assertion failed for path [declare namespace ns1='http://website.com/Account/'; //ns1:CreateAccountResponse[1]/resultMessage[1]/text()] : Exception:Missing content for xpath[declare namespace ns1='http://website.com/Account/'; //ns1:CreateAccountResponse[1]/resultMessage[1]/text)()] in Response

請注意,我是groovy的新手,對soapUI來說是新手,對節點的概念是新的(並且是遺忘的)。

我想我會寫一個腳本來解決我的問題。 腳本將檢查以確保預期結果不為空,然后將<resultMessage>與預期結果進行比較。

如果預期結果空,我沒有寫任何東西來處理該怎么做。

import com.eviware.soapui.support.XmlHolder

def holder = new XmlHolder( messageExchange.responseContentAsXml )
holder.namespaces["ns1"] = "http://website.com/Account/"
def node = holder.getDomNode( "//ns1:CreateAccountResponse[1]/resultMessage[1]" )
def expectedResultMessage = context.expand( '${CreateAccount DataSource#resultMessage}' )

if (expectedResultMessage != null)
 assert node == expectedResultMessage

作為節點和Groovy的新手,我不確定我是否正確地將node中的值與expectedResultMessage的值進行比較。 或者,如果有一種正確的方法來檢查和比較VS自己關閉的字段(即<resultmessage/> )。

運行此腳本時,我得到以下結果:

[Assert node [resultMessage]] assert node == resultMessage |  |    | |    | null   | ""  |  false <?xml version ="1.0" encoding="UTF-8"?> <resultMessage xmlns:ns1="http://website.com/Account/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"/>

我可能只是設置它,所以響應只返回<resultMessage></resultMessage>而不是<resultMessage/> ,但我認為有辦法處理后者而不是創建一個解決方法。

希望這不是太冗長,希望它有點清楚! 任何幫助,將不勝感激! :)

這個答案太晚了,但我覺得重要的是拋棄stackoverflow。 我使用這里寫的concat()hack。 試試這個:

的concat(// myxpath /文本(), “”)

因此,您的數據表將為空字段設置空值。 Concat將連接字符串。 因此,如果工作表中有數據,它將不會向現有字符串添加任何內容,如果值為null,soapUI將轉換它以匹配您的空白值。

我建議您使用XmlSlurper而不是XmlHolder來使用Xml。 以下是從響應消息中獲取resultMessage片段:

def doc = new XmlSlurper().parse(messageExchange.responseContentAsXml)
def value = doc.resultMessage

在這種情況下,空元素的value等於空字符串,適用於您的斷言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM