C++ 代码覆盖率不好

C++ 代码覆盖率不好,c++,c,code-coverage,C++,C,Code Coverage,我已在我的计算机上安装了C++测试,仅使用UnitTest许可证(仅使用单元测试许可证)作为Visual Studio 2005插件(cpptest_7.2.11.35_win32_vs2005_plugin.exe) 我有一个类似以下的样本: bool MyFunction(... parameters... ) { bool bRet = true; // do something if( some_condition ) { //

我已在我的计算机上安装了C++测试,仅使用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;
}
在我的情况下,在运行覆盖率工具后,我得到以下结果(对于类似于前面提到的函数):

我真的不明白为什么我的PathCoverage(PC)没有100%的覆盖率。 另外,如果有人谁与C++测试Parasoft的经验可以解释低MCDC覆盖率为我这将是伟大的

我应该做些什么来增加覆盖率?因为我在这件事上没有主意了。 欢迎对文档(某些部分)进行说明

谢谢,


Iulian

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

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


希望这会有所帮助。

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

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


希望这能有所帮助。

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


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

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


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

这是关于各种类型代码覆盖率的一个很好的参考:

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


路径:上面链接中提到的路径覆盖的一个缺点是,许多路径都无法使用。您的示例可能就是这样。

这是关于各种类型代码覆盖率的一个很好的参考:

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


路径:上面链接中提到的路径覆盖的一个缺点是,许多路径都无法使用。您的示例可能就是这样。

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

bool x = true;
if (x) {
    do_something();
} 
if语句的“false”分支不可访问。这是一个明显的例子,但当您考虑几个if语句时,就越来越难以确定路径是否可行

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

您的工具不够智能,无法实现这一点


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

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

bool x = true;
if (x) {
    do_something();
} 
if语句的“false”分支不可访问。这是一个明显的例子,但当您考虑几个if语句时,就越来越难以确定路径是否可行

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

您的工具不够智能,无法实现这一点


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

就我个人而言,我认为用它启动任何函数都是不好的

bool-retCode=true

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

跟在你后面的程序员不会做出同样的假设