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

Mutation Testing - Negated conditional on a for-each loop?

我们只是在玩弄突变测试,有一件事我不明白。为什么它总是试图在我的 for-each 循环上应用 "Negated Conditional Mutator",就像这样:

for (final Order order : orders)

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

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

这是 PIT 变异字节码而非源代码的结果。

for each 循环的字节码类似于

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 来执行循环。

条件突变是对检查 hasNext 的 return 代码以退出循环的 IFEQ L3 调用。

如果 PIT 能够检测出 for each 循环生成的条件语句就好了。我不确定我是否看过这种特殊情况,但总的来说,区分由语言特性生成的字节码和直接映射回开发人员编写的代码的字节码要么很困难,要么不可能。

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