Groovy to validate the list of node values with th

2019-04-14 17:50发布

问题:

Properties ScreenshotResponse Snippet

    <tns:TAResponse
    xmlns:tns="http://webconnectivity.co.uk/">
    <tns:SessionToken>84hjfutryh47849dkdhg9493493=</tns:SessionToken>
    <tns:PartyId>1234</tns:PartyId>
    <tns:ResponseType></tns:ResponseType>
    <tns:MessageUUId>12341F17-ABC9-3E99-1D12-B8289POO2107</tns:MessageUUId>
    <tns:Matches>
        <tns:IntegrationServiceMatch>
            <tns:InternalReference>2066856</tns:InternalReference>
            <tns:ErrorsAndWarnings>
                <tns:IntegrationServiceErrorCode>
                    <tns:ErrorCode>W000026</tns:ErrorCode>
                    <tns:Description>Settlement Date not within tolerance</tns:Description>
                </tns:IntegrationServiceErrorCode>
                <tns:IntegrationServiceErrorCode>
                    <tns:ErrorCode>E000033</tns:ErrorCode>
                    <tns:Description>Number on message does not match</tns:Description>
                </tns:IntegrationServiceErrorCode>
                <tns:IntegrationServiceErrorCode>
                    <tns:ErrorCode>E000001</tns:ErrorCode>
                    <tns:Description>NO likely matches</tns:Description>
                </tns:IntegrationServiceErrorCode>
            </tns:ErrorsAndWarnings>
        </tns:IntegrationServiceMatch>
    </tns:Matches>
</tns:TAResponse>

I have stored all these Errorcode and Description in a property step. I need to validate whether these Errorcode and Description in the response matches with the property step. (sequence is not a deal) Can someone pls guide me through groovy? Previously i had to validate only one errorcode and desc from the response. so i validated using below script.

def content = new XmlSlurper().parse(file)
def respType = content.Body.TAResponse.ResponseType.text()
def errAndWarn = content.Body.TAResponse.Matches.IntegrationServiceMatch
assert errAndWarn.size() == 1
for (def i=0;i<errAndWarn.size();i++)
{
    assert errAndWarn[i].ErrorsAndWarnings.IntegrationServiceErrorCode.ErrorCode == "E000033"
    assert errAndWarn[i].ErrorsAndWarnings.IntegrationServiceErrorCode.Description == "Number on message does not match"
}

回答1:

You can use below Script Assertion for the SOAP Request test step itself, that will avoid additional Groovy Script test step.

This assumes that the name of the Properties test step name is Properties. If its name differs, then change in the script accordingly.
Script Assertion

//Change the name of the Properties test step below
def step = context.testCase.testSteps['Properties']

//check if the response is not empy
assert context.response, 'Response is empty or null'

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

//Get the all the error details from the response as map
def errorDetails = parsedXml.'**'.findAll { it.name() == 'IntegrationServiceErrorCode'}.inject([:]){map, entry ->    map[entry.ErrorCode.text()] = entry.Description.text(); map    }
log.info "Error details from response  : ${errorDetails}"

//loop thru xml error codes and verify against the properties of Properties Test Step
errorDetails.each { key, value ->
    assert step.properties[key]?.value == value, "Unable to match value of the property ${key} "
}

EDIT: based on OP's comment

Groovy Script test step:

//Change the name of the Properties test step below
def step = context.testCase.testSteps['Properties']

//Parse the xml like you have in your script
def parsedXml = new XmlSlurper().parse(file)

//Get the all the error details from the response as map
def errorDetails = parsedXml.'**'.findAll { it.name() == 'IntegrationServiceErrorCode'}.inject([:]){map, entry ->    map[entry.ErrorCode.text()] = entry.Description.text(); map    }
log.info "Error details from response  : ${errorDetails}"

//loop thru xml error codes and verify against the properties of Properties Test Step
errorDetails.each { key, value ->
    assert step.properties[key]?.value == value, "Unable to match value of the property ${key} "
}

EDIT2: Based on additional requirement, adding below Groovy Script

//Change the name of the Properties test step below
def step = context.testCase.testSteps['Properties']

//Parse the xml like you have in your script
def parsedXml = new XmlSlurper().parse(file)

//Get the all the error details from the response as map
def errorDetails = parsedXml.'**'.findAll { it.name() == 'IntegrationServiceErrorCode'}.inject([:]){map, entry ->    map[entry.ErrorCode.text()] = entry.Description.text(); map    }
log.info "Error details from response  : ${errorDetails}"

def failureMessage = new StringBuffer()

//Loop thru properties of Property step and check against the response
step.properties.keySet().each { key ->
   if (errorDetails.containsKey(key)) {
       step.properties[key]?.value == errorDetails[key] ?:  failureMessage.append("Response error code discription mismatch. expected [${step.properties[key]?.value}] vs actual [${errorDetails[key]}]")
   } else {
       failureMessage.append("Response does not have error code ${key}")
   }
}
if (failureMessage.toString()) {
  throw new Error(failureMessage.toString())
} 


回答2:

You should be able to do:

content.Body
       .TAResponse
       .Matches
       .IntegrationServiceMatch
       .ErrorsAndWarnings
       .IntegrationServiceErrorCode.each { node ->
    println "Error code is ${node.ErrorCode.text()} and Description is ${node.Description.text()}"
}


标签: groovy soapui