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 的指标计算速度更快。

  • 循环复杂度还用于衡量最低工作量和最佳集中领域。

  • 它还可以指导测试过程,并且易于应用。

循环复杂度的缺点

  • 循环复杂度是软件程序的控制复杂度的度量,而不是数据复杂度的度量。

  • 嵌套条件结构比未测试的结构更难且更复杂。

  • 对于简单的比较和决策结构,循环复杂度可能会给出误导性的数字。

结论

循环复杂度是一种软件度量技术。它用于结构化或白盒测试。它主要用于评估软件程序的复杂性。如果软件程序具有更多决策点,则软件程序的复杂性会增加。对于复杂度较高的软件程序,随着时间的推移,错误的概率会增加,从而导致维护和故障排除。

更新于: 2021 年 12 月 17 日

4K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告