什么是变异测试?(示例)

什么是变异测试?

变异测试是一种软件测试类型,它通过更改/变异源代码中的某些语句来检查测试用例是否能够发现源代码中的错误。变异测试的目标是确保测试用例的健壮性质量,使其能够使变异后的源代码失败。

对变异程序所做的更改应保持极小,以免影响程序的整体目标。变异测试也称为基于故障的测试策略,因为它涉及在程序中创建故障,它是一种主要用于单元测试白盒测试类型。

变异测试最初于1971年提出,但由于成本高昂而失宠。现在,它再次受到重视,并广泛用于Java和XML等语言。

如何执行变异测试?

Execute Mutation Testing

以下是执行变异测试(变异分析)的步骤:

步骤1:通过创建许多称为变异体的版本,将故障引入程序的源代码。每个变异体应包含一个单一故障,目标是导致变异版本失败,这表明测试用例的有效性。

步骤2:将测试用例应用于原始程序和变异程序。测试用例应足够,并进行调整以检测程序中的故障。

步骤3:比较原始程序和变异程序的结果。

步骤4:如果原始程序和变异程序生成不同的输出,则该变异体被测试用例“杀死”。因此,测试用例足以检测原始程序和变异程序之间的变化。

步骤5:如果原始程序和变异程序生成相同的输出,则变异体“存活”。在这种情况下,需要创建更有效的测试用例来“杀死”所有变异体。

如何创建变异程序?

Create Mutant Programs

变异不过是对程序语句进行的一次语法更改。每个变异程序应与原始程序相差一次变异。

原始程序 变异程序
如果 (x>y)

打印 “Hello”

否则

打印 “Hi”

如果(x<y)

打印 “Hello”

否则

打印 “Hi”

在变异程序中更改什么?

有几种技术可以用来生成变异程序。让我们来看看它们。

操作数替换运算符 表达式修改运算符 语句修改运算符
将操作数替换为另一个操作数(x 替换为 y 或 y 替换为 x)或常量值。 在程序语句中替换运算符或插入新运算符。 修改程序语句以创建变异程序。
示例-

如果 (x>y) 替换 x 和 y 的值

如果 (5>y) 将 x 替换为常量 5

示例-

如果 (x==y)

我们可以将 == 替换为 >=,得到变异程序为

如果 (x>=y) 并在语句中插入 ++

如果 (x==++y)

示例-

删除 if-else 语句中的 else 部分

删除整个 if-else 语句以检查程序的行为

一些示例变异运算符

  • GOTO 标签替换
  • 返回语句替换
  • 语句删除
  • 一元运算符插入(如 – 和 ++)
  • 逻辑连接符替换
  • 可比较数组名称替换
  • 删除 if-else 语句中的 else 部分
  • 添加或替换运算符
  • 通过更改数据来替换语句
  • 变量的数据修改
  • 程序中数据类型的修改

变异测试的自动化

变异测试手动执行极其耗时且复杂。为了加快此过程,建议使用自动化工具。自动化工具还能降低测试成本。

可用工具列表-

变异测试的类型

软件工程中,变异测试可以从根本上分为 3 种类型——语句变异、决策变异和值变异。

  1. 语句变异 – 开发人员剪切并粘贴部分代码,结果可能是删除某些行
  2. 值变异– 更改主要参数的值
  3. 决策变异– 控制语句将被更改

变异分数

变异分数定义为被“杀死”的变异体百分比与变异体总数的比值。

  • 变异分数 = (被“杀死”的变异体 / 变异体总数) * 100

Mutation Score

如果变异分数达到 100%,则测试用例被认为是充分的。实验结果表明,变异测试是衡量测试用例充分性的有效方法。但是,主要缺点是生成变异体并将每个测试用例针对该变异程序执行的成本很高。

变异测试的优点

以下是变异测试的优点

  • 这是一种实现源代码高覆盖率的强大方法。
  • 这种测试能够全面测试变异程序。
  • 变异测试为软件开发人员带来了良好的错误检测水平。
  • 这种方法揭示了源代码中的歧义,并能够检测程序中的所有故障。
  • 客户通过这种测试受益,获得了最可靠和稳定的系统。

变异测试的缺点

另一方面,变异测试的缺点如下

  • 变异测试极其昂贵且耗时,因为需要生成许多变异程序。
  • 由于耗时,可以肯定地说,这种测试不能在没有自动化工具的情况下完成。
  • 每个变异都将具有与原始程序相同数量的测试用例。因此,可能需要针对原始测试套件测试大量的变异程序。
  • 由于此方法涉及源代码更改,因此根本不适用于黑盒测试

结论

您想对您的应用程序进行详尽的测试吗?答案是变异测试。它是测试程序最全面的技术。这种方法检查测试程序检测系统中故障或错误的有效性和准确性。