我使用SoapUI测试WCF服务。我有一个XPath Match断言,其中Declare是:
if (boolean(//a:IsClick/text()[1])) then //a:IsClick else ''
对于源XML,节点是
<a:IsClick>false</a:IsClick>
所以声明部分等同于&#39; false&#39;。
预期框具有:
${#ResponseAsXml#(//CLICK[text()],'')}
和XML(来自JDBC测试步骤)是:
<CLICK>0</CLICK>
因此预期值为0.
我需要让这两个等同,所以我的断言将通过。一种方法是将预期结果从0转换为&#39; false&#39;。我怎样才能做到这一点?或者有更好的方法吗?
答案 0 :(得分:1)
在XPath中,boolean()
函数返回数字,字符串或节点集的布尔值。在您想要将数字转换为布尔值的情况下,boolean(0)
返回false,其余数字boolean(n)
返回true。另一方面,boolean()
的字符串boolean('false')
为boolean('')
或boolean()
(空字符串)返回false,其余字符串text()
返回true。所以你的问题是使用'0'
,你将boolean('0')
作为字符串而不是数字,所以当你试图投射JDBC Test Step
时,你就会变成现实。
在您的情况下,如果您的<Results>
<CLICK>0</CLICK>
</Results>
提供了一些XML结果,请执行以下操作:
0
您可以将此boolean()
转换为false,将number()
添加到您的表达式,并使用text()
函数代替${#ResponseAsXml#(boolean(//CLICK[number()]))}
。所以要将0转换为false使用:
${#ResponseAsXml#(//CLICK[text()],'')}
而不是:
{{1}}
希望这有帮助,
答案 1 :(得分: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()
答案 2 :(得分:0)
assert '1'.toInteger().asBoolean()
assert !'0'.toInteger().asBoolean()