SoapUI GroovyScript 断言在预期值的(+ 或 - )0.05 范围内
SoapUI GroovyScript assertion within (+ or - ) 0.05 of expected values
我目前有以下断言脚本来检查三个字段的值。
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>
在你的案例中,有几件事是失败的。
- 当您如下定义列表时,它会将每个值类型视为
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,您可以像您已经在做的那样用于动态响应。
如果您还需要容差验证逻辑,请将下面的脚本与上面的脚本一起使用。
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)
我目前有以下断言脚本来检查三个字段的值。
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>
在你的案例中,有几件事是失败的。
- 当您如下定义列表时,它会将每个值类型视为
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,您可以像您已经在做的那样用于动态响应。
如果您还需要容差验证逻辑,请将下面的脚本与上面的脚本一起使用。
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)