如何在响应中声明空标记?

时间:2012-07-09 20:17:57

标签: soap groovy assert soapui

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

当我验证响应时,有时我希望其中一个字段有一个值(字符串),有时我希望它不会被初始化为一个值(即。<message/>而不是{{ 1}})。在比较Excel(我的数据源)中的VS和空字段时,<message></message>是否与<message/>不同,我真的不知道。我所知道的是,soapUI并不喜欢将空Excel字段与<message></message>进行比较。

我想设置一个足够智能的断言,以便能够断言两种情况。如果我期望一个空结果,它将声明该字段应为空。如果我期望一个字符串,它将声明字符串在那里。

soapUI Pro中的默认功能在将空的预期结果(从Excel电子表格中读入)与空字段(或者更确切地说,没有任何值的字段)进行比较时似乎不起作用。


功能测试示例:

我正在测试创建帐户的API。因此,我将其提供给数据以创建帐户:

<message/>

由此,我期待以下回应:

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

我的数据源(Excel电子表格)具有以下信息:(前两个字段是输入,后两个是预期结果)

  

用户名,密码,0,已成功创建!

因此,soapUI会比较相应的字段,并且工作正常。

破损测试示例:

现在,假设我想测试帐户未创建时会发生什么:

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

由此,我收到以下回复:

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

我的数据源(Excel电子表格)包含以下信息:(前两个字段是输入,后两个是预期结果,第四个字段是

  

用户名不好,密码错误,-1,

所以这一次,我有一个空值来与<code>-1</code> <resultMessage/> 进行比较。唯一的问题是它没有正确地比较两个空字段。

我收到以下错误:

<resultMessage/>

请注意我是groovy的新手,对soapUI来说是新手,对节点的概念是新的(并且是遗忘的)。

我想我会写一个脚本来解决我的问题。该脚本将检查以确保预期结果不为空,然后将[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 与预期结果进行比较。

如果预期结果 为空,我还没有写任何东西来处理该怎么做。

<resultMessage>

对节点和Groovy不熟悉,我不确定我是否正确地将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 中的值与node中的值进行比较。或者,如果有一种正确的方法来检查和比较VS自己关闭的字段(即expectedResultMessage)。

运行此脚本时,我得到以下结果:

<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>,但我认为有办法处理后者而不是创建解决方法。

希望这不是太长篇大论,希望有点清楚!任何帮助,将不胜感激! :)

2 个答案:

答案 0 :(得分:3)

这个答案太晚了,但我觉得重要的是抛弃stackoverflow。我使用concat()hack编写here。试试这个:

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

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

答案 1 :(得分:1)

我建议您使用XmlSlurper代替XmlHolder来使用Xml。以下是从您的回复邮件中获取resultMessage的摘要:

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

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