`

软件度量中的圈复杂度小结

阅读更多
今天学习了软件度量中的圈复杂度的概念,下面小结下:

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


    控制流图是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节点,只能记做一个。



2
6
分享到:
评论

相关推荐

    《软件工程》教案(本科)

    §5.5 程序复杂度的定量度量 61 §5.6 小结 63 §5.7 补充实例 63 第六章 编码 67 §6.1 编码的目的 67 §6.2 编码的风格 67 §6.3 程序设计语言 69 §6.4 小结 70 §6.5 补充实例 70 第七章 测试 71 第八章 维护 75...

    《软件工程》本科教案

    目录 第一章 软件工程概述 4 §1.1 软件的概念、特点及分类 4...软件设计方法(面向数据结构的设计方法) 60 §5.5 程序复杂度的定量度量 61 §5.6 小结 63 §5.7 补充实例 63 第六章 编码 67...

    1、图像采集视频介绍说明资料

    LabVIEW评估代码复杂度 项目规划的主要任务之一是估计项目需要多长时间才能完成,需要多少开发人员...VI度量工具可以计算任何VI或VI层次结构中使用的LabVIEW节点数量。节点几乎是框图上的任何对象,包括功能、VI和结

    模式分类PatternClassificationSecondEdition中译本-模式分类.part1.rar

    1.6本章小结 全书各章概要 文献和历史评述 参考文献 ------------------------- 第二章贝叶斯决策论 2.1引言 2.2贝叶斯决策论连续特征 2.3最小误差率分类 2.4分类器判别函数及判定面 2.5正态函数 2.6正态...

    模式分类PatternClassificationSecondEdition中译本-模式分类.part2.rar

    1.6本章小结 全书各章概要 文献和历史评述 参考文献 ------------------------- 第二章贝叶斯决策论 2.1引言 2.2贝叶斯决策论连续特征 2.3最小误差率分类 2.4分类器判别函数及判定面 2.5正态函数 2.6正态...

    计算机二级公共基础知识

    在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第k层上有2k-1个结点,且深度为m的满二叉树有2m-1个结点。 完全二叉树是指这样的二叉树:除最后一层外,每一层上的结点数均达到最大值;在最后一层上只...

    分布式算法 作者:(美)Nancy A.Lynch 舒继武 李国东part1

    !!注意:全文有99M,由于上传文件不得超过60M,所以分成两个压缩文件,这是part1.part2在以下网页: ... 在本书中,作者给出设计,实现和...25.7 小结 483 25.8 参考文献注释 483 25.9 习题 483 参考文献 486 索引 512

    使用深度模型迁移进行细粒度图像分类的方法.pdf

    针对细粒度图像分类方法中存在模型复杂度较高、难以利用较深模型等问题,提出深度模型迁移( DMT)分类方法。首先,在粗粒度图像数据集上进行深度模型预训练;然后,使用细粒度图像数据集对预训练模型logits层进行不...

    大数据处理:大数据概述.pdf

    运营式系统阶段 数据库的出现使得数据管理的复杂度大大降低 ,数据往往伴 随着一定的运营活动而产生并记录在数据库中的 ,这种数据 的产生方式是被动的 用户原创内容阶段 数据爆发产生于Web 2.0 时代,而Web 2.0 的...

    并行计算导论(原书第2版).[美]Ananth Grama(带详细书签).pdf

    4.8 小结 4.9 书目评注 习题 第5章 并行程序的解析建模 5.1 并行程序中的开销来源 5.2 并行系统的性能度量 5.2.1 执行时间 5.2.2 总并行开销 5.2.3 加速比 5.2.4 效率 5.2.5 成本 5.3 粒度对性能的影响 ...

Global site tag (gtag.js) - Google Analytics