1

我已经在我的计算机上安装了仅使用 UnitTest 许可证(仅 Unit Test 许可证)作为 Visual Studio 2005 插件( cpptest_7.2.11.35_win32_vs2005_plugin.exe )的 C++Test。

我有一个类似于以下的示例:

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 覆盖率低,那就太好了。

我应该怎么做才能增加覆盖率?因为在这种情况下我没有想法。欢迎对文档(某些部分)的指示。

谢谢,

尤利安

4

5 回答 5

3

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

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

希望有帮助。

于 2009-06-18T13:58:15.313 回答
2

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

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

路径:上面链接中提到的作为路径覆盖的缺点之一是许多路径是不可能行使的。您的示例可能就是这种情况。

于 2009-06-18T14:09:48.207 回答
1

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

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

于 2009-06-18T14:03:36.533 回答
1

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

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

if 语句的“假”分支无法访问。这是一个明显的例子,但是当您考虑多个 if 语句时,要判断一条路径是否可行变得越来越困难。

您的代码中只有三个可能的路径。在第一个 if 语句中采用“false”分支和在第二个中采用“true”分支的路径是无法到达的。

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

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

于 2009-06-18T14:21:22.677 回答
0

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

布尔 retCode = true;

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

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

快速失败,早点失败。

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

于 2009-06-18T14:32:47.223 回答