Ross
Ross

Reputation: 2417

SoapUI: have multiple expected results in one assertion

Is there a way to have multiple expected results in one assertion for one test step.

Declare:

declare namespace b="base"; //b:policies/b:policy/b:total-premium

Expected Result:

7.362*

XML Assertion code:

<con:assertion type="XPath Match" id="" name="XPath Match">                                             
<con:configuration>                                             
<path>                                              
declare namespace b="base"; //b:policies/b:policy/b:total-premium                                               
</path>                                             
<content>7.362*</content>                                               
<allowWildcards>true</allowWildcards>                                               
<ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>                                                
<ignoreComments>false</ignoreComments>                                              
</con:configuration>                                                
</con:assertion>                                                
<con:credentials>                                               
<con:authType>No Authorization</con:authType>                                               
</con:credentials>                                              
<con:jmsConfig JMSDeliveryMode="PERSISTENT"/>                                               
<con:jmsPropertyConfig/>                                                
<con:wsaConfig mustUnderstand="NONE" version="200508" action="" addDefaultTo="true"/>   

What I would like SoapUI to do is compare the value from total-premium to the values of 7.362*, 6.994*, and 7.730* for this specific test step and if any of them passes the test step passes.

Is that possible?

Upvotes: 1

Views: 3324

Answers (2)

KarelHusa
KarelHusa

Reputation: 2258

If you prefer XPath over Groovy scripting, you can still use a simple XPath expression:

declare namespace b="base";

starts-with(//b:policies/b:policy/b:total-premium, '7.362') or 
starts-with(//b:policies/b:policy/b:total-premium, '6.994') or 
starts-with(//b:policies/b:policy/b:total-premium, '7.730')

The expected result is then true.

With XPath you can use functions and operators as in other programming languages.

Upvotes: 3

albciff
albciff

Reputation: 18517

A possible way to do so is to use Script assertion instead of Xpath match assertion.

In the Script assertion you can parse the response, get the node values and compare against the list of the possible values, something like:

// get the xml response
def response = messageExchange.getResponseContent() 
// parse it
def xml = new XmlSlurper().parseText(response)
// find your node by name
def node = xml.'**'.find { it.name() == 'total-premium' }
// assert against the possible values
assert ['7.362*','6.994*','7.730*'].contains(node.toString())

Update

I misunderstood your question at first I think that you want to check exactly 7.362*, and really the wildcard is for any digits, excuse me. Then you can use a regex with matches() method to check if you value starts with some of the desired values:

// get the xml response
def response = messageExchange.getResponseContent() 
// parse it
def xml = new XmlSlurper().parseText(response)
// find your node by name
def node = xml.'**'.find { it.name() == 'total-premium' }
// assert 
assert node.toString().matches("(7.362|6.994|7.730)\\d*")

Upvotes: 3

Related Questions