SoapUI GroovyScript断言在(+或 - )0.05的期望值

时间:2017-11-16 08:53:58

标签: xml groovy soapui assertions numeric-ranges

我目前有以下断言脚本来检查三个字段的值。

import org.junit.Assert

def response = messageExchange.getResponseContent() 
def xml = new XmlSlurper().parseText(response)              
def nodelist = xml.'**'.findAll{ it.name() == 'premium' } 
def assertions = [6.19, 6.47, 6.90]
def i=0

for (node in nodelist) assert node.toString().matches(assertions[i++].toString())

我试图得到它以便断言将传递实际值在期望值的任何一侧0.05之内。

当有一个值时,以下脚本有效,但我正在努力用上面的断言来实现它。

import org.junit.Assert 
// 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() == 'premium' }     
// assert       
if(node.toDouble() != 0.0)  
    Assert.assertEquals(0.00, node.toDouble(), 0.05)    

修改

示例回复:

<b:quote-data>
    <b:quote-data>
      <b:premium>6.13</b:premium>
    </b:quote-data>
    <b:quote-data>
      <b:premium>6.45</b:premium>
    </b:quote-data>
    <b:quote-data>
      <b:premium>6.91</b:premium>
    </b:quote-data>
 </b:quote-data>

1 个答案:

答案 0 :(得分:3)

在您的情况下,以下是一些失败的事情。

  • 如下所示定义列表时,会将每个值类型视为BigDecimal类型。
  • 在比较之前,应将提取的值强制转换为相同的类型。

以下是实现上述目标的示例:

def expectedPremiums = [6.19, 6.47, 6.90]
def xmlString = """<root xmlns:b="test">
 <b:quote-data>
       <b:premium>6.13</b:premium>
     </b:quote-data>
     <b:quote-data>
       <b:premium>6.45</b:premium>
     </b:quote-data>
     <b:quote-data>
       <b:premium>6.91</b:premium>
    </b:quote-data>
</root>"""
def xml = new XmlSlurper().parseText(xmlString)
def premiums = xml.'**'.findAll {it.name() == 'premium'}*.toBigDecimal()
println premiums

请注意,使用示例修复的xml,您可以使用to进行动态响应,就像您已经在做的那样。

如果您还需要具有容差的验证逻辑,请在下面使用以上脚本。

def tolerance = 0.05
def failurePremiums = [:]
expectedPremiums.eachWithIndex { expected, index ->
   if ((expected-tolerance) <= premiums[index] && premiums[index] <= (expected+tolerance)) {
     println "${premiums[index]} is in range"
   } else {
      println "${premiums[index]} is not falling in range, failed"
      failurePremiums[expected] = premiums[index]
   }
}
assert !failurePremiums, "Not matched data(expected vs actual) :  ${failurePremiums}"

您可以在线快速尝试 demo

编辑:另一个建议

当您使用脚本断言时,您可以在下面进行更改:

自:

def response = messageExchange.getResponseContent() 
def xml = new XmlSlurper().parseText(response)

要:

def xml = new XmlSlurper().parseText(context.response)