关于圈复杂度CCN NCSS

关于软件度量中的圈复杂度

 
首先看两个概念:
 
NCSS(Non Commenting Source Statements)有效代码行,扣除注释。

CCN(Cyclomatic Complexity Number),圈复杂度。1个方法的CCN值通常意味着我们需要多少个测试案例来覆盖其不同的路径。当CCN发生很大波动或者CCN很高的代码片段被变更时,意味改动引入缺陷风险高。根据资料,圈复杂度(或CC)大于10的方法存在很大的出错风险。

以下内容摘自:http://blog.csdn.net/yefengnidie/article/details/7218993

  一种代码复杂度的衡量标准,中文名称叫做圈复杂度。 在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度 大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。

    控制流图是McCabe复杂度计算的基础,McCabe度量标准是将软件的流程图转化为有向图,然后以图论的知识和计算方法来衡量软件的质量。 McCabe复杂度包括圈复杂度(Cyclomatic complexity)、基本复杂度、模块涉及复杂度、设计复杂度和集成复杂度等。控制流程图分析是一个静态的分析过程,它提供静态的度量标准技术,一般主要运用在白盒测试的方法中 

   有以下三种方法计算圈复杂度: 

  1,流图中区域的数量对应于环型的复杂性; 

  2,给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量; 

  3,给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结点的数量。 

没有流程图的算法: 
      

碰到以下项加 1: 

分支数(如 if、while 和 do while) 

switch 中的 case 语句数 

如果条件是2个复合条件的话 不是加1 是加2 

   面这个实例中,单元测试的覆盖率可以达到100%,但是很容易发现这其中已经漏掉了一个NPE的测试用例。case1方法的圈复杂度为2,因此至少需要2个用例才能完全覆盖到其所有的可能情况。 

    //程序原代码,圈复杂度为 2 

public String case1(int num) { 

       String string = null; 

       if (num == 1) { 

           string = "String"; 

       } 

       return string.substring(0); 

    } 

//上面代码的单元测试代码 

    public void testCase1(){ 

       String test1 = case1(1); 

    } 

e = 3 ; n = 3;那么全复杂度V(G) = 3 - 3 + 2 = 2,既case1的圈复杂度为2。 

  看更复杂的例子 
public String case2(int index, String string) { 

       String returnString = null; 

       if (index < 0) { 

           throw new IndexOutOfBoundsException("exception <0 "); 

       } 

       if (index == 1) { 

           if (string.length() < 2) { 

              return string; 

           } 

           returnString = "returnString1"; 

       } else if (index == 2) { 

           if (string.length() < 5) { 

              return string; 

           } 

           returnString = "returnString2"; 

       } else { 

           throw new IndexOutOfBoundsException("exception >2 "); 

       } 

       return returnString; 

    } 

 
根据公式 V(G) = e – n + 2 = 12 – 8 + 2 = 6 。case2的圈复杂段为6。说明一下为什么n = 8,虽然图上的真正节点有12个,但是其中有5个节点为throw、return,这样的节点为end节点,只能记做一个。

posted @ 2012-08-10 10:23  念槐聚  阅读(1360)  评论(0编辑  收藏  举报