圈复杂度和代码覆盖率

作者在 2010-10-12 23:09:03 发布以下内容
圈复杂度和代码覆盖率

(转载请注明来源于金庆的专栏)

100%代码覆盖率的单元测试并不代表是足够的测试,下面是一个例子:

int foo(bool isOK)
{
    const int ZERO = 0;
    int* pInt = NULL;
    if (isOk)
    {
        pInt = &ZERO;
    }
    return *pInt;
}

如果仅仅测试一种情况:
    foo(true);

结果是,测试通过,并具有100%的代码覆盖率。但我们知道foo(false);就会失败。

这里就要引入圈复杂度(Cyclomatic Complexity,CC)的概念。

圈复杂度是一种度量方法,由 Thomas McCabe 于 1975 年定义。
圈复杂度是一个方法中执行路径的数量。
起始CC从 1 开始。每一个条件,如 if、switch、while 和 for 语句,都被分配一个 1 值和异常路径。
一个方法的 CC 表明了它的复杂度。

以上foo()的CC为2,所以至少需要2个单元测试路径。

幸运的是,foo()的CC仅为2。
设想一下如果该缺陷被隐藏在 CC 为 102 的方法中,祝您好运找到它!

可使用一些开放源码工具来报告圈复杂度。C++可用Cppncss.
Cppncss是度量c++代码复杂度的工具,可度量函数级、文件级、工程级的复杂度。
可运行在windows(需要cygwin)及linux上。


参考:
追求代码质量: 监视圈复杂度 ( http://www.ibm.com/developerworks/cn/java/j-cq03316/ )
C++代码复杂度度量工具cppncss ( http://www.51testing.com/?uid-13997-action-viewspace-itemid-202260 )
基础知识 | 阅读 5187 次
文章评论,共1条
vfdff(作者)
2010-10-14 00:42
1
SourceMonitor: 代码重构的小工具<br />
转:<a href="http://blog.csdn.net/summerfang/archive/2006/09/04/1176916.aspx" target="_blank">http://blog.csdn.net/summerfang/archive/2006/09/04/1176916.aspx</a><br />
<br />
我们在做代码重构时,最麻烦的问题是什么?各人有各人的答案。<br />
<br />
对我来说,找到哪一段代码需要重构是最大的麻烦。产品写好了,程序怎么样?怎么判断?我的标准是,最复杂的代码就是最需要重构的代码。对于由整个团队写的代码,全面阅读是不太现实的。开会?程序员最最不喜欢开会了!那可是个技术活。:)<br />
<br />
最近,我用了一个小工具,SourceMonitor,取得了意想不到的好效果。推荐大家使用。<br />
<br />
 <br />
<br />
SourceMonitor是一个源代码衡量工具,由<a href="http://www.campwoodsw.com/" target="_blank">http://www.campwoodsw.com/</a>开发,免费下载。<br />
<br />
使用方法如下:<br />
<br />
 <br />
<br />
Step 1. 创建一个项目,比如,Java项目。<br />
<br />
Step 2 选择目录<br />
<br />
Step 3. 输入项目名<br />
<br />
Step 4 指定目录<br />
<br />
Step 5 指定检查点,缺省值就可。<br />
<br />
Step 6 完成<br />
<br />
Step 7 指定本次检查点<br />
<br />
Step 8 检查结果<br />
<br />
Step 9 最复杂的文件,这应该是首选的准备重构的文件。<br />
<br />
Step 10 双击此行可以看到对此文件的评估。<br />
<br />
 <br />
<br />
Step 11 打开文件可以直达最复杂的函数。<br />
<br />
 <br />
<br />
你看,现在寻找需要重构的函数简单多了!
游客请输入验证码
浏览1970263次