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

什么是 McCabe 圈复杂度?

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

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

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

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

McCabe’s Cyclomatic Complexity

程序的流图表示法

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

Flow graph notation for a program

如何计算圈复杂度

数学表示

在数学上,它是图示中一组独立的路径。程序代码复杂度可以使用以下公式定义:

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;

该程序的流图将是

Calculate Cyclomatic Complexity

数学计算,

  • 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

圈复杂度的属性

以下是圈复杂度的属性

  1. V (G) 是图中独立路径的最大数量
  2. V (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,因此需要三个测试用例才能完成上述示例的路径覆盖。

要遵循的步骤

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

步骤 1 – 根据代码构建具有节点和边的图

步骤 2 – 识别独立路径

步骤 3 – 圈复杂度计算

步骤 4 – 测试用例设计

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

更多关于 V (G)

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

下表概述了复杂度数值和相应的 v (G) 含义

复杂度数值 含义
1-10 结构良好、编写规范的代码

高可测试性

成本和精力较低

10-20 复杂代码

中等可测试性

成本和精力中等

20-40 非常复杂的代码

低可测试性

成本和精力高

>40 完全不可测试

非常高的成本和精力

圈复杂度计算工具

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

工具示例包括

  • OCLint – 适用于 C 及相关语言的静态代码分析器
  • Reflector Add In – .NET 程序集的代码度量
  • GMetrics – 在 Java 相关应用程序中查找度量

圈复杂度的用途

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

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

结论

圈复杂度是用于结构化或白盒测试的有用软件度量。它主要用于评估程序的复杂性。如果决策点越多,程序的复杂性就越大。如果程序的复杂性数值很高,那么出错的可能性就高,并且维护和故障排除的时间也会增加。