【问题标题】:Condition Coverage and Unit Testing条件覆盖和单元测试
【发布时间】:2019-02-11 15:57:59
【问题描述】:

在编写单元测试时(使用junit),是否需要将测试方法分开才能达到完整的条件覆盖?

以这个 sn-p 为例:

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));
    ...
}

@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));
}

【问题讨论】:

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


    【解决方案1】:

    虽然没有必要拆分测试,但这样做更好

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

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

    当然:第二个方面取决于您的覆盖工具提供的数据收集粒度。我们公司的工具Coco 收集每个测试函数的覆盖率,但目前仅针对 C、C++ 和 C# 这样做。您可能想寻找 Java 代码的等效功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多