使用 Groovy 识别 SOAP UI 响应中的多个值

Identifying multiple values in SOAP UI response with Groovy

我最近在这里解决了一个问题,我想从 SOAPUI 响应中识别多个值。已成功回答

我尝试用同样的方法来解决我遇到的新问题。这次我想从每个部分中选取 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

这是您需要做的。

  • 与上一个问题相比,预期数据需要更多项。
  • 因此需要创建映射(以识别哪些数据到哪些元素)
  • 由于有待验证的细节列表,预期数据应该是地图列表。

请看下面的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

您可以使用下面的代码,这也是在

中获取响应节点值
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 和命名空间中的 xpath URL。这样更简单