环形复杂度

环形复杂度,第1张

环形复杂度也称为圈复杂度,它是一种为程序逻辑复杂度提供定量尺度的软件度量。 n环形复杂度的应用——可以将环形复杂度用于基本路径方法,它可以提供:程序基本集的独立路径数量;确保所有语句至少执行一次的测试数量的上界。 Ø独行旁立路径是指程序中至少引入了一个新的处理语句集合或一个新条件的程序通路。采用流图的术语,即独立路径必须至少包含一条在本次定义路径之前不曾用过的边。 n测试可以被设计为基本路径集的执行过程,但基本路径集通常并不唯一。

从档念橡前面学过的覆盖测试一节中可知,对于一个较为复杂的程序要做到完全的路径覆盖测试是不可能实现的。既然路径覆盖测试无法达到,那么可以对某个程序的所有独立路径进行测试,也就是说检验了程序的每一条语句,从而达到语句覆盖,这种测试方法就是独立路径测试方法。从控制流图来看,一条独立路径是至少包含有一条在其它独立路径中从未有过的边的路径。路径可以用控制流图中的节点序列来表示。 例如,在如图4-3所示的控制流图中,一组独立的路径是

path1:1 - 11

path2:1 - 2 - 3 - 4 - 5 - 10 - 1 - 11

path3:1 - 2 - 3 - 6 - 8 - 9 - 10 - 1 - 11

path4:1 - 2 - 3 - 6 - 7 - 9 - 10 - 1 - 11 路径 path1,path2,path3,path4组成了控制流图的一个基高橡本路径集

一种代码复杂度的衡量标准,中文名称叫做圈复杂度。

在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度

大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。

控制流图是McCabe复杂度计算的基础,McCabe度量标准是将软件的流程图转化为有向图,然后以图论的知识和计算方法来衡量软件的质量。

McCabe复杂度包括圈复杂度(Cyclomatic

complexity)、基本复杂度、模块涉及复杂度、凳高笑设计复杂度和集成复杂度等。控制流程图分析是一个静态的分析过程,它提供静态的度量标准技术,一般

主要运用在白盒测试的方法中。

控制流图的一个重要性质是它的可规约性(reducibility)。如果程序中不存在从循环外跳到循环内的goto语句,那么这个程序对应的控制流图是

可规约的(reducible),反之这个控制流图就是不可规约的(irreducible)。因此,模块符合结构化程序设计的准则是控制流图可规约的基础。

程序环路复杂性也即为McCabe复杂性度量,它一般常用圈复杂度来描述,记录为V(G)。它用来衡量一个程序模块所包含的判定枣含结构的复杂程度,数量上表

现为独立路径的条数,即合理地预防错误所需测试的最少路径条数,圈复杂度大的程序,说明其代码可能质量低且难于测试和维护。经验表明,程序的可能存在的

Bug数和圈复杂度有着很大的相关念伏性

圈复杂度的计算方法很简单,计算公式为:V(G)=e-n+2。其中,e表示控制流图中边的数量,n表示控制流图中节点的数量。其实,圈复杂度的计算还有

更直观的方法,因为圈复杂度所反映的是“判定条件”的数量,所以圈复杂度实际上就是等于判定节点的数量再加上1,也即控制流图的区域数,对应的计算公式

为:V(G)=区域数=判定节点数+1。

对于多分支的CASE结构或IF-ELSEIF-ELSE结构,统计判定节点的个数时需要特别注意一点,要求必须统计全部实际的判定节点数,也即每个

ELSEIF语句,以及每个CASE语句,都应该算为一个判定节点。判定节点在模块的控制流图中很容易被识别出来,所以,针对程序的控制流图计算圈复杂度

V(G)时,最好还是采用第一个公式,也即V(G)=e-n+2;而针对模块的控制流图时,可以直接统计判定节点数,这样更为简单。

这个啊,我也困惑了好久,后来找资料看了下,计算方法其实有3种:

环形复杂度定量度量程序的逻辑复杂度。描绘程序控制流的流图之后,可以用下述3种方法中的任何一种来计算环形复杂度。

(1)流图中的区域数等于环形复杂度。

(2)流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。

(3)流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。

自己是这样理解的:

     这种环路度量法,计算的思路是这样的:它是考虑控制的复杂程度,即条件选择的分支繁杂程度。

     这个可能比较抽象,还是用例题来说吧。看图:

分别用三种方法来计算2道题

第一题图到了c开始条件判断形成分支D,E;E这里又按条件来判断是否继续到F还是按一个自环做循环然后再到F,然后再回到让厅B

(1)流图中的区域数等于环形复杂度。

      注意区域块可以看作是按不同条件形成的数据 *** 作分支块,比如橙色块就可以看做满足Z<t那条分支(下面那个图还要满足cond==true)处理的数据 *** 作块,注意了,下面那个图G节点不是有个自环的循环歼隐吗?为什么那个循环不自成一块,而节点E的自环就要自成一块呢?你要这样理解:下图的G点不错是有自环,但是这个自环按MCCABE的理解对整个系统的复杂度没影响,其实就是没有形成分支,即数据到了G节点都要做循环,也就是说下图的G节点搞个自环是来干扰大家的,完全可以把它简化成上面图的G点。而E节点的自环注意有个条件P<=5,也就是说这个自环是条件判断的结果,也就是说对复杂度有影响所以不能忽略,假如这里把条件P<=5去氏滑厅掉,也就是说到了E节点先不管三七二十一先来做个循环再去判断然后再去到F的话那E点的自环也应该忽略。

所以按区域划分:上图3块,下图4块。复杂度分别是:3,4

(2)流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。

有了前面的分析,现在就好做了:

上图:8-7+2=3

下图:9-7+2=4(注意E不是10,因为G节点的自环弧线要忽略掉)

(3)流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。

判断节点:

上图:C,E,2个点,复杂度2+1=3

下图:CED,3个点,复杂度3+1=4


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12393084.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存