代码覆盖率教程:分支、语句和决策测试

什么是代码覆盖率?

代码覆盖率是描述程序源代码测试程度的指标。它是白盒测试的一种形式,可以找到一组测试用例未涉及的程序区域。它还会创建一些测试用例来增加覆盖率并确定代码覆盖率的量化指标。

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

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

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

  • 它可以帮助您衡量测试实施的效率
  • 它提供了定量测量。
  • 它定义了源代码的测试程度。

代码覆盖方法

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

  • 声明覆盖范围
  • 决策覆盖
  • 分支机构覆盖范围
  • Toggl电子覆盖范围
  • FSM 覆盖范围

声明覆盖范围

声明覆盖范围 是一种白盒测试技术,其中源代码中的所有可执行语句至少执行一次。它用于计算源代码中已执行的语句数。语句覆盖率的主要目的是覆盖源代码中所有可能的路径、行和语句。

语句覆盖率用于根据被测试代码的结构来推导场景。

声明覆盖范围

In 白色 Box 测试与验证,测试人员专注于软件的运行方式。换句话说,测试人员将专注于控制流图或流程图方面的源代码内部运行情况。

通常,在任何软件中,如果我们查看源代码,就会发现有各种各样的元素,如运算符、函数、循环、异常处理程序等。根据程序的输入,某些代码语句可能不会执行。语句覆盖的目标是覆盖代码中所有可能的路径、行和语句。

让我们通过一个例子来理解如何计算语句覆盖率。

计算给定源代码的语句覆盖率的场景。这里我们采用两种不同的场景来检查每种场景的语句覆盖率百分比。

源代码:

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%

声明覆盖范围

但总体而言,所有语句都被两种方案覆盖。因此,我们可以得出结论,总体语句覆盖率为 100%。

声明覆盖范围

声明覆盖范围包括哪些内容?

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

决策覆盖测试

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

在这种覆盖类型中,表达式可能变得复杂,很难实现 100% 覆盖率。这就是为什么使用各种方法来报告此指标的原因。这些方法优先考虑最关键的组合。虽然它与决策覆盖相似,但它对控制流的灵敏度更高。

决策覆盖测试

决策覆盖示例

考虑以下代码-

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

情景1:

a 的值为 2

决策覆盖测试

以黄色突出显示的代码将被执行。此处检查了 If (a>5) 决策的“否”结果。

决策覆盖率 = 50%

情景2:

a 的值为 6

决策覆盖测试

以黄色突出显示的代码将被执行。此处检查了 If (a>5) 决策的“Yes”结果。

决策覆盖率 = 50%

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

分支覆盖测试

分支机构覆盖范围 是一种白盒测试方法,其中测试代码模块(语句或循环)的每个结果。分支覆盖的目的是确保每个分支的每个决策条件至少执行一次。它有助于测量独立代码段的分数并找出没有分支的部分。

例如,如果结果是二元的,则需要测试真和假结果。

计算分支覆盖率的公式:

分支覆盖测试

分支机构覆盖示例

为了了解分支覆盖,我们来考虑一下之前使用过的相同示例

考虑以下代码-

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 TRUE 条件覆盖率为¼ = 25%
A = 3

B = 4

(a>b) FALSE

有限状态机覆盖

有限状态机覆盖率无疑是最复杂的代码覆盖率方法。这是因为它针对设计的行为。在这种覆盖率方法中,您需要查找访问和转换了多少个特定时间的状态。它还检查有限状态机中包含多少个序列。

选择哪种类型的代码覆盖率

这当然是最难回答的。为了选择覆盖方法,测试人员需要检查

  • 被测代码有一个或多个未发现的缺陷
  • 潜在处罚的成本
  • 声誉受损的代价
  • 销售损失成本等等

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

代码覆盖率与功能覆盖率

代码覆盖率 功能覆盖
代码覆盖率可以告诉您源代码在测试台上的执行情况。 功能覆盖率衡量测试台对设计功能的覆盖程度。
永远不要使用设计规范 使用设计规范
由开发人员完成 由测试人员完成

代码覆盖率工具

这里是重要的代码覆盖工具的列表:

工具名称 描述
Cobertura 它是一个开源代码覆盖率工具。它通过检测代码库来测量测试覆盖率,并分析测试套件运行时哪些代码行正在执行,哪些代码行未执行。
三叶草 Clover 还通过仅运行涵盖自上次构建以来修改过的应用程序代码的测试来减少测试时间。
开发合作伙伴 DevPartner 使开发人员能够分析 Java 代码质量和复杂性的代码。
艾玛 EMMA 支持类、方法、行和基本块覆盖、聚合源文件、类和方法级别。
卡利斯蒂克 Kalistick 是一个从不同角度分析代码的第三方应用程序。
CoView 和 CoAnt 编码软件是一种用于度量、模拟对象创建、代码可测试性、路径和分支覆盖等的代码覆盖工具。
靶心 C++ BulseyeCoverage 是一款代码覆盖工具,用于 C++ 和C.
声纳 Sonar 是一个开放的代码覆盖工具,可以帮助您管理代码质量。

使用代码覆盖率的优点和缺点

代码覆盖率优势 代码覆盖率的缺点
有助于评估代码覆盖率的定量指标 即使设计中未实现任何特定功能,代码覆盖率仍报告 100% 覆盖率。
它允许您创建额外的测试用例以增加覆盖率 我们无法确定是否借助代码覆盖率测试了特征的所有可能值
它允许您查找一组测试用例未执行的程序区域 代码覆盖率也不能说明你的逻辑覆盖程度和覆盖程度
如果指定的功能尚未实现,或者未包含在规范中,则基于结构的技术无法发现该问题。

结语

  • 代码覆盖率是描述程序源代码被测试程度的指标
  • 它可以帮助您衡量测试实施的效率
  • 五种代码覆盖率方法是:1.)语句覆盖率 2.)条件覆盖率 3)分支覆盖率 4) Toggle 覆盖范围 5) FSM 覆盖范围
  • 语句覆盖涉及源代码中所有可执行语句至少执行一次
  • 决策覆盖报告每个布尔表达式的真或假结果
  • 在分支覆盖中,代码模块的每个结果都会经过测试
  • 条件将揭示条件语句中的变量或子表达式如何被评估
  • 有限状态机覆盖率无疑是最复杂的代码覆盖率方法
  • 为了选择一种覆盖方法,测试人员需要检查潜在的处罚成本、声誉损失、销售损失等。
  • 代码覆盖率告诉你测试台对源代码的执行情况,而功能覆盖率则衡量设计功能的覆盖情况
  • Cobertura,JTest,Clover,Emma,Kalistick 是一些重要的代码覆盖工具
  • 代码覆盖率允许您创建额外的测试用例来增加覆盖率
  • 代码覆盖率无法帮助您确定我们是否测试了某个特性的所有可能值