SoapUI GroovyScript утверждение в пределах (+ или -) 0,05 от ожидаемых значений
В настоящее время у меня есть следующий скрипт утверждения, чтобы проверить значение трех полей.
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 ответ
Вот пара вещей для неудачи в вашем случае.
- Когда вы определяете список, как показано ниже, он рассматривает каждый тип значения как
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}"
Вы можете быстро попробовать это онлайн демо
РЕДАКТИРОВАТЬ: еще одно предложение
Когда вы используете утверждение сценария, вы можете изменить его ниже:
От:
def response = messageExchange.getResponseContent()
def xml = new XmlSlurper().parseText(response)
Для того, чтобы:
def xml = new XmlSlurper().parseText(context.response)