突变检测
突变测试是一种软件测试技术,其中源代码的某些语句被更改/突变,以检查测试用例是否能够发现源代码中的错误。突变测试的目标是在健壮性方面确保测试用例的质量,使突变的源代码失败。
在突变程序中所做的更改应该保持在极小的范围内,以免影响程序的总体目标。突变测试也被称为基于错误的测试策略,因为它涉及到在程序中产生错误,它是白盒测试的一种类型,主要用于单元测试。
突变最初是在1971年提出的,但由于涉及的高成本而失去了热情。现在,它又一次选择了STEAM,并被广泛用于Java和XML等语言。
在本教程中,将了解-
- 什么是突变检测?
- 如何进行突变检测?
- 如何创建突变程序?
- 在突变计划中要改变什么?
- 突变检测的类型
- 突变分数:
- 突变检测的优势:
- 突变检测的缺点:
如何进行突变检测?
以下是执行突变测试(mutation analysis) 的步骤:
步骤1:通过创建许多称为突变体的版本,将错误引入到程序的源代码中。每个突变体应该包含单个错误,目标是导致突变体版本失败,这证明了测试用例的有效性。
步骤2:测试用例既应用于原始程序,也应用于突变程序。测试用例应该足够了,并对其进行了调整以检测程序中的故障。
步骤3:比较原始程序和变异程序的结果。
步骤4:如果原始程序和变异程序产生不同的输出,那么该变异程序就会被测试用例杀死。因此,测试用例足以检测原始程序和变异程序之间的更改。
步骤5:如果原始程序和突变程序生成相同的输出,则保持突变的活动状态。在这种情况下,需要创建更有效的测试用例来杀死所有突变体。
如何创建突变程序?
突变只不过是对程序语句进行的单个语法更改。每个变异程序应该与原始程序有一个不同之处。
源码程序 | 突变体程序 |
---|---|
if(x>y) print“Hello” else print “Hi” | If( x<y ) print“Hello” else print “Hi” |
在突变计划中要改变什么?
有几种技术可以用来生成变异程序。我们来看看
操作数替换运算符 | 表达式修改运算符 | 语句修改运算符 |
---|---|---|
将操作数替换为另一个操作数(x替换为y,y替换为x)或替换为常数值。 | 替换程序语句中的运算符或插入新运算符。 | 修改编程语句以创建变异程序。 |
示例: If(x>y) 替换x和y值 If(5>y) 将x替换为常量5 | 示例: If(x==y) 可以将==替换为>=,并将突变程序替换为 If(x>=y) 并在语句中插入++ If(x==++y) |
示例:
删除if-else语句中的else部分 删除整个if-else语句以检查程序的行为 一些样本突变运算符: 转到标签更换 返回语句替换 语句删除 一元运算符插入(像-和++) 逻辑连接器更换 类似的阵列名称替换 删除IF-ELSE语句中的ELSE部分 添加或替换运算符 通过更改数据替换语句 变量的数据修改 修改程序中的数据类型 |
突变测试的自动化:
手动执行突变检测非常耗时且复杂。自动化工具也降低了测试成本。
可用工具列表-
- Stryker
- PIT Testing
突变检测的类型
在软件工程中,突变测试基本上可以分为三种类型-语句突变、决策突变和值突变。
- 语句突变-开发人员剪切并粘贴代码的一部分,其结果可能是删除某些行
- 值突变-修改主要参数的值
- 决策突变-控制语句将被更改
突变分数:
突变分数被定义为被杀死的突变体占突变体总数的百分比。
- 突变分数 = (被杀死的突变体 / 总突变数量) *100
如果得分为100%,则测试用例是足够的突变。实验结果表明,突变测试是一种有效的测试方法,但其主要缺点是生成突变体和针对该突变体程序执行每个测试用例的成本较高。
突变检测的优势:
以下是突变检测的优点:
- 是实现源程序高覆盖率的有力途径。
- 此测试能够全面测试突变程序。
- 突变测试为软件开发人员带来了良好的错误检测水平。
- 此方法可发现源代码中的歧义,并具有检测程序中所有错误的能力。
- 通过获得最可靠、最稳定的系统,从此测试中受益。
突变检测的缺点:
另一方面,以下是突变检测的缺点:
- 突变测试非常昂贵和耗时,因为需要生成许多突变程序。
- 由于这项测试很耗时,因此可以公平地说,如果没有自动化工具,这项测试是无法完成的。
- 每个变异将具有与原始程序相同数量的测试用例。因此,可能需要针对原始测试套件测试大量的突变程序。
- 由于此方法涉及源代码更改,因此完全不适用于黑盒测试。
结论:
是否希望对应用程序进行详尽的测试?答案是突变检测。这是检查测试程序的有效性和准确性以检测系统中的故障或错误的方法。