为什么每个'当数组为空时,循环不会运行

时间:2017-03-27 09:35:36

标签: groovy soapui

我有一个脚本断言,应该只检查响应中的每个项目,并检查每个项目是否是正确的数据类型。 我注意到当响应为空时,每个循环似乎都没有运行,因此断言在不应该的地方传递。

规则ID是响应中的字段,但是当请求条件与任何交易不匹配时,它将返回一个空数组。

这是每个循环的正确行为吗?如果是这样,最好的循环是什么?

以下代码并提前致谢

添加了这个Groovy代码段

import groovy.json.JsonSlurper
def slurper = new JsonSlurper()
def response = context.expand( '${POST/instant-deal/get-applicable-request#Response}' ).toString()
def jsonRes = slurper.parseText(response)

RuleId = jsonRes.RuleId
RuleId.each { RuleID ->
    log.error "Rule IDs: " + RuleID
    assert RuleID != null
    assert RuleID instanceof Integer    
}

2 个答案:

答案 0 :(得分:1)

是的,围绕空列表的循环将立即退出。

您正在执行以下操作:

def expected = [1,2,3]
def actual = myMethod() // returns a list of int
actual.each { x ->
   assert expected.contains(x)
}

正如您所指出的那样,actual == [][1][1,3][3,2,1]的传递 - 它所说的是什么,& #34;我不需要任何内容​​actual,但 中的任何内容都必须是expected的成员。

如果您希望确保expected中的每个成员都在actual,那么您应该绕expected代替:

expected.each { x ->
   assert actual.contains(x)
}

这会检查expected中是否存在actual的每个成员,但如果actual包含更多成员,则不会介意。因此,[1,2,3][3,2,1]以及[1,2,3,3][1,2,3,4]也会传递 - 这可能就是您所需要的。

如果要检查列表是否完全相同,只需使用actual == expected(在Groovy中...在Java中,您需要使用.equals()

你应该做什么,取决于你想要断言的确切内容。目前,您所描述的内容:"检查响应中的每个项目,并检查每个项目是否是正确的数据类型。" 应该传递一个空列表,因为列表中的每个项目(即无)都具有正确的类型。

答案 1 :(得分:0)

如果空的RuleId无效,则添加:

...
RuleId = jsonRes.RuleId
assert RuleId
...