代码覆盖率不佳

时间:2009-06-18 13:51:51

标签: c++ c code-coverage

我已经在我的计算机上安装了C ++ Test,仅使用UnitTest许可证(仅限单元测试许可证)作为Visual Studio 2005插件(cpptest_7.2.11.35_win32_vs2005_plugin.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 (%)]

我真的不明白为什么我在PathCoverage(PC)上没有100%的覆盖率。 此外,如果有C ++ Test Parasoft经验的人可以解释我的MCDC覆盖率低,那将是很好的。

我应该怎样做才能增加报道?因为我在这种情况下没有想法。 欢迎向文档(某些部分)发送指示。

谢谢,

尤利安

5 个答案:

答案 0 :(得分:3)

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

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

希望有所帮助。

答案 1 :(得分:2)

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

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

路径:上面链接中提到的一个事情是路径覆盖的缺点是很多路径都无法运行。你的例子可能就是这种情况。

答案 2 :(得分:1)

您需要至少两个测试用才能获得100%的覆盖率。其中some_condition为true,而one_condition为true。如果你有,你应该获得100%的报道。

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

答案 3 :(得分:1)

通过该功能有四条假设路径。每个if子句使路径数增加一倍。每个if语句都是一个分支,您可以通过两种不同的方式。因此,只要您的工具遇到“if”,它就会假定代码可以采用“true”分支或“false”分支。但是,这并不总是可行的。考虑:

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

if语句的“false”分支无法访问。这是一个明显的例子,但是当你考虑几个if语句时,越来越难以看出路径是否可行。

您的代码中只有三种可能的路径。第一个if语句中的“false”分支和第二个中的“true”分支的路径无法访问。

你的工具不够聪明,无法实现这一点。

话虽如此,即使该工具是完美的,在实际应用中可能不太可能获得100%的路径覆盖。但是,非常低的路径覆盖率肯定表明您的方法具有过高的圈复杂度。

答案 4 :(得分:0)

就个人而言,我认为使用

启动任何功能是不好的形式

bool retCode = true;

您明确假设它默认会成功,然后在某些条件下失败。

追随你的程序员不会做出同样的假设。

快速失败,早早失败。

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