zoukankan      html  css  js  c++  java
  • 关于圈复杂度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节点,只能记做一个。

    赠人玫瑰
    手留余香

    我们曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是内心的淡定与从容……我们曾如此期盼外界的认可,到最后才知道:世界是自己的,与他人毫无关系!-杨绛先生

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

  • 相关阅读:
    mysql 一
    scanf函数的返回值问题
    统计一个数分解质因数中不同因子的个数
    统计一个数分解质因数中不同因子的个数
    统计一个数分解质因数中不同因子的个数
    GridControl控件和TreeList控件设置标志图
    GridControl控件和TreeList控件设置标志图
    GridControl控件和TreeList控件设置标志图
    btn按钮之间事件相互调用
    btn按钮之间事件相互调用
  • 原文地址:https://www.cnblogs.com/haochuang/p/2631357.html
Copyright © 2011-2022 走看看