条件覆盖率和单元测试

时间:2019-02-11 15:58:00

标签: unit-testing junit separation-of-concerns test-coverage

编写单元测试(使用junit)时,是否有必要分开测试方法以达到完整的条件覆盖范围?

以以下代码段为例:

int foo(boolean a, boolean b, boolean c){
    if(a && b && c)
        return 1;
    else return 0;
}

如果这样的话,为条件覆盖率编写一个方法和不同的断言更好吗?还是针对每种情况的一种方法?

@Test
void conditionsTest(){
    assertEqual(0, foo(true, false, false));
    assertEqual(0, foo(true, true, false));
    assertEqual(1, foo(true, true, true));
    ...
}

OR

@Test
void condition1Test(){
    assertEqual(0, foo(true, false, false));
}

@Test
void condition2Test(){
    assertEqual(0, foo(true, true, false));
}

@Test
void condition3Test(){
    assertEqual(1, foo(true, true, true));
}

1 个答案:

答案 0 :(得分:1)

虽然不需要拆分测试,但这样做可能更好。

  1. 多合一测试功能将在第一个失败的断言时中止执行。没有其他组合的信息。当分开时,您将获得有关哪些组合完全失败的更多详细信息。请注意,parameterized tests将达到相同的效果。

  2. 从覆盖率的角度来看,多合一测试将积累单个测试中的覆盖率。无法分析每种条件组合的贡献。当使用诸如MC/DC之类的更复杂的条件覆盖率指标时,这变得更加有价值。

保证:第二个方面取决于覆盖工具提供的数据收集的粒度。我们公司的工具Coco收集每个测试功能的覆盖率,但到目前为止仅针对C,C ++和C#收集覆盖率。您可能需要寻找Java代码的等效功能。