我正在使用数据源来驱动测试步骤,该步骤发送SOAP请求并获得SOAP响应。

当我验证响应时,有时我期望其中一个字段具有值(字符串),而其他时候我期望它不被初始化为值(即<message/>而不是<message></message>)。老实说,在比较VS和Excel(我的数据源)中的空白字段时,<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很重要。我使用写为here的concat()hack。尝试使用此:

concat(// myxpath / text(),“”)

因此,您的数据表中的空字段将具有空白值。 Concat将连接字符串。因此,如果工作表中有数据,它将不会对现有字符串添加任何内容。如果值为null,soapUI会将其转换为匹配您的空白值。

10-06 06:19