使用Java进行突变测试布尔值



我对Java的经验非常少,而且我面临一些问题。

我有一个代码,看起来像下面的那个,目标是杀死它的所有突变

public class MyClass {
protected transient boolean something = false;
public MyClass () {
something = true;
}
boolean isSomething () {
return something;
}
}

我的测试代码看起来像这个

tester = MyClass();
assertTrue(tester.isSomething());

通过在Eclipse上使用pitest运行它,它将生成以下突变(所有突变都与return something语句有关(:

  1. 用0替换1
  2. 删除了对成员变量something的赋值
  3. 将1替换为0
  4. 用-1代替1
  5. 用-1代替1
  6. 用2代替1
  7. 将1替换为0

不幸的是,我无法杀死这4个和5个突变,这两个突变都用-1代替了1。我有办法杀死他们吗?

这里有一些问题。

首先,你希望启用一些实验/研究突变算子,这些算子会产生垃圾突变。如果您坚持使用默认设置,则不会发生这种情况。

在jvm级别,布尔值表示为0/1的整数。只有以下突变才有意义

  • 用0替换1
  • 删除了对成员变量something的赋值

(注意,尽管在这种情况下突变是有意义的,但成员分配的删除在默认情况下是禁用的,因为它可以产生等效的突变体(

您没有提供完整的上下文,因此不清楚重复的1/0替换是重复的还是不同的。

要杀死这些突变体有两种方法。首先删除多余的代码。

public class MyClass {
protected transient boolean something = true;
boolean isSomething () {
return something;
}
}

这在功能上等同于原始代码,但数量较少

其次,你需要测试。

既然你已经保护了something,我假设MyClass有子类?如果没有,那么代码可以进一步减少到

public class MyClass {
boolean isSomething () {
return true;
}
}

你只能写一个测试。

assertThat(new MyClass().isSomething()).isTrue();

如果有子类,那么您需要测试来检查设置something为true,然后断言isSomething返回true,另一个设置为false并断言方法返回false。

相关内容

  • 没有找到相关文章

最新更新