#xml #xpath #soapui #assertions
#xml #xpath #soapui #утверждения
Вопрос:
Есть ли способ получить несколько ожидаемых результатов в одном утверждении для одного шага тестирования.
Объявить:
declare namespace b="base"; //b:policies/b:policy/b:total-premium
Ожидаемый результат:
7.362*
Код утверждения XML:
<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"/>
То, что я хотел бы, чтобы SoapUI сделал, это сравнил значение из total-premium
со значениями 7.362*
, 6.994*
, и 7.730*
для этого конкретного шага тестирования, и если какой-либо из них проходит тестовый этап, проходит.
Возможно ли это?
Ответ №1:
Возможный способ сделать это — использовать Script assertion
вместо Xpath match assertion
.
В Script assertion
вы можете проанализировать ответ, получить значения узла и сравнить со списком возможных значений, что-то вроде:
// 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())
Обновить
Сначала я неправильно понял ваш вопрос, я думаю, что вы хотите точно проверить 7.362*
, и на самом деле подстановочный знак предназначен для любых цифр, извините. Затем вы можете использовать регулярное выражение с matches()
помощью метода, чтобы проверить, начинается ли ваше значение с некоторых желаемых значений:
// 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*")
Комментарии:
1. Я получаю эту ошибку:
assert ['7.36*','6.99*','7.73*'].contains(node.toString()) | | | false | 6.9943104 6.9943104
это потому, что он пытается найти точную строку6.9943104
. если да, то как мне сделать так, чтобы это был подстановочный знак?2. Одним из способов было бы использовать регулярное выражение?
3. Потрясающее спасибо. Сделал мою жизнь намного проще 🙂
4. @Ross приятно вам помочь 🙂
Ответ №2:
Если вы предпочитаете XPath, а не Groovy scripting, вы все равно можете использовать простое выражение XPath:
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')
Тогда ожидаемый результат будет истинным.
С XPath вы можете использовать функции и операторы, как и в других языках программирования.
Комментарии:
1. Вместо нескольких можно использовать список значений с
|
?