第四章:Coverage-based testing

本文深入探讨了软件测试中的控制流、数据流和突变分析方法,包括控制流测试的覆盖标准如语句覆盖、分支覆盖和路径覆盖,数据流测试的静态和动态分析,以及突变分析在测试套件有效性评估中的应用。突变分析通过引入程序变异体来检测测试用例的不足。文章强调,覆盖率标准与故障发现能力之间的相关性较低,突变分析提供了一种更有效的评估手段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Control-flow testing

  • 控制流策略根据 控制流图 中的控制信息选择测试输入来执行路径。它们基于图中的控制信息进行路径选择,通常由if语句和while循环中的谓词给出。
  • 覆盖标准有四个:
    在这里插入图片描述

Data-flow testing

  • 数据流策略根据 变量之间的数据流选择输入,以便在程序中执行路径;例如,在定义变量时(如给变量赋值)和在程序中使用该变量之间。
    在这里插入图片描述
  • 与控制流策略一样,test inputs 被选择以覆盖图形(因此也是代码)的测试用例。覆盖准则包括:
    在这里插入图片描述

Mutation analysis

  • 突变分析是一种 衡量测试套件有效性的技术,其副作用是创建并添加测试用例到该测试套件中。该技术基于在程序中引入故障,并评估测试套件是否能够检测到这些故障。如果不能,则说明该测试套件不足以发现故障,需要添加新的测试用例来找出这个故障。
    在这里插入图片描述
    在这里插入图片描述
  • 上述三种技术都是为了选更好的 test input, 而不是 test case (test case 应该还包括预期的 output 以及执行环境);而 expected output 是通过 oracle 技术来实现的

测试输入(Test Input):

  • 测试输入是指在进行软件测试时提供给系统或应用程序的数据。这些数据可以是用户输入的命令、文件、网络请求或任何其他可以被软件处理的信息。测试输入的目的是触发软件的处理流程,以便检测软件是否能正确地处理这些输入,或者是否存在处理输入时的缺陷。
    例如,如果你正在测试一个计算器程序,那么一个测试输入可能是数字“42”和操作符“+”。

测试用例(Test Case):

  • 测试用例是一个更为全面的概念,它不仅包含了测试输入,还包括预期结果和执行条件。测试用例描述了一个测试场景,包括执行步骤、测试输入、预期行为和预期输出的详细信息。测试用例是为了验证特定功能或软件需求而设计的,并且是测试计划的一部分。

Control-flow testing

  • 白盒测试最常见的形式是控制流程测试,其目的是理解程序内部的控制流程。有多种方法可以捕获程序中的控制流程,但迄今为止最常用的方法是使用控制流图(CFG)。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

CFG 注意事项

在这里插入图片描述

  • 首先,请注意我们已将CFG分成了许多基本块。每个基本块都是一系列没有分支的语句,只有一个入口点和一个出口点,并且只有一条通过该块的路径。使用基本块可以更容易地可视化和分析大型CFG。其次,我们已用字母标记了图中的所有节点。通常情况下,由于路径是控制流图中节点的序列,我们将对节点进行标记而不是对边进行标记。

Definitions for control-flow analysis

execution path
  • execution path: 是控制流图中从入口节点开始到出口节点结束的一系列节点。
branch / decision
  • branch / decision: 是程序中控制流可以分岔的点。例如,if-then-else语句和switch语句会导致控制流图中的分支。
condition
  • 条件是在分支内发生的简单原子谓词或简单关系表达式。条件不包含 and(在 C 中为 &&)、or(在 C 中为 ||)和 not(在 C 中为 !)运算符。
feasible path
  • feasible path 是指在输入域中 至少存在一个输入,可以强制程序执行该路径。否则,该路径就是不可行的路径,没有测试用例能够强制程序执行该路径。

coverage-based 标准

  • 覆盖率测试方法 的目标是使用满足一些固定覆盖准则的测试用例来覆盖程序。换句话说,我们根据某些准则选择测试用例,尽可能地执行程序的大部分内容。如果程序中的某个部分没有被任何测试用例执行到,则可能存在未发现的错误。
Statement coverage (or node coverage)
  • 程序的每个语句都应该至少执行一次。
Branch coverage (or decision coverage)
  • 程序中每个分支(或决策)的所有可能替代方案都应该至少执行一次。 对于if语句来说,这意味着该分支必须取值为true和false,即使该分支的结果没有任何操作,例如,在没有else的if语句中,仍然需要执行false情况。
Condition coverage
  • 每个分支中的条件都至少要评估为真和假一次。
    在这里插入图片描述
Decision/Condition coverage
  • 每个分支中的条件都被设计为既能评估为真也能评估为假,而且每个分支都被设计为既能评估为真也能评估为假。即,结合了分支覆盖和条件覆盖。
    在这里插入图片描述
Multiple-condition coverage
  • 在每个分支中,应至少执行一次所有可能的条件结果组合。例如,在分支 if (a and b) 中,其中 a 和 b 都是条件,我们必须执行一组测试,使得 a 和 b 的四种组合分别为真和假。
    在这里插入图片描述
Path coverage
  • 程序的每条执行路径都应该至少被执行一次。

  • 请注意,对于包含循环的图形来说,路径覆盖是不可能的,因为存在无限多个路径。一个典型的解决方法是应用零到多规则 (zero-to-many),在域测试部分进行讨论,该规则指出循环可以执行的最小次数为零,因此这是一个边界条件。同样地,有些循环有上限,请将其视为边界条件。
    在这里插入图片描述

实例 1

在这里插入图片描述
在这里插入图片描述

  • 例如,如果要实现 statement coverage,可以经过 path ABCDEFGF
  • 下面是一组 test input 和对应的 condition 以及 branch 的覆盖情况
    在这里插入图片描述
实例 2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值