一个方法中的每个可能的分支都应该有一个单独的junit吗?

AHu*_*ist 10 java testing junit unit-testing

这更像是一个设计问题.

假设您有这样的方法(作为示例):

if (x == 5) {
  c = 1;
} else {
 if (z != 2) {
  b = 6;
} else {
   a = 3;
}
Run Code Online (Sandbox Code Playgroud)

您是否认为为每个可能的分支设置junit是最佳做法?即,testx5,测试xnot5znot2,testxnot5z2等,或类似的东西:

void testMethod() {
// x is 5
test/assert code;

// x not 5, z not 2
test/assert code;

// x not 5, z is 2
test/assert code

// etc
}
Run Code Online (Sandbox Code Playgroud)

编辑:为了清楚起见,我的目标是完整的代码覆盖率.我只想知道是否应该为每个分支进行新测试或将它们组合在一个测试中.谢谢您的意见.

Kan*_*ane 9

您正在讨论的内容称为分支覆盖.

传统观点认为,编写代码来覆盖该用例非常重要,编写测试用例来覆盖该代码非常重要.因此,这似乎可以说100%的分支覆盖率是一个很好的目标(并且还意味着100%的声明覆盖率,但不一定是100%循环或100%条件覆盖率).

但是,您还需要平衡编写测试的工作量和获得这些测试的价值.例如,如果您正在测试的代码有一个try/catch来捕获已检查的异常,但异常几乎从不抛出(或者很难导致在测试用例中抛出),那么编写一个测试来覆盖该异常可能不值得你花时间.

这就是为什么你在许多地方看到,针对某一百分比的测试覆盖率是一个坏主意,因为你最终编写测试用例来获得覆盖,而不是发现错误.在您的示例中,是的,每个分支都应该拥有自己的测试用例.在每一条生产代码中,它可能都没有必要.


Sam*_*ard 9

JUnit的常见问题似乎表明,最好是有较少的断言更多的测试,如果仅仅是因为JUnit会仅在测试方法报告的第一个断言失败.使用一种方法,如果你打破了x = 5的情况,你就无法判断是否有任何x!= 5个案例仍然有效.