关于圈复杂度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/ 8年IT工作经验,5年测试技术与管理,2年产品与项目管理,曾参与过云计算\云存储\车联网产品研发工作; 业余自媒体人,有技术类垂直微信公众号;如有招聘或求职方面需求,请Mail to uetest@qq.com ;或通过 QQ:363573922 微博:@念槐聚 联系;

时间: 2024-09-19 17:12:27

关于圈复杂度CCN NCSS的相关文章

程序复杂度之圈复杂度

圈复杂度(Cyclomatic complexity)也称为条件复杂度或循环复杂度,是一种软件度量,是由Thomas J. McCabe, Sr. 在 1976 年提出,用来表示程序的复杂度,其符号为 VG 或是 M.圈复杂度是对源代码中线性独立路径数的定量测量. 圈复杂度使用的程序的控制流图来计算:在图中的节点对应于程序中一组不可分割的命令[代码行],有向边连接两个可连续执行的节点:[可连续执行的两个节点:第二个节点的命令组可能在第一个节点执行后立刻开始执行].圈复杂度可以应用到独立的功能,模

圈复杂度-三元运算语句的复杂度是怎么计算的?

问题描述 三元运算语句的复杂度是怎么计算的? 装了一个sourcemonitor,看了网上的介绍三元云散符语句也包括在内,请问相关法则是什么?比如if(a || b)没搜到,多谢. 函数圈复杂度(Function Complexity):圈复杂度指示一个函数可执行路径的数目,以下语句为圈复杂度的值贡献1:if/else/for/while语句, 三元运算符语句,if/for/while判断条件中的"&&"或"||" ,switch语句,后接break

圈复杂度评价及工具

转载请注明出处:http://blog.csdn.net/horkychen 圈复杂度用来评价代码复杂度,以函数为单位,数值越大表示代码的逻辑分支越多,理解起来也更复杂.圈复杂度可以成为编码及重构的重要参考指标,以指导撰写可读性高的代码.有关圈复杂度的定义,可以自行搜索.<代码大全>有如下的定义: 计算子程序中决策点数量的技术 (代码大全2,19章P458) 1.由1计数,一直往下通过程序. 2.一旦遇到以下关键字,或者其同类的词,就加1:   if, while, repeat, for,

什么是Cyclomatic Complexity(圈复杂度)?

  Campwood Software   SourceMonitor Version 3.5 The freeware program SourceMonitor lets you see inside your software source code to find out how much code you have and to identify the relative complexity of your modules. For example, you can use Sour

分布式系统的复杂度度量思考

前言 在构建系统的时候,有时候自己会说,我的系统很复杂,但是这时候又遇到问题了,如何度量一个系统的复杂性呢,这个是个开放性的问题,本身答案见仁见智,这里记录一下自己的思考. 历史借鉴 算法的复杂度 在学习算法的时候,经常会有复杂度的分析,分为时间复杂度和空间复杂度: 自我感觉在时间和空间维度,能够比较清晰的表述清楚: 代码的圈复杂度 概念 循环复杂度(Cyclomatic complexity)也称为条件复杂度,是一种软件度量,是由老托马斯·J·麦凯布(英语:Thomas J. McCabe,

软件设计的复杂度

什么是软件设计的复杂度 软件技术发展的使命之一就是控制复杂度(Complexity).从高级语言的产生,到结构化编程,再到面向对象编程.组件化编程等等.关于复杂度的定义并不一致,想要详细了解的可以读读The Many Faces of Complexity in Software Design. 英文中Complex和Complicated有着微妙的不同.但总结起来,软件复杂度偏负面意义,包括两个要点: - 难以理解 (难以维护和扩展.) - 无法预测行为 复杂度是随着软件规模不断扩大而必然产生

[转载]VS2008 的计算代码度量值

VS2008 里面加了一个 计算代码度量值的功能,那么到底是什么呢?我在msdn 里找到了这个,拷贝下来做个记录.  摘自 http://msdn.microsoft.com/zh-cn/library/bb385914.aspx Visual Studio Team System 代码度量概述 代码度量是一组软件度量值,使开发人员可以更好地了解他们正在开发的代码.利用代码度量,开发人员可以了解哪些类型和/或方法应该返工或进行更彻底的测试.开发团队可以识别潜在的风险.了解项目的当前状态,并跟踪软

浅谈遗留代码的重构

             背景 <重构>诞生至今有近17个年头了,日常开发中大家谈到重构,要么非常随意,认为重构就是改代码:要么非常谨慎,把重构描述成焦油坑,像瘟神一样敬而远之.针对最具挑战性的遗留代码重构,有哪些需要注意的呢? 谈论任何事情,都该有它的上下文.本文谈论的技术背景是大型通信类产品,对于互联网产品不一定适用.另外,本文也不会涉及重构技术,有兴趣读者可以读<重构>或者<Effective Refactoring in C++>. 遗留代码重构决策表 遗留代码

吐槽一下J2Cache

槽点一:集成方式采用ANT 工程还是传统的工程,集成还在用的ant,当然ant来做没有什么不可以,但是作为OSC这么高大上的作者拿出的作品能不能槽点高一些?已经采用了Maven了,用Maven无法独立完成的意思么? 槽点二:提交内容的不审慎 居然把Eclipse的工程文件提交到配置库,难道不知道有N多种开发工具么?不知道Eclipse工程文件中有一些东西是与本机相关的么?这样冲突如何解决呢?难不成所有作者的工程环境全是一样的? 槽点三:文件治理不够严谨 在src/main/java中赫然有xml