代码分支、语句、决策、FSM与覆盖率

什么是代码覆盖率?

代码覆盖率是描述程序源代码经过测试的程度的度量。它还创建了一些测试用例来增加覆盖率,并确定代码覆盖率的量化度量。

在大多数情况下,代码覆盖系统收集有关正在运行的程序的信息。它还将其与源代码信息相结合,以生成关于测试套件的代码覆盖率的报告。

在本教程中,将了解-

  • 什么是代码覆盖率?
  • 为什么要使用代码覆盖率?
  • 代码覆盖率方法
  • 语句覆盖范围
  • 决策覆盖面
  • 分支机构覆盖范围
  • 条件覆盖范围
  • 有限状态机覆盖范围
  • 选择哪种代码覆盖率类型
  • 代码覆盖率与功能覆盖率
  • 代码覆盖率工具
  • 使用代码覆盖率的优缺点

为什么要使用代码覆盖率?

以下是使用代码覆盖率的一些主要原因:

  • 可以帮助测量测试实现的效率
  • 提供了一种定量的测量方法。
  • 定义了源代码经过测试的程度。

代码覆盖率方法

以下是主要的代码覆盖率方法

  • 语句覆盖范围
  • 决策覆盖面
  • 分支机构覆盖范围
  • 切换覆盖范围
  • FSM覆盖范围

语句覆盖范围

语句覆盖是一种白盒测试技术,其中源代码中的所有可执行语句至少执行一次。语句覆盖的主要目的是覆盖源代码中所有可能的路径、行和语句。

语句覆盖率用于根据测试代码的结构派生场景。

在白盒测试中,测试人员关注的是软件是如何工作的。换句话说,测试人员将专注于关于控制流图或流程图的源代码的内部工作。

一般来说,在任何软件中,如果我们查看源代码,都会有各种各样的元素,如操作符、函数、循环、异常处理程序等。语句覆盖的目标是覆盖代码中所有可能的路径、行和语句。

让我们通过一个示例来理解这一点,即如何计算语句覆盖率。

计算给定源代码的语句覆盖率的方案。在这里,我们使用两个不同的场景来检查每个场景的语句覆盖率百分比。

源代码:

 Prints (int a, int b)
{
    ------------  Printsum is a function
    int result = a+ b;
    If (result> 0)
        Print ("Positive", result)
    Else
        Print ("Negative", result)
}
-----------   End of the source code
 

场景1:

如果a=3,则b=9

标为黄色的语句是根据方案执行的语句

执行的语句数=5,语句总数=7

对帐单覆盖率:5/7=71%

同样,我们将看到场景2,

场景2:

如果a=-3,b=-9

标为黄色的语句是根据场景执行的语句。

执行的语句数=6

语句总数=7

对帐单覆盖率:6/7=85%

但是总体而言,如果看到,所有语句都包含在2 发送 场景已经考虑过了。因此,我们可以得出结论,总体报表覆盖率为100%。

报表覆盖范围包括哪些内容?

  1. 未使用的语句
  2. 死码
  3. 未使用的分支
  4. 缺少语句

决策覆盖面

决策复盖是一种白盒测试技术,它报告源代码的每个布尔表达式的真或假结果。决策复盖测试的目标是通过检查并确保每个可能决策点的每个分支至少执行一次来覆盖和验证所有可访问的源代码。

在本报道中,表达式有时会变得复杂。它非常类似于决策覆盖,但是它对控制流提供了更好的敏感度。

决策覆盖面示例

考虑以下代码-

 Demo(int a)
{
    If (a> 5)
        a=a*3
    Print (a)
}
 

场景1:

a的值是2

将执行以黄色突出显示的代码。在这里,如果(a>5) 被选中,则该决定的结果是“否”。

决策覆盖率=50%

场景2:

a的值是6

将执行以黄色突出显示的代码。这里,如果勾选(a>5) ,则决定的结果为“是”。

决策覆盖率=50%

测试用例 a的值 输出 决策覆盖面
1 2 2 50%
2 6 18 50%

分支机构覆盖范围

分支复盖是一种白盒测试方法,其中测试代码 module(statement or loop) 的每个结果。它有助于测量独立代码段的一部分,并找出没有分支的部分。

例如,如果结果是二元的,则需要同时测试True和False结果。

分支机构覆盖率的计算公式:

分支机构覆盖范围示例

要了解分支覆盖,让我们考虑前面使用的相同示例

考虑以下代码

 Demo(int a)
{
    If (a> 5)
        a=a*3
        Print (a)
}
 

分支机构覆盖范围也将考虑无条件分支机构

测试用例 a的价值 输出 决策覆盖面 分支机构覆盖范围
1 2 2 50% 33%
2 6 18 50% 67%

分支机构覆盖的优势:

分支机构覆盖测试具有以下优势:

  • 允许验证代码中的所有分支
  • 确保没有分支导致程序运行的任何异常
  • 分支覆盖率方法消除了因语句覆盖率测试而发生的问题
  • 允许查找未使用其他测试方法进行测试的区域
  • 允许找到代码覆盖率的定量度量
  • 分支覆盖忽略布尔表达式内的分支

条件覆盖范围

条件覆盖或表达式覆盖是用于测试和计算条件语句中的变量或子表达式的测试方法。在这篇文章中,只考虑带有逻辑操作数的表达式。

例如,如果表达式包含AND、OR、XOR等布尔运算,则表示全部可能性。

条件覆盖并不能保证完全的决策覆盖。

计算条件覆盖率的公式:

示例:

对于上面的表达式,我们有4种可能的组合

  • TT
  • FF
  • TF
  • FT

考虑以下输入

X=3 Y=4 (x<y) 真的 条件覆盖率为1/4=25%
A=3 B=4 (a>b) 错误

有限状态机覆盖

有限状态机覆盖肯定是最复杂类型的代码覆盖方法。它还检查有限状态机中包含了多少个序列。

选择哪种代码覆盖率类型

为了选择覆盖方法,测试人员需要检查

  • 测试中的代码具有单个或多个未发现的缺陷
  • 潜在的成本
  • 损失的代价

缺陷导致代价高昂的生产故障的可能性越高,需要选择的覆盖级别就越严重。

代码覆盖率与功能覆盖率

代码覆盖率 功能覆盖范围
代码覆盖率告诉,测试台对源代码执行得有多好。 功能覆盖率衡量测试台覆盖设计功能的程度。
切勿使用设计规范 使用设计规范
由开发人员完成 由测试人员完成

代码覆盖率工具

下面是重要的代码覆盖工具列表:

工具名称 描述
Cobertura 它是一个开源的代码覆盖工具。它通过检测代码库来测量测试覆盖率,并在测试套件运行时分析哪些代码行正在执行,哪些代码行没有执行。
Clover Coverer还通过只运行涵盖自上一次构建以来修改过的应用程序代码的测试来减少测试时间。
DevPartner DevPartner使开发人员能够分析Java代码的代码质量和复杂性。
Emma EMMA支持类、方法、行和基本挡路覆盖、聚合源文件、类和方法级别。
Kalistick Kalistic k是一个从不同角度分析代码的第三方应用程序。
CoView和CoAnt Coding Software是一个代码覆盖工具,用于度量、模拟对象创建、代码可测试性、路径和分支覆盖等。
C++ Bullseye BulseyeCoverage是C++和C++的代码覆盖工具。
Sonar Sonar是一个开放的代码覆盖工具,可以帮助管理代码质量。

使用代码覆盖率的优势

  • 能够评估代码覆盖率的量化度量
  • 能够创建额外的测试用例以增加覆盖率
  • 能够查找一组测试用例未执行的程序区域

使用代码覆盖率的缺点

  • 即使在设计中没有实现任何特定功能,代码覆盖率仍然报告100%的覆盖率。
  • 无法确定我们是否在代码覆盖率的帮助下测试了某个功能的所有可能值
  • 代码覆盖率也不能说明在多大程度上以及在多大程度上覆盖了逻辑
  • 如果指定的函数没有实现,或者没有包含在规范中,那么基于结构的技术就找不到这个问题。

总结

  • 代码覆盖率是一种度量,它描述了程序的源代码经过测试的程度
  • 它可以帮助测量测试实现的效率
  • 五种代码覆盖方法为1) 语句覆盖率 2) 条件覆盖 3) 分支覆盖 4) 切换覆盖 5) FSM覆盖
  • 语句覆盖涉及至少执行一次源代码中的所有可执行语句
  • 决策覆盖率报告每个布尔表达式的真或假结果
  • 在分支覆盖率中,测试代码模块的每个结果
  • Conditional将揭示如何计算条件语句中的变量或子表达式
  • 有限状态机覆盖肯定是最复杂类型的代码覆盖方法
  • 为了选择覆盖方法,测试人员需要检查潜在惩罚、声誉损失、销售损失等的成本。
  • 代码覆盖率告诉测试平台对源代码的执行情况,而功能覆盖率则衡量设计的功能被覆盖的程度
  • Cobertura、JTest、Coverer、Emma、Kalistic k是几个重要的代码覆盖工具
  • 代码覆盖率允许创建额外的测试用例以增加覆盖率
  • 代码覆盖率能够确定我们是否测试了某个功能的所有可能值

IT赶路人

专注IT知识分享