测试用例不覆盖分支

时间:2018-08-10 14:01:29

标签: java groovy kotlin spock

我有一个代码,可以计算一个人的年龄并根据结果采取一些措施。

age = calculateAge();

if (age <= 30 || (age > 30 && city="newyork")){
println("Welcome")
}

我有用Spock编写的测试用例,其中包含年龄和城市的所有可能值

25|Newyork
25|London
30|Newyork
30|London
35|Newyork
35|London

但是仍然缺少一个分支。     如果我将年龄<= 30更改为年龄<30,就会得到保障。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这是因为age > 30检查是多余的-在这种情况下,永远不会执行它并返回false。如果执行到此为止,则条件将返回true,因为仅在age <= 30为false时才执行此操作。发生这种情况的原因是||是一个“短路”运算符,这意味着(对于'||'),它仅在左侧为假(如左侧为真)时才执行右侧。不论右手边的结果如何,“或”运算的结果都是正确的。

&&运算符的含义相同(相反),除了在这种情况下,它仅在左侧为true时才执行右侧,就像在false时为左侧一样,无论右侧的结果如何,&&的结果也必须为假。

您可以将此支票替换为:

if (age <= 30 || city == "newyork") {
   println("Welcome")
}

,您将具有相同的功能,所有分支都将覆盖。