软件测试中的循环复杂度(示例)
McCabe 的圈复杂度是什么?
软件测试中的循环复杂度 是用于测量软件程序复杂度的测试指标。它是软件程序源代码中独立路径的定量度量。循环复杂度可以通过使用控制流图或针对软件程序中的函数、模块、方法或类来计算。
独立路径定义为至少有一条边在任何其他路径中都未遍历过的路径。
该度量标准由 Thomas J. McCabe 于 1976 年开发,它基于程序的控制流表示。控制流将程序描述为由节点和边组成的图。
在图中,节点表示处理任务,而边表示节点之间的控制流。
程序的流程图符号
程序的流程图表示法定义了通过边连接的多个节点。以下是 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
圈复杂度的性质
以下是圈复杂度的属性:
- V(G) 是图中独立路径的最大数量
- 电压(G)>=1
- 如果 V (G) = 1,则 G 有一条路径
- 将复杂度最小化到 10
这个指标对于软件测试有何用处?
基础路径测试是白盒技术之一,它保证在测试期间至少执行一条语句。它检查程序中每条线性独立的路径,这 表示测试用例的数量,相当于程序的圈复杂度。
这个度量之所以有用,是因为循环复杂度(M)的特性——
- M 可以是实现分支覆盖的测试用例数量(上限)
- 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 语句。
工具示例包括
圈复杂度的用途:
圈复杂度可以证明在以下方面非常有用
- 帮助开发人员和测试人员确定独立的路径执行
- 开发人员可以确保所有路径都至少测试过一次
- 帮助我们更加专注于未被发现的路径
- 提高代码覆盖率 软件工程
- 评估与应用程序或程序相关的风险
- 在周期早期使用这些指标可以降低项目的风险
结语
圈复杂度是衡量结构化或 白色 Box 测试与验证。它主要用于评估程序的复杂性。如果决策点越多,程序的复杂性就越高。如果程序的复杂性高,则出错的概率就越高,维护和故障排除的时间也会增加。


.png)
.png)