2015-01-22 4 views
0

Я использую SoapUI для тестирования службы WCF. У меня есть утверждение XPath Match, в котором Declare является:SoapUI: Как отличить 0 как 'false'

if (boolean(//a:IsClick/text()[1])) then //a:IsClick else '' 

Для исходного XML, узел

<a:IsClick>false</a:IsClick> 

поэтому раздел Declare приравнивает к 'ложным'.

Ожидаемая коробка имеет следующее:

${#ResponseAsXml#(//CLICK[text()],'')} 

и XML (из теста Шага JDBC) является:

<CLICK>0</CLICK> 

так ожидаемое значение 0.

мне нужно пусть эти два приравниваются, так что мое утверждение пройдет. Один из способов сделать это - сделать ожидаемый результат от 0 до «false». Как я могу это сделать? Или есть лучший подход?

+1

Downvoted ... почему? – Dewey

ответ

1

В XPath функция boolean() возвращает логическое значение для числа, строки или набора узлов. В вашем случае, когда вы хотите присвоить номер логическому, boolean(0) возвращает false, для остальных номеров boolean(n) возвращает true. С другой стороны boolean() строки возвращает false для boolean('false') или для boolean('') (пустая строка) для остальных строк boolean() возвращает true. Таким образом, ваша проблема заключается в том, что с помощью text() вы получаете '0' как строку вместо числа, поэтому при попытке наложить boolean('0') вы становитесь истинными.

В вашем случае, если у Вас есть некоторый XML результат вашего JDBC Test Step как:

<Results> 
    <CLICK>0</CLICK> 
</Results> 

Вы можете преобразовать это 0 лжи, добавив boolean() к вашему выражению, а также используя number() функции вместо text(). Таким образом, чтобы бросить 0 неправильное использование:

${#ResponseAsXml#(boolean(//CLICK[number()]))}

вместо:

${#ResponseAsXml#(//CLICK[text()],'')}

Надеется, что это помогает,

+0

Спасибо ... точно, что я искал! – Dewey

+0

@ Dewey приветствую ':)'! – albciff

0

Простейшим решением является превращение этого в проблему Groovy - утверждение Groovy.

Вот визуализация (см documentation):

def negIsClick = "false" 
def negCLICK = "0" 

def posIsClick = "true" 
def posCLICK = "1" 

// fake "cast" the text to boolean 
assert !(negIsClick.equals("true") ?: false) 
assert (posIsClick.equals("true") ?: false) 

assert !negCLICK.toInteger() // zero is false 
assert posCLICK.toInteger() // all other numbers are true 

// note the exclamations everywhere 
assert !(negIsClick.equals("true") ?: false) == !negCLICK.toInteger() 
assert !(posIsClick.equals("true") ?: false) == !posCLICK.toInteger() 
// this fails 
assert (negIsClick.equals("true") ?: false) == negCLICK.toInteger() 

Последний один выходит из строя, потому что вы не можете сравнить логическое значение в целое число. Но в тех случаях, когда до этого, ! сначала бросает все на логические.

Так что в вашем случае, вам нужно будет сделать что-то вроде:

// read in the two values 
def IsClick = context.expand('${XML test step#Response//*:IsClick}') 
def CLICK = context.expand('${JDBC test step#ResponseAsXml//*:CLICK}') 
// now compare them 
assert !(IsClick.equals("true") ?: false) == !CLICK.toInteger() 
Смежные вопросы