4

我正在使用数据源来驱动发送 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 的新手,我不确定我是否正确地将 in 的值与 innode的值进行比较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/>,但我认为有一种方法可以处理后者,而不是创建一个解决方法。

希望这不是太啰嗦,希望它有点清楚!任何帮助,将不胜感激!:)

4

2 回答 2

3

这个答案太晚了,但我觉得扔在stackoverflow上很重要。我使用这里写的 concat() hack 。尝试使用这个:

concat(//myxpath/text(),"")

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

于 2013-10-12T03:57:12.687 回答
1

让我建议您使用XmlSlurper而不是XmlHolder使用 Xml。resultMessage这是从您的响应消息中获取的片段:

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

在这种情况下,空元素的值value等于空字符串,适用于您的断言。

于 2012-07-23T16:15:32.497 回答