SoapUI:如何将0转换为' false'

时间:2015-01-22 21:02:35

标签: xpath groovy soapui

我使用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;。我怎样才能做到这一点?或者有更好的方法吗?

3 个答案:

答案 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()