突变测试 - 以for-each循环为条件的否定?

时间:2016-07-27 07:59:28

标签: java mutation-testing pitest

我们只是在玩变异测试,有一件事我不明白。为什么总是试图应用"否定条件变异"在我的for-each循环中像这样:

for (final Order order : orders)

如果我看一下mutator(http://pitest.org/quickstart/mutators/#NEGATE_CONDITIONALS)的描述,那么它应该只是将!===<等条件变为{{1 }}。所以我真的不明白为什么它在那里使用,为什么它有时会失败,有时候也不会。

有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:4)

这是PIT改变字节码而不是源的结果。

每个循环的字节码看起来像

INVOKEINTERFACE java/util/List.iterator ()Ljava/util/Iterator;
ASTORE 2
L2
ALOAD 2
INVOKEINTERFACE java/util/Iterator.hasNext ()Z
IFEQ L3
ALOAD 2
INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;
<contents of the loop>
GOTO L2
L3

所以基本上在幕后它创建一个迭代器并检查hasNext的值。虽然它是真的,它通过跳转到L2来执行循环。

条件变异是IFEQ L3调用,它检查hasNext的返回码以退出循环。

如果PIT可以检测每个循环生成的条件语句,那将是很好的。我不确定我是否曾经看过这种特殊情况,但一般来说,区分语言特征产生的字节码和直接映射回开发人员编写代码的字节码要么很难也不可能。

更新 - 从1.2.5开始,pitest应该避免改变每个循环的条件。