我正在使用数据源来驱动测试步骤,该步骤发送SOAP请求并返回SOAP响应。
当我验证响应时,有时我希望其中一个字段具有一个值(string),而另一些时候,我希望它不会初始化为一个值(即。<message/>而不是<message></message>)。在Excel (我的数据源)中比较VS和空字段时,<message/>是否与<message></message>有什么不同,我真的不知道。我只知道soapUI不喜欢将空的Excel字段与<message/>进行比较。
我想要建立一个断言,它足够聪明,能够断言这两种情况。如果我期望一个空的结果,它将断言字段应该是空的。如果我期望一个字符串,它将断言字符串在那里。
soapUI Pro中的默认功能在将空预期结果(从Excel电子表格中读取)与空字段(更确切地说,是一个没有任何价值的字段)进行比较时,似乎不起作用。
功能测试示例:
我正在测试一个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中的值进行了比较。或者是否有适当的方法来检查和比较一个关闭的字段(即。<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/>,但是我认为有一种方法可以处理后者,而不是创建一个工作。
希望这不是太长的喘息,并希望它是有点清楚!如有任何帮助,将不胜感激!)
发布于 2013-10-12 03:57:12
这个答案已经很晚了,但我觉得把它扔出去是很重要的。我使用写好的这里的concat()黑客。试着使用以下方法:
concat(//myxpath/text(),"")
因此,数据表的空值为空字段。串接将使字符串连接。因此,如果工作表中有数据,它将不向现有字符串添加任何内容,如果值为null,soapUI将将其转换为与空白值匹配。
发布于 2012-07-23 16:15:32
让我推荐您使用XmlSlurper而不是XmlHolder来处理Xml。下面是从响应消息中获取resultMessage的片段:
def doc = new XmlSlurper().parse(messageExchange.responseContentAsXml)
def value = doc.resultMessage空元素的value值等于用于断言的空字符串。
https://stackoverflow.com/questions/11402453
复制相似问题