McCabe圈复杂度:用流图计算(实例)

要了解圈复杂性,我们首先要了解-

什么是软件度量?

测量只不过是对产品/过程的属性的大小/尺寸/容量的定量指示。软件度量被定义为软件系统在成本、质量、规模和进度方面所具有的属性的度量。

示例:

Measure - No. of Errors
Metrics - No. of Errors found per person

在本教程中,将了解-

  • 什么是软件度量?
  • 什么是圈复杂度?
  • 程序的流程图表示法
  • 如何计算圈复杂度
  • 圈复杂度的性质
  • 此度量对软件测试有何用处?
  • 关于V(G)的更多信息
  • 圈复杂度计算工具
  • 圈复杂度的用法

软件测试中的圈复杂度

软件测试中的圈复杂度是用于度量软件程序复杂性的测试度量。圈复杂度可以通过使用控制流图或相对于软件程序中的函数、模块、方法或类来计算。

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

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

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

程序的流程图表示法:

程序的流程图表示法定义了几个通过边连接的节点。下面是If-Else、While、Until和Normal Sequence等语句的流程图。

Cyclomatic Complexity flow graph
Cyclomatic Complexity flow graph

如何计算圈复杂度

数学表示法:

从数学上讲,它是通过图表的一组独立路径。可以使用公式来定义程序的代码复杂性-

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;
i=i+1;
end do;
 

此程序的流程图将为

Cyclomatic Complexity flow graph for this Program
Cyclomatic Complexity flow graph for this Program

从数学上计算,

  • 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语句。

工具的示例有

  • 静态C语言及相关语言代码分析器
  • .NET程序集的反射器添加代码内度量
  • GMetrics-在Java相关应用程序中查找指标

圈复杂度的用法:

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

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

结论:

圈复杂度是用于结构化或白盒测试的软件度量。它主要用来评估一个程序的复杂性,如果判定程序的复杂度数高,那么错误的概率就会随着维护和故障排除时间的增加而增加。

IT赶路人

专注IT知识分享