关于圈复杂度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节点,只能记做一个。 



本文转自 念槐聚 博客园博客,原文链接:http://www.cnblogs.com/haochuang/archive/2012/08/10/2631357.html,如需转载请自行联系原作者

相关文章
|
11月前
|
人工智能 自然语言处理 前端开发
💻2024 年值得一试的 8 个开发者工具💡
在本文中,我们精选了8款开发人员必备的高效工具,包括Webcrumbs、Pieces.app、Warp、Raycast等。这些工具涵盖了从前端插件生成、代码片段管理到多语言界面构建等多种功能,帮助开发人员简化工作流程、提高生产力。无论您是经验丰富的开发者,还是刚入行的新手,这些工具都将为您的开发过程带来效率提升和便利。探索这些工具,让您的开发工作更加轻松高效!
948 66
|
12月前
生物塑料与可持续材料:环保材料的创新与应用
【9月更文挑战第21天】生物塑料作为环保材料的重要代表,以其可降解、低污染和可再生等特性,在解决全球环境问题中发挥着重要作用。通过技术创新和市场拓展,生物塑料将在更多领域得到应用,为实现可持续发展和环境保护贡献力量。让我们携手共进,推动生物塑料与可持续材料的创新与应用,共同守护我们的地球家园。
266 13
|
11月前
|
机器学习/深度学习 搜索推荐 算法
深度学习-点击率预估-研究论文2024-09-14速读
深度学习-点击率预估-研究论文2024-09-14速读
169 0
|
Ubuntu C++
Ubuntu20.04LTS+uhd3.15+gnuradio3.8.1源码编译及安装
Ubuntu20.04LTS+uhd3.15+gnuradio3.8.1源码编译及安装
597 0
|
安全 网络安全 网络虚拟化
虚拟网络设备的网络隔离机制:原理、意义与应用场景深度分析
虚拟网络设备在现代网络架构中扮演着重要角色🌐,尤其是在实现网络隔离方面🛡️。网络隔离是网络安全🔒和多租户环境管理的关键组成部分,它能够确保不同网络流量的分离🚦,保护敏感数据💾,减少攻击面。虚拟网络设备通过在软件层面上模拟物理网络设备的行为,提供了一种灵活且成本效益高的方式来实现这些目标。本文将从多个维度深入分析虚拟网络设备是如何隔离网络的,这种隔离有什么实际意义,为什么需要虚拟网络设备来隔离网络,以及在什么场景下比较适合使用虚拟网络设备隔离网络。
【Linux驱动学习(1)】USB与input子系统,linux统一设备模型,枚举,USB描述符深入剖析
【Linux驱动学习(1)】USB与input子系统,linux统一设备模型,枚举,USB描述符深入剖析
|
Python
Python中的try-except异常处理语句
Python中的try-except异常处理语句
335 2
|
存储 Linux 网络安全
VMware环境部署vFW虚拟防火墙
VMware环境部署vFW虚拟防火墙
VMware环境部署vFW虚拟防火墙
|
关系型数据库 MySQL 数据安全/隐私保护
docker 安装mysql 8.0的步骤
以下是安装 MySQL 8.0 的 Docker 步骤: 1. 首先,确保你已经安装了 Docker 并启动了 Docker 服务。 2. 打开终端或命令行界面。 3. 在终端中输入以下命令,从 Docker Hub 下载并运行 MySQL 8.0 的最新镜像: ``` docker run --name=mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=your_password -d mysql:8.0 ``` 解释: - `--name=mysql8`:指定容器的名称为 "mysql8"。 - `-p 33
2126 0
|
数据采集 传感器 存储
大数据这么玩 - 家庭温湿度数据采集与分析
本文用树莓派连接温湿度传感器,配合阿里云DataWorks、MaxCompute以及Quick BI等产品,完成了家庭温湿度数据采集与分析。
1405 0
大数据这么玩 - 家庭温湿度数据采集与分析