2015-11-05 103 views
5

问题语句是100%分支覆盖率的测试案例,没有错误?

具有零故障,你可以写一个测试套件,该方法具有100%的语句覆盖,但没有发现故障,另一个有100%的分支覆盖率的测试套件,确实揭示了错误?

这是我写的一样

public faultyMethod1(int x, int y) { 
    int X =x; 
    int Y = y; 

    if (Y !=0){ 
    Z = X/Y; 
    } else { 
    System.out.println("Sorry. That's an DiviDeByZeroException"); 
    } 
} 

faultyMethod1 (1,2); 
faultyMethod1 (2,0); 

上面的代码实现具有100%的分支覆盖面,确实揭示了故障”

什么测试套件测试套件的方法有100%的语句覆盖,但是没有找到故障

+2

故障在哪里? (除此之外,'Z'永远不会被声明,也不会被使用。) – 5gon12eder

+0

这只是一个伪代码:-)错误是x/y。它可以抛出零除。 –

+2

但你有这个检查。代码将永远不会被零除。 – 5gon12eder

回答

5

让我们另一个例子......

// The method, according to our imaginary specification, should do: 
// return x * y, IF x is less than 2 
// return x + y, in any other case 
public int doSomething(int x, int y) { 

if (x < 2) { 
    return x * x; // this is our bug, it SHOULD be x * y 
} 

return x + y; 

} 

现在想象一下,我们有两个测试:

assertEquals(0, doSomething(0, 12)); // works, as 0 * 0 == 0 * 12 
assertEquals(20, doSomething(10, 10)); // works fine 

所以,现在我们有100%的测试覆盖率(因为X < 2支已经被覆盖,还有另外一个)。但是我们没有发现这个bug,因为使用0作为x的值隐藏它(因为0 *东西总是0,y是不相关的)。我们会需要这样的事情都可以出现任何其他情况

assertEquals(12, doSomething(1, 12)); // fails, because it will be 1*1 == 1 

同样的问题,其中包括零师。无法想象一个很好的例子,但是我想你知道如何拥有100%的覆盖率并不意味着找到100%的所有错误。 (找到它们的很酷的方法将是突变测试,但这是一个相当先进的主题。)

+0

虽然这个例子的确显示了一个没有被完整语句覆盖的测试套件所捕获的错误,但它并不直接回答这个问题,因为劣等测试套件也具有完整的分支覆盖。 – 5gon12eder

+0

对不起,没有明白的地方,这个例子也有完整的分支覆盖,因为每一种可能性(只有一种)都可以通过...? –

+0

是的,就是这一点。它不是一个具有完整语句覆盖的测试套件的例子,但是分支覆盖范围不完整,遗漏了在分支覆盖范围已经完成时发现的错误。这是我的(可能是错误的)对这个例子被寻求的问题的理解。 – 5gon12eder

1

如何将逻辑与OR混淆?

// This method must never throw; on error, it shall return -1. 
int foo(final String s, final int n) { 
    if (s != null || n != 0) { 
     return s.length()/n; 
    } else { 
     return -1; 
    } 
} 

以下测试输入实现了100%的语句覆盖率,并且不会揭示该错误。

assert foo("everything is fine", 6) == 3; // happy path, ok 
assert foo(null, 0) == -1;     // error path, ok 

的测试套件还没有FOLL分支覆盖,但是,因为逻辑或在一起的两个表达式求值在每种情况下相同的值。添加以下两个测试用例可以完成分支覆盖并显示错误。

assert foo("bingo", 0) == -1; // ArithmeticException 
assert foo(null, 4) == -1;  // NullPointerException 

作为事实上,这四个输入一起也实现路径覆盖比分支覆盖一个更强大的要求。