McCabe 循环复杂度:使用流程图计算
软件度量
度量提供了软件产品或过程的特征或属性的大小、维度或容量的定量概念或指示。软件度量可以定义为与软件成本、质量、规模和进度相关的软件属性的定量度量。
例如 -
度量 - 错误数量
指标 - 每人发现的错误数量
软件测试中的循环复杂度
在软件测试中,代码段的循环复杂度是一个指标,用于衡量给定软件程序的复杂度。它可以定义为软件产品源代码中独立路径的定量度量。可以通过控制流图或通过软件程序中的函数、模块、方法或类来衡量。
独立路径是指至少有一条边在任何其他路径中都尚未遍历的路径。1976 年,Thomas J. McCabe 开发了循环复杂度。循环复杂度基于软件程序的控制流表示。控制流以图的形式表示软件程序,该图由节点和边组成。
节点表示处理任务,边表示节点之间的控制流。
软件程序的流程图表示法
流程图表示法定义了通过边连接的节点。以下是 if-else、while 语句和正常流程序列的流程图。
如何计算循环复杂度
数学表示 - 循环复杂度是通过图表的独立路径的集合。它通过以下公式表示 -
V(G) = E – N + 2,其中 E = 边数,N = 节点数
或,
V(G) = P + 1,其中 P = 谓词节点数,包含条件
循环复杂度的属性
V(G) 表示通过图表示的最大独立路径数。
V(G) > 1
如果 V(G) = 1,即 V(G) 为单位,则 G 只能有一条路径。
将复杂度降低到 10。
循环复杂度对软件测试有什么用?
基本路径测试是一种在白盒测试中使用的技术,以确保在软件测试期间至少执行一条语句。循环复杂度评估通过程序的所有线性独立路径,即测试用例的数量将等于软件程序的循环复杂度。它由于循环复杂度 (M) 的属性而有用 -
M 是实现分支覆盖所需的测试用例数(称为上限)。
或者,M 可以是通过图的路径数,包括独立路径(称为下限)。
计算循环复杂度和设计测试用例的步骤
从软件代码构建具有节点和边的图。
识别独立路径。
如果 V(G) = 1,即 V(G) 为单位,则 G 只能有一条路径。
设计测试用例。
在形成基本集后,必须编写测试用例以实现每条路径。
V(G) - 如果软件程序很小,则也可以手动计算循环复杂度。如果程序过于复杂,则需要自动化工具,因为它涉及更多流程图。根据复杂度数字,项目团队决定需要实施哪些措施来进行度量。
下表概述了复杂度数字和 V(G) 的相应含义 -
复杂度 | 意义 |
---|---|
1 – 10 | 结构良好、编写良好的代码 高可测试性 成本和工作量较低 |
10 – 20 | 复杂代码 中等可测试性 中等成本和工作量 |
20 – 40 | 过于复杂的代码 低可测试性 高成本和工作量 |
> 40 | 无法测试 非常高的成本和工作量 |
计算循环复杂度的工具
全球市场上有许多工具可用于确定软件产品或应用程序的复杂性。某些工具用于某些技术。复杂度可以通过软件程序中的决策点数量来确定。例如,源代码中的 if、for、for-each、while、do、catch、case 语句。
一些用于计算循环复杂度的工具是 -
OClint
这是一个静态代码分析工具,用于提高软件产品的质量,并通过检查 C、C++、Objective-C 代码并找出可能的问题(如 -)来减少缺陷:
可能的错误 - if、else、try、catch、finally 语句
未使用的代码 - 这包括未使用的局部变量和参数。
复杂的代码 - 这包括非常高的循环复杂度、NPath 复杂度和非常高的 NCSS。
冗余代码 - 这包括冗余的 if 语句、无用的括号等。
代码异味 - 这包括长方法和长参数列表。
不良实践 - 这包括反向逻辑和参数赋值。
使用 OClint,我们可以使用高级功能自动化检查过程 -
依赖于软件源代码的抽象语法树以获得更好的准确性和效率。减少误报以防止有用的结果淹没在其中。
它允许在运行时甚至动态加载规则到系统中。
它提供敏捷且可扩展的配置,以确保用户可以自定义工具的行为。
它的命令行调用支持持续集成 (CI) 和软件代码的持续检查,以便尽早解决技术债务,从而降低维护成本。
GTMetrix
此工具用于分析页面的加载速度及其性能。它为我们的页面和 Pagespeed 以及 WiSlow 提供分数。它是一个开源工具,用于获取有关站点性能的详细报告。它还提供有关改进网页分数的建议。它还有助于我们从 WordPress 运行分析。
它还有助于我们安排每日、每周或每月的报告。它还会在 WordPress 管理员处通知我们网站的状态。首先,我们需要创建一个 GTMetrix 帐户。该帐户在有限的时间内和每天一定数量的请求内是免费的。
Reflector Add In
此工具用于 .NET 程序集的代码度量。
循环复杂度的使用
它还可以指导测试过程,并且易于应用。
它还有助于开发人员向客户保证所有路径都已彻底测试。
它有助于更多地强调未覆盖的路径。
它有助于更多地强调未覆盖的路径。
循环复杂度指标有助于提高代码覆盖率。
它有助于评估应用程序或软件程序中的风险。
如果尽早使用,指标有助于降低程序的更多风险。
循环复杂度的优点
循环复杂度可用作质量指标。
它提供了各种设计的相对复杂性。
它比 Halstead 的指标计算速度更快。
循环复杂度还用于衡量最低工作量和最佳集中领域。
它还可以指导测试过程,并且易于应用。
循环复杂度的缺点
循环复杂度是软件程序的控制复杂度的度量,而不是数据复杂度的度量。
嵌套条件结构比未测试的结构更难且更复杂。
对于简单的比较和决策结构,循环复杂度可能会给出误导性的数字。
结论
循环复杂度是一种软件度量技术。它用于结构化或白盒测试。它主要用于评估软件程序的复杂性。如果软件程序具有更多决策点,则软件程序的复杂性会增加。对于复杂度较高的软件程序,随着时间的推移,错误的概率会增加,从而导致维护和故障排除。