2009-06-18 67 views
1

我在我的计算机上安装了C++作为Visual Studio 2005插件(cpptest_7.2.11.35_win32_vs2005_plugin.exe),仅使用UnitTest许可证(仅单元测试许可证)进行测试。代码覆盖百分比不好

我有类似的样本如下:

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

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)。 另外,如果有人使用C++ Test Parasoft的经验可以解释低MCDC覆盖率对我来说会很好。

我该怎么做才能提高覆盖率?因为我在这种情况下没有想法。 欢迎使用文件(的某些部分)。

谢谢

尤利安

+0

我在代码中看到4条路径。但是有一条路是不可能的(我相信测试工具看不到)。你测试了多少? – 2009-06-18 16:03:03

回答

2

这是关于各种代码覆盖范围的很好的参考:http://www.bullseye.com/coverage.html

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

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

+1

我认为这个http://www.bullseye.com/coverage.html#basic_path是PathCoverage(PC)意义的一个很好的例子。这意味着C++测试并没有消除“不可能”的情况。 – INS 2009-06-18 14:22:54

3

我不能和你正在使用的专用工具的帮助,但路径覆盖的总体思路是,通过代码每一个可能的路径应该被执行。

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

希望有所帮助。

+1

我知道你在说什么,但我的猜测是C++ Test不会消除一些不可能的情况。例如,如果不执行最后一个“if”,则不能执行“else”部分。可能这种情况不会被C++ Test从可能性列表中删除。 – INS 2009-06-18 14:05:19

+0

@Iulian:我想你在回答你自己的问题。 – 2009-06-18 14:09:22

1

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

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

+0

我做了所有可能的测试用例。您可以看到,线路覆盖率(LC)和区块覆盖率(BC),决策覆盖率(DC)简单条件均衡值(SCC)为100%。 唯一的问题是路径覆盖(PC)和MCDC(修改的条件,决策覆盖率)不是100%,尽管我测试了所有的情况。这就是为什么我认为这是某种C++ Test的错误。 – INS 2009-06-18 14:10:16

+1

@Iulian:不,我认为这是你在其他评论中所说的。 – 2009-06-18 14:12:54

1

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

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

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

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

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

0

就个人而言,我认为这是不好的形式启动任何函数

布尔RETCODE = TRUE;

你正在做一个明确的假设,它默认会成功,然后在某些条件下失败。

程序员来之后,你不会做出这个相同的假设。

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