使用Groovy在SOAP UI响应中标识多个值

时间:2017-09-18 01:38:59

标签: groovy soapui

我最近在这里遇到了一个问题,我希望从SOAPUI响应中识别出多个值。这已成功回答here

我试图采用同样的方法解决我遇到的新问题。这次我想从每个部分中选取4个值作为我的预期结果。

以下是我的回复示例,我希望针对以下内容运行断言预期结果:

       <ns1:LimitAndUsageDetailsList>
          <ns2:LimitAndUsageDetails xmlns:ns2="http://www.">
             <ns2:LimitCode>022</ns2:LimitCode>
             <ns2:LimitCodeDesc>APPLIANCES</ns2:LimitCodeDesc>
             <ns2:LimitType>N</ns2:LimitType>
             <ns2:LimitBenefit>500.0</ns2:LimitBenefit>
             <ns2:LimitBenefitUsed>0.0</ns2:LimitBenefitUsed>
             <ns2:LimitBenefitAvailable>500.0</ns2:LimitBenefitAvailable>
             <ns2:LimitBenefitService>0</ns2:LimitBenefitService>
             <ns2:LimitBenefitUsedService>0</ns2:LimitBenefitUsedService>
             <ns2:LimitBenefitAvailableService>0</ns2:LimitBenefitAvailableService>
             <ns2:QualifyingPeriodIndicator/>
             <ns2:ClaimIndicator>B</ns2:ClaimIndicator>
             <ns2:LimitPeriod>1</ns2:LimitPeriod>
             <ns2:LimitPeriodType>C</ns2:LimitPeriodType>
             <ns2:LimitScale>INDIV</ns2:LimitScale>
          </ns2:LimitAndUsageDetails>
          <ns2:LimitAndUsageDetails xmlns:ns2="http://www.">
             <ns2:LimitCode>023</ns2:LimitCode>
             <ns2:LimitCodeDesc>NEBULISER</ns2:LimitCodeDesc>
             <ns2:LimitType>N</ns2:LimitType>
             <ns2:LimitBenefit>0.0</ns2:LimitBenefit>
             <ns2:LimitBenefitUsed>0.0</ns2:LimitBenefitUsed>
             <ns2:LimitBenefitAvailable>0.0</ns2:LimitBenefitAvailable>
             <ns2:LimitBenefitService>1</ns2:LimitBenefitService>
             <ns2:LimitBenefitUsedService>0</ns2:LimitBenefitUsedService>
             <ns2:LimitBenefitAvailableService>1</ns2:LimitBenefitAvailableService>
             <ns2:QualifyingPeriodIndicator/>
             <ns2:ClaimIndicator>B</ns2:ClaimIndicator>
             <ns2:LimitPeriod>3</ns2:LimitPeriod>
             <ns2:LimitPeriodType>R</ns2:LimitPeriodType>
             <ns2:LimitScale>INDIV</ns2:LimitScale>
          </ns2:LimitAndUsageDetails>

我对LimitCode, LimitType, LimitPeriod and LimitPeriodType元素感兴趣。

我尝试了以下断言脚本,但它不起作用。

def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def holder = groovyUtils.getXmlHolder( messageExchange.responseContent )
def pxml = new XmlSlurper().parseText(context.response)

def expected = [
"022":"N":"1":"C"
'023':'N':'3':'R',
'030':'N':'1':'C',
]
def xml = new XmlSlurper().parseText(context.response)


def actual = xml.'**'.findAll{it.name() == 'LimitAndUsageDetails'}.collectEntries{[(it.LimitCode.text()): it.LimitType.text(): it.LimitPeriod.text(): it.LimitPeriodType.text()]}
assert expected == actual

2 个答案:

答案 0 :(得分:2)

这是你需要做的。

  • 与之前的问题相比,预期数据需要更多项目。
  • 因此需要创建地图(以确定哪些数据属于哪个元素)
  • 由于有待验证的详细信息列表,预期数据应为地图列表。

请参阅下面的Script Assertion

assert context.response, 'Response is empty or null'

//list of maps; each map for single usage detail
//If the details are more, you may use a csv data file; solution may vary slightly
def expected = [ 
   [ LimitCode: '022', LimitType: 'N', LimitPeriod: 1, LimitPeriodType: 'C'],
   [ LimitCode: '023', LimitType: 'N', LimitPeriod: 3, LimitPeriodType: 'R']
]   
 
 
def xml = new XmlSlurper().parseText(context.respone)

//Build the actual list of map from response
def actual = xml.'**'.findAll{it.name() == 'LimitAndUsageDetails'}.collect{ [
                   LimitCode       : it.LimitCode.text(),
                   LimitType       : it.LimitType.text(),
                   LimitPeriod     : it.LimitPeriod.text() as Integer,
                   LimitPeriodType : it.LimitPeriodType.text()
                ]
               }.sort {it.LimitCode}
assert expected == actual

您可以快速尝试在线 demo

答案 1 :(得分:0)

您可以使用以下代码来获取

中的Response节点值
def groovyutils=new com.eviware.soapui.support.GroovyUtils(context)
def holder=groovyutils.getXmlHolder(messageExchange.responseContent)

holder.namespaces["ns"]="http://www.webserviceX.NET/"

def conversionRate=holder.getNodeValue("//ns:ConversionRateResult") 

由于我没有正确的命名空间,我无法对您的代码进行测试,但此代码可以很好地从货币转换器的响应中获取值

您只需要在getNodeValue和命名空间URL中更改xpath。这样简单