软件测试中的循环复杂度(示例)

McCabe 的圈复杂度是什么?

软件测试中的循环复杂度 是用于测量软件程序复杂度的测试指标。它是软件程序源代码中独立路径的定量度量。循环复杂度可以通过使用控制流图或针对软件程序中的函数、模块、方法或类来计算。

独立路径定义为至少有一条边在任何其他路径中都未遍历过的路径。

该度量标准由 Thomas J. McCabe 于 1976 年开发,它基于程序的控制流表示。控制流将程序描述为由节点和边组成的图。

在图中,节点表示处理任务,而边表示节点之间的控制流。

McCabe 的圈复杂度

程序的流程图符号

程序的流程图表示法定义了通过边连接的多个节点。以下是 if-else、While、until 等语句的流程图以及流程的正常顺序。

程序的流程图符号

如何计算圈复杂度

数学表示:

从数学上讲,它是通过图形图的独立路径集。程序的代码复杂度可以使用以下公式定义 -

V(G) = E - N + 2

哪里,

E – 边数

N – 节点数

V (G) = P + 1

其中 P = 谓词节点的数量(包含条件的节点)

示例–

i = 0;
n=4; //N-Number of nodes present in the graph

while (i<n-1) do
j = i + 1;

while (j<n) do

if A[i]<A[j] then
swap(A[i], A[j]);

end do;
j=j+1;

end do;

该程序的流程图如下

计算圈复杂度

通过数学计算,

  • V(G) = 9 – 7 + 2 = 4
  • V(G) = 3 + 1 = 4 (条件节点为1,2、3和XNUMX节点)
  • 基集——程序的一组可能执行路径
  • 1,7
  • 1,2,6,1,7
  • 1,2,3,4,5,2,6,1,7
  • 1,2,3,5,2,6,1,7

圈复杂度的性质

以下是圈复杂度的属性:

  1. V(G) 是图中独立路径的最大数量
  2. 电压(G)>=1
  3. 如果 V (G) = 1,则 G 有一条路径
  4. 将复杂度最小化到 10

这个指标对于软件测试有何用处?

基础路径测试是白盒技术之一,它保证在测试期间至少执行一条语句。它检查程序中每条线性独立的路径,这 表示测试用例的数量,相当于程序的圈复杂度。

这个度量之所以有用,是因为循环复杂度(M)的特性——

  1. M 可以是实现分支覆盖的测试用例数量(上限)
  2. M 可以是图中路径的数量。(下限)

考虑这个例子——

If (Condition 1)
Statement 1

Else
Statement 2

If (Condition 2)
Statement 3

Else
Statement 4

该程序的圈复杂度为8-7+2=3。

由于复杂度已计算为 3,因此对于上述示例,完成路径覆盖需要三个测试用例。

应遵循的步骤:

计算圈复杂度和测试用例设计应遵循以下步骤。

第一步 – 使用代码中的节点和边构建图

第一步 – 识别独立路径

第一步 – 循环复杂度计算

第一步 – 测试用例设计

一旦基本集合形成, 测试用例 应写入以执行所有路径。

更多关于 V (G)

如果程序较小,可以手动计算循环复杂度。如果程序非常复杂,则需要使用自动化工具,因为这涉及更多流程图。根据复杂度数字,团队可以得出需要采取的措施。

下表概述了复杂度数v(G)及其对应含义:

复杂度数
1-10 结构化且编写良好的代码

高可测试性

成本和精力更少

10-20 复杂代码

中等可测试性

成本和工作量为中等

20-40 非常复杂的代码

可测试性低

成本和精力很高

> 40 根本无法测试

成本和努力非常高

圈复杂度计算工具:

有许多工具可用于确定应用程序的复杂性。一些复杂性计算工具用于特定技术。复杂性可以通过程序中的决策点数量来确定。决策点是源代码中的 if、for、for-each、while、do、catch、case 语句。

工具示例包括

  • 欧克林特 – C 和相关语言的静态代码分析器
  • 反射器插件 – .NET 程序集的代码度量
  • 指标 – 查找指标 Java 相关申请

圈复杂度的用途:

圈复杂度可以证明在以下方面非常有用

  • 帮助开发人员和测试人员确定独立的路径执行
  • 开发人员可以确保所有路径都至少测试过一次
  • 帮助我们更加专注于未被发现的路径
  • 提高代码覆盖率 软件工程
  • 评估与应用程序或程序相关的风险
  • 在周期早期使用这些指标可以降低项目的风险

结语

圈复杂度是衡量结构化或 白色 Box 测试与验证。它主要用于评估程序的复杂性。如果决策点越多,程序的复杂性就越高。如果程序的复杂性高,则出错的概率就越高,维护和故障排除的时间也会增加。