SOAP UI XML响应中键/值对上的Groovy脚本断言

SOAP UI XML响应中键/值对上的Groovy脚本断言,groovy,soapui,ready-api,Groovy,Soapui,Ready Api,我正在使用Ready API/SOAP UI。我添加了一个SOAP请求,得到了一个SOAP响应XML。我的响应对象最多有40个键/值对 我有功能测试专门测试每一个 循环遍历整个ArrayOfObjects并断言键是否存在,如果键存在则断言值 我能为这个场景找到一个有效的解决方案吗。我无法对输出对象执行断言 SOAP结构如下所示: <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="

我正在使用Ready API/SOAP UI。我添加了一个SOAP请求,得到了一个SOAP响应XML。我的响应对象最多有40个键/值对

我有功能测试专门测试每一个

  • 循环遍历整个ArrayOfObjects并断言键是否存在,如果键存在则断言值
我能为这个场景找到一个有效的解决方案吗。我无法对输出对象执行断言

SOAP结构如下所示:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>  
     <ArrayOfallObjects>
       <ArrayOfObjects>
          <Key>Key1</Key>
          <Value>Value1</Value>
       </ArrayOfObjects>
       <ArrayOfObjects>
          <Key>Key2</Key>
          <Value>Value2</Value>
       </ArrayOfObjects>
       ---------------
       <ArrayOfObjects>
          <Key>Key40</Key>
          <Value>Value40</Value>
       </ArrayOfObjects>
     </ArrayOfallObjects>   
   </soap:Body>
</soap:Envelope>

您可以对相同的soap请求测试步骤使用
Script断言
,以验证相同的断言,而无需添加额外的
Groovy脚本
测试步骤

不确定上述示例是否具有相同的xml结构(如果不精确)。否则,请根据您的需要进行更改

方法如下:

  • 因为有复杂的数据需要验证,并且有关键、价值模式;因此,将地图定义为您在上一节中指出的预期数据
  • 阅读xml响应,并从中创建类似的映射。有时,可能需要按键(或基于数据的其他条件)对检索到的数据进行排序
  • 然后检查预期数据和实际数据是否一致
脚本断言:

//Define expected data; using few elements as sample
def expectedMap = [Key1: 'Value1', Key2: 'Value2', Key40: 'Value40']

//Check if there is response
assert context.response, 'Response is empty or null'

//Parse the response
def xml = new XmlSlurper().parseText(context.response)

//Extract the data, create actual map and sort by key
def actualMap = xml.'**'.findAll {it.name() == 'ArrayOfObjects' }.collectEntries {[(it.Key.text()): it.Value.text()]}​?.sort {it.key}
log.info actualMap
assert expectedMap == actualMap

您可以在线快速试用

下面的代码首先获取一个数组(x)中的所有键和另一个数组中的所有值 y(x)。您可以将它们添加到映射中,如果没有,您可以直接断言值

下面是验证键值对的最简单方法之一

只需将“第一步”替换为生成响应的步骤的名称

def groovyUtils = new  com.eviware.soapui.support.GroovyUtils(context)

def response = groovyUtils.getXmlHolder("First Step#Response")

def x = response.getNodeValues("//*[local-name()='ArrayOfObjects']//*[local-name()='Key']")
for ( def keys in x)
{
log.info keys
}
 def y = response.getNodeValues("//*[local-name()='ArrayOfObjects']//*[local-name()='Value']")
for ( def values in y)
 {
log.info values
}

log.info "total keys are " + x.size()

for(int i = 0 ; i < x.size() ; i++)
{
 log.info " key = " + x[i] + " Value = " + y[i] 
}
def groovyUtils=new com.eviware.soapui.support.groovyUtils(上下文)
def response=groovyUtils.getXmlHolder(“第一步响应”)
def x=response.getNodeValue(“//*[local-name()='ArrayOfObjects']/*[local-name()='Key']”)
用于(x中的def键)
{
log.info密钥
}
def y=response.getNodeValue(“//*[local-name()='ArrayOfObjects']/*[local-name()='Value']”)
用于(单位为y的def值)
{
log.info值
}
log.info“总密钥数为”+x.size()
对于(int i=0;i
下面是我运行上述脚本时的结果

2017年10月28日星期六14:41:57 IST:INFO:Key1

2017年10月28日星期六14:41:57 IST:信息:键2

2017年10月28日星期六14:41:57 IST:INFO:Key40

2017年10月28日星期六14:41:57 IST:信息:价值1

2017年10月28日星期六14:41:57 IST:信息:价值2

2017年10月28日星期六14:41:57 IST:信息:Value40

2017年10月28日星期六14:41:57 IST:信息:共有3个密钥

2017年10月28日星期六14:41:57 IST:INFO:key=Key1 Value=Value1

2017年10月28日星期六14:41:57 IST:INFO:key=Key2 Value=Value2


2017年10月28日星期六14:41:57 IST:INFO:key=Key40 Value=Value40

Manjula,检查解决方案,看看是否有帮助。非常感谢Rao!同时,我将尝试这个方法,我需要一些关于我先前粘贴在代码段中的双括号的帮助。这个对象看起来像:object=[[Key1]:Value1[Key2]:Value2,依此类推到-,[Key40]:Value40]相反,我需要一些东西,比如你有def expectedMap=[Key1:'Value1',Key2:'Value2',Key40:'Value40']你有删除额外括号的建议吗?@ManjulaK,你至少试过演示来快速查看一下吗?这澄清了你的疑问。另外,我将在每个功能测试中只做一个键/值的断言,因为它基于我们使用的键(配置)文件。@ManjulaK,没有得到你的答案。如果您在一个响应中获取所有密钥,那么不应该测试所有密钥吗?实际上,它并不基于配置密钥设置,只返回一个密钥/值对。如果配置设置是带所有键,则响应对象将返回所有键/值对。这有用吗?谢谢高拉夫。让我试试,嗨,高拉夫,我试过你的方法。而不是Log.info“Key”。。我将Key/Value数组的内容添加到String中,这样我就可以直接使用ex-for(int I=0;I//Define expected data; using few elements as sample def expectedMap = [Key1: 'Value1', Key2: 'Value2', Key40: 'Value40'] //Check if there is response assert context.response, 'Response is empty or null' //Parse the response def xml = new XmlSlurper().parseText(context.response) //Extract the data, create actual map and sort by key def actualMap = xml.'**'.findAll {it.name() == 'ArrayOfObjects' }.collectEntries {[(it.Key.text()): it.Value.text()]}​?.sort {it.key} log.info actualMap assert expectedMap == actualMap
def groovyUtils = new  com.eviware.soapui.support.GroovyUtils(context)

def response = groovyUtils.getXmlHolder("First Step#Response")

def x = response.getNodeValues("//*[local-name()='ArrayOfObjects']//*[local-name()='Key']")
for ( def keys in x)
{
log.info keys
}
 def y = response.getNodeValues("//*[local-name()='ArrayOfObjects']//*[local-name()='Value']")
for ( def values in y)
 {
log.info values
}

log.info "total keys are " + x.size()

for(int i = 0 ; i < x.size() ; i++)
{
 log.info " key = " + x[i] + " Value = " + y[i] 
}