代码之家  ›  专栏  ›  技术社区  ›  roxch

条件覆盖和单元测试

  •  0
  • roxch  · 技术社区  · 6 年前

    在编写单元测试(使用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));
        ...
    }
    

    @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 回复  |  直到 6 年前
        1
  •  1
  •   Harri    6 年前

    但事实并非如此 必要的 把测试分开 更好的 这样做:

    1. 一体化测试函数将中止对第一个失败断言的执行。没有其他组合的信息。当你分开时,你会有更详细的信息,知道哪些组合是完全失败的。注意 parameterized tests 会达到同样的效果。

    2. 从覆盖率的角度来看,一对一测试将在单个测试中积累覆盖率。没有办法分析每一个条件组合的贡献。当使用更复杂的条件覆盖度量时,这变得更加有价值,比如 MC/DC .

    授予:第二个方面取决于覆盖工具提供的数据收集的粒度。我们公司的工具 Coco 收集每个测试函数的覆盖率,但对C、C++和C仅如此。您可能希望查找Java代码的等效功能。