软件测试中的圈复杂度(示例)
什么是 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 号节点)
- 基本集 – 程序可能执行路径的集合
- 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) 是图中独立路径的最大数量
- V (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,因此需要三个测试用例才能完成上述示例的路径覆盖。
要遵循的步骤
应遵循以下步骤来计算圈复杂度和设计测试用例。
步骤 1 – 根据代码构建具有节点和边的图
步骤 2 – 识别独立路径
步骤 3 – 圈复杂度计算
步骤 4 – 测试用例设计
一旦形成基本集,应编写测试用例以执行所有路径。
更多关于 V (G)
如果程序很小,可以手动计算圈复杂度。如果程序非常复杂,则需要使用自动化工具,因为这涉及更多的流图。根据复杂度数值,团队可以对需要采取的措施得出结论。
下表概述了复杂度数值和相应的 v (G) 含义
复杂度数值 | 含义 |
---|---|
1-10 | 结构良好、编写规范的代码
高可测试性 成本和精力较低 |
10-20 | 复杂代码
中等可测试性 成本和精力中等 |
20-40 | 非常复杂的代码
低可测试性 成本和精力高 |
>40 | 完全不可测试
非常高的成本和精力 |
圈复杂度计算工具
有许多工具可用于确定应用程序的复杂性。一些复杂性计算工具用于特定技术。复杂性可以通过程序中决策点的数量来找到。决策点是源代码中的 if、for、for-each、while、do、catch、case 语句。
工具示例包括
圈复杂度的用途
圈复杂度在以下方面非常有用
- 帮助开发人员和测试人员确定独立的路径执行
- 开发人员可以确保所有路径都至少测试过一次
- 帮助我们更多地关注未覆盖的路径
- 提高软件工程中的代码覆盖率
- 评估与应用程序或程序相关的风险
- 在开发周期的早期使用这些指标可以降低程序更多的风险
结论
圈复杂度是用于结构化或白盒测试的有用软件度量。它主要用于评估程序的复杂性。如果决策点越多,程序的复杂性就越大。如果程序的复杂性数值很高,那么出错的可能性就高,并且维护和故障排除的时间也会增加。