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

代码覆盖率百分比不好

  •  1
  • INS  · 技术社区  · 16 年前

    我已经安装了我的计算机C++测试,只有UNITTEST许可证(只有单元测试许可证)作为VisualStudio 2005插件(CPPPest7.7.2.1135Wi32 VS2005 5Pueln.EXE)。

    我有一个类似以下的样本:

    bool MyFunction(... parameters... )
    {
        bool bRet = true;
    
            // do something
        if( some_condition )
        {
            // do something
            bRet = CallToAFunctionThatCanReturnBothTrueAndFalse....
        }
        else
        {
            bRet = false;
            // do something
        }
    
        if(bRet == false)
        {
            // do something
        }
    
        return bRet;
    }
    

    在我的例子中,在运行覆盖工具之后,我得到了以下结果(对于类似于前面提到的函数):

    [LC=100 BC=100 PC=75 DC=100 SCC=100 MCDC=50 (%)]
    

    我真的不明白为什么当涉及到路径覆盖率(PC)时,我没有100%的覆盖率。 此外,如果有经验的C++测试Pasopt可以解释低MCDC覆盖面对我来说,这将是巨大的。

    我该怎么做才能增加保险范围?因为在这种情况下我没有想法。 欢迎提供文档(部分)的说明。

    谢谢您,

    尤利安

    5 回复  |  直到 16 年前
        1
  •  2
  •   Pete TerMaat    16 年前

    这是关于各种类型代码覆盖率的一个很好的参考: http://www.bullseye.com/coverage.html .

    MCDC :要提高MCDC覆盖率,您需要查看 some_condition . 假设它是一个复杂的布尔表达式,那么您需要看看您是否在执行必要的值组合。具体来说,每个布尔子表达式都需要执行true和false。

    路径 :上面链接中提到的一个缺点是路径覆盖的缺点是许多路径无法运行。你的例子可能就是这样。

        2
  •  3
  •   Ross McFarlane    16 年前

    对于您正在使用的特定工具,我无能为力,但路径覆盖的一般思想是应该执行代码中的每个可能路径。

    如果您在程序中绘制流程图,在每个if/break/continue等处进行分支,您应该看到您的测试正在通过程序采用哪些路径。要得到100%(这不是完全必要的,也不能保证是一个完美的测试),您的测试必须遍历代码的每个分支,执行每一行。

    希望有帮助。

        3
  •  1
  •   tombjo    16 年前

    您需要至少两个测试用例才能获得100%的覆盖率。一个条件是真的,另一个条件不是真的。如果你有,你应该得到100%的保险。

    尽管你应该看到100%的覆盖率是完美的。在这种情况下,您需要进行3次测试,以便测试所有组合。查找圈复杂度以了解更多信息。

        4
  •  1
  •   waxwing    16 年前

    这个函数有四种假设路径。每个if子句使路径数加倍。每个if语句都是一个分支,您可以使用两种不同的方法。因此,每当您的工具遇到“if”时,它假定代码可以采用“true”分支或“false”分支。然而,这并不总是可能的。考虑:

    bool x = true;
    if (x) {
        do_something();
    } 
    

    if语句的“false”分支不可访问。这是一个明显的例子,但是当您在几个if语句中考虑因素时,越来越难以看到路径是否可行。

    代码中只有三条可能的路径。在第一个if语句中采用“false”分支,在第二个if语句中采用“true”分支的路径是不可访问的。

    你的工具不够聪明,无法意识到这一点。

    也就是说,即使工具是完美的,在实际的应用程序中获得100%的路径覆盖率也不太可能。然而,非常低的路径覆盖率是您的方法具有太高的圈复杂度的一个肯定标志。

        5
  •  0
  •   Chris K    16 年前

    就个人而言,我认为启动任何功能都是不好的形式

    bool retcode=true;

    你明确地假设它会在默认情况下成功,然后在特定条件下失败。

    接下来的程序员不会做出同样的假设。

    失败快,失败早。

    正如其他人所说,如果你想测试失败案例,你必须对失败的测试进行编码。