McCabe度量法

简介: McCabe度量法

概论:


McCabe度量法是由 托马斯·麦克凯 提出的一种基于程序控制流的复杂性度量方法。又称环路度量,循环复杂度(Cyclomatic complexity), 也称为条件复杂度或圈复杂度,是一种软件度量。它认为程序的复杂性很大程度上取决于程序图的复杂性。单一的顺序结构最为简单,循环和选择所构成的环路越多,程序就越复杂。

McCabe度量法以图论为工具,先画出程序图,然后用该图的环路数作为程序复杂性的度量值。程序图是退化的程序流程图。也就是说,把程序流程图的每一个处理符号都退化成一个结点,原来连接不同处理符号的流线变成连接不同结点的有向弧,这样得到的有向图就叫做程序图。

根据图论,在一个强连通的有向图G中,环的个数V(G)由以下公式给出:

微信截图_20230926161148.png

其中,V(G)是有向图G中环路数,m是图G中弧数,n是图G中结点数,p是图G中强连通分量个数。在一个程序中,从程序图的入口点总能到达图中任何一个结点,因此,程序总是连通的,但不是强连通的。为了使图成为强连通图,从图的出口点到入口点加一条用虚线表示的有向边,使图成为强连通图。这样就可以使用上式计算环路复杂性了。


有的也有用E来代表图G中弧数,即

微信截图_20230926161159.png

例题:


例1


采用McCabe度量法计算下图所示程序的环路复杂性为( )

微信截图_20230926161239.png

微信截图_20230926161252.png

例2


下图用 白盒测试 方法进行测试,图中有( )条路径。采用McCabe度量计算该程序图的环路复杂性为( )

微信截图_20230926161324.png

问题1 选项 A.3   B.4   C.5   D.6  

问题2 选项 A.3   B.4   C.5   D.6  

解:

将所有结点标注序号,根据图示,可以找到不同的路径共4条:

1-2-3-11;

1-2-3-4-5-6-10-11;

1-2-3-4-5-7-9-10-11;

1-2-3-4-5-7-8-9-10-11。

第一空选择B选项。

微信截图_20230926161340.png

微信截图_20230926161413.png

例3


对下图所示的程序流程图进行判定 覆盖测试,则至少需要( )个测试用例。采用 McCabe度量法计算其环路复杂度为( )。

微信截图_20230926161437.png

问题1选项 A.2   B.3   C.4   D.5  

问题2选项 A.2   B.3   C.4   D.5  


解:

判定覆盖是设计足够多的测试用例,使得程序中的每一个判断至少获得一次“真”和一次“假”,即使得程序流程图中的每一个真假分支至少被执行一次。根据题意,只需2个测试用例即可;

微信截图_20230926161450.png

例4


对下图所示流程图采用白盒测试方法进行测试,若要满足路径覆盖,则至少需要( )个测试用例。采用McCabe度量法计算该程序的环路复杂性为( )

微信截图_20230926161527.png

问题1选项 A.3  B.4  C.6  D.8


问题2选项 A.1  B.2  C.3  D.4


解:

问题1考查白盒测试路径覆盖:覆盖所有可能的路径。

根据流程图,若要覆盖所有可能路径,对于a的取值需要a=0,a<0,a>0三种用例,而对于i的取值需要i>0和i<=0两种用例,排列组合,共需要6组用测才能覆盖所有可能的路径。

微信截图_20230926161543.png

例5


采用McCabe度量法计算下列程序图的环路复杂性为( )

微信截图_20230926161618.png

问题1选项

A.2  B.3  C.4  D.5


解:

McCabe度量法先画出程序图,然后采用公式V(G)=m-n+2计算环路复杂度,其中m是有向弧的数量,n是结点的数量。
10-8+2=4。

例6


对以下的程序伪代码(用缩进表示程序块)进行路径覆盖测试,至少需要( )个测试用例。采用McCabe度量法计算其环路复杂度为( )。

微信截图_20230926161706.png

问题1选项

A.2  B.4  C.6  D.8


问题2选项 A.2  B.3  C.4  D.5


对于本题,用例(x,y,z)分别为(1,1,0)(1,-1,0)(-1,0,1)(-1,0,-1),这4个测试用例可以走完所有可能路径。因为在伪代码中,我们可以看到,当x>0时,只需要对Y分别取大于0和不大于0的值即可,z不参与比较;当x不大于0时,只需要对z分别取大于0和不大于0的值即可,y不参与比较,只需要4个用例即可。


对于第二空,转换为结点图如下:

微信截图_20230926161721.png

微信截图_20230926161801.png

例7


下图所示的程序流程图中有(  )条不同的简单路径。采用McCabe度量法计算该程序图的环路复杂性为(  )

微信截图_20230926161814.png

问题1选项

A.3  B.4  C.5  D.6


问题2选项

A.3  B.4  C.5  D.6


解:

环形复杂度定量度量程序的逻辑复杂度。描绘程序控制流的流图之后,可以用下述3种方法中的任何一种来计算环形复杂度。
(1)流图中的区域数等于环形复杂度。
(2)流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。
(3)流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。
这种环路度量法,计算的思路是这样的:它是考虑控制的复杂程度,即条件选择的分支繁杂程度。
图中有3次简单的判断。故3条简单路径,形成3块环形区域,区域复杂度为3

例8


软件的复杂性主要体现在程序的复杂性。(  )是度量软件复杂性的一个主要参数。若采用McCabe度量法计算环路复杂性,则对于下图所示的程序图,其环路复杂度为(  )。

微信截图_20230926161926.png

问题1选项

A.代码行数  B.常量的数量  C.变量的数量  D.调用的库函数的数量


问题2选项

A.2  B.3  C.4  D.5


解:

代码行数度量法以程序的总代码行数作为程序复杂性的度量值。

微信截图_20230926161941.png

微信截图_20230926161949.png

目录
相关文章
|
安全 C++
Spdlog日志库的使用,支持文件名/行号/函数名的log打印输出
Spdlog日志库的使用,支持文件名/行号/函数名的log打印输出
6849 0
|
10月前
|
设计模式 算法 Java
软考中级软件设计师专项-设计模式篇
备战软考中级软件设计师?本文聚焦高分设计模式模块,详解23种模式的核心意图与场景,结合UML图、Java代码实例及历年真题,覆盖创建型、结构型、行为型三大类,助你打通理论到实战。
1140 1
软考中级软件设计师专项-设计模式篇
|
测试技术
软件复杂度量化:McCabe度量法及其环路复杂度的计算方法
McCabe度量法(McCabe&#39;s Cyclomatic Complexity)是一种经典的方法,用于度量软件程序的复杂度。通过计算程序中独立路径的数量,帮助开发人员评估代码的维护难度和测试覆盖率。本文详细介绍了McCabe度量法的原理、计算方法及其在实际应用中的作用。
3466 0
|
12月前
|
存储 设计模式 IDE
从基础到高级的 Java 学习资料全面汇总
本文汇总了Java学习的全面资料,涵盖Java基础、面向对象编程、核心知识、高级特性及常用框架,如Spring和Hibernate。内容包括技术详解、代码实例及学习资源推荐,助力从入门到精通Java编程,适合各阶段学习者参考。
815 0
|
监控 安全 测试技术
选择Postman免费版还是付费版,进行 API 测试呢?
深入了解 Postman 免费版和付费版的细节,看看哪一个更适合您的 API 需求。
|
算法 编译器 C++
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
|
存储 自然语言处理 算法
【北京大学 软件工程】四、结构化分析方法
结构化分析方法是一种系统化的软件开发方法学,旨在通过使用问题域术语建立系统的功能模型,以明确“系统必须做什么”。该方法包括结构化分析、设计和程序设计三个主要部分。其核心工具是数据流图(DFD),用于表达系统功能模型,并结合数据字典定义数据流和数据存储。此外,还使用加工小说明(如判定表或判定树)描述加工逻辑。 结构化分析过程遵循自顶向下、逐步求精的原则,首先建立系统环境图确定边界,然后通过分解加工、分派数据流和引入文件来细化模型。整个过程中需确保模型平衡和信息组织的复杂性控制。最终输出为需求规格说明书(SRS),确保需求的正确性、无二义性、完整性和可验证性等特性。
1863 1
|
算法
海明码详解
本文详细介绍了海明码(Hamming Code)的概念、原理和应用,包括信息位与校验位的关系、校验位的计算方法、错误检测与纠正过程,并通过实例展示了如何使用海明码进行编码,突出了海明码在提高数据传输可靠性方面的重要性。
2601 0
海明码详解
|
监控 安全 项目管理
『软件工程3』你应该知道的三种原型实现模型:抛弃式、演化式、增量式
该文章详细解释了三种原型实现模型——抛弃式、演化式、增量式模型的特点、流程、优缺点及适用场景。
『软件工程3』你应该知道的三种原型实现模型:抛弃式、演化式、增量式
|
Java
Java PDF模板生成PDF
Java PDF模板生成PDF
471 1