Java中的变异测试(使用Jumble)
变异测试是一种白盒测试技术,它改变代码的某些部分以揭示可能的错误。在非常高的层次上,它是用一些已知或可能的错误或与实际代码的差异以小的方式重写源代码的过程,以消除源代码中的冗余。突变测试的目标是评估测试的覆盖率。 Java有很多变异测试工具。
- 杂乱无章
- 坑
- µJava
- 小丑
这篇文章涉及Java中的 Jumble Mutation testing Tool。 Jumble 是一个突变测试工具,可以在字节码级别更改Java代码。它运行一个单元测试用例并应用某些突变。
- Passed Mutations : 不影响最终输出的代码更改
- 失败的突变:更改最终输出的代码更改
分数:它是通过的突变占总突变的百分比。它用于评估我们的测试套件的有效性。
安装
下载 Eclipse IDE 并将 Jumble 安装到 Eclipse。
Java中的简单代码片段
int index = 0;
while(true)
{
index++;
if (index == 10)
break;
}
Java中的变异代码
int index = 0;
while (true)
{
index++;
if (index >= 10)
break;
}
解释:上面的突变代码将通过 Jumble 测试,因为将 == 更改为 >= 不会影响代码的输出。当 index == 10 时执行将停止,并且由于我们将 value 增加 1 并且 index 从 0 开始,因此输出将保持不变。
混乱的例子
下面编写的代码已经在 Eclipse 中使用 Jumble 插件进行了测试。代码检测第一次出现的重复并将该值返回给调用函数。该程序在许多方面存在缺陷,您可以尝试找出。
// Java program to illustrate mutation Testing
// The code detects the first occurrence of a
// duplicate and returns the value to the calling
// function
package testPackage;
import java.util.Arrays;
import java.util.List;
public class SampProg
{
protected int repeatedNumber(final List a)
{
int len = a.size(),i,dup = -1;
int[] arr = new int[len];
for (i=0; i
编写程序后,我们使用Java中的 JUnit 创建测试用例。执行 Jumble Analysis 获得的输出如下所示:
Mutating testPackage.SampProg
Tests: testPackage.SampProgTest
Mutation points = 11, unit test time limit 2.94s
M FAIL: (testPackage.SampProg.java:8): -1 -> 1
M FAIL: (testPackage.SampProg.java:10): 0 -> 1
.M FAIL: (testPackage.SampProg.java:10): negated conditional
M FAIL: (testPackage.SampProg.java:16): 1 -> 0
M FAIL: (testPackage.SampProg.java:18): 1 -> 0
M FAIL: (testPackage.SampProg.java:18): - -> +
M FAIL: (testPackage.SampProg.java:18): negated conditional
M FAIL: (testPackage.SampProg.java:16): += -> -=
M FAIL: (testPackage.SampProg.java:16): negated conditional
.
Jumbling took 7.595s
Score: 18%
解释结果
- 在输出中 M FAIL 的第一行中,-1 更改为 1。在主程序中,如果没有重复项,我们希望该值返回为 -1。但我们得到的值是 1。我们可以通过启用值突变检查来修复突变。
- 接下来,我们可以在第 3 行、第 7 行和第 9 行看到“否定条件”,其中条件已被否定。但是,在这里我们无法修复此程序的错误。
- 突变未能提供正确输出的其他情况是运算符更改为其他运算符时。在这个和许多算法代码中,与运算符更改相关的突变无法修复。然而,突变测试在一些突变中给出了关于测试用例薄弱或源代码中存在错误的简要想法。这个链接给出了由 jumble 执行的突变