100%分支覆盖的测试用例没有错误?

时间:2015-11-05 03:29:01

标签: java junit testcase

问题陈述是

一个零故障的方法,你可以编写一个测试套件,它具有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 个答案:

答案 0 :(得分: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&lt; 2分支已被覆盖,另一个覆盖)。但我们没有找到错误,因为使用零作为x的值隐藏它(因为0 *某事总是0,y是无关紧要的)。我们需要这样的东西......

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

任何其他情况都可能出现同样的问题,包括除以零。无法想象一个很好的例子,但我想你得到的基本想法是如何100%覆盖并不意味着找到100%的错误。 (找到它们的一种很酷的方法是进行变异测试,但这是一个非常高级的主题。)

答案 1 :(得分:1)

如何将逻辑AND与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 branch-coverage,因为在每种情况下ORed一起计算的两个表达式都是相同的值。添加以下两个测试用例可以完成分支覆盖并公开错误。

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

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