文章目录
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 的覆盖情况