Java 突变测试-每个循环都有一个否定条件?
我们只是在玩弄突变测试,有一件事我不明白。为什么它总是试图在我的for-each循环上应用“否定条件变数”,就像这样:Java 突变测试-每个循环都有一个否定条件?,java,mutation-testing,pitest,Java,Mutation Testing,Pitest,我们只是在玩弄突变测试,有一件事我不明白。为什么它总是试图在我的for-each循环上应用“否定条件变数”,就像这样: for (final Order order : orders) 如果我看一下mutator()的描述,那么它应该只是对条件进行变异,比如=到==或=。所以我真的不明白为什么在那里使用它,为什么它有时失败,有时不成功 有人能给我解释一下吗?这是比特变异字节码的结果,而不是源代码 for-each循环的字节码如下所示 INVOKEINTERFACE java/util/List
for (final Order order : orders)
如果我看一下mutator()的描述,那么它应该只是对条件进行变异,比如=代码>到<代码>==
或<代码>=。所以我真的不明白为什么在那里使用它,为什么它有时失败,有时不成功
有人能给我解释一下吗?这是比特变异字节码的结果,而不是源代码 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
INVOKEINTERFACE java/util/List.iterator()Ljava/util/iterator;
阿斯托尔2号
L2
阿洛德2号
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFEQ L3
阿洛德2号
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
转到L2
L3
因此,基本上,它在幕后创建一个迭代器并检查hasNext的值。虽然这是真的,但它通过跳转到L2来执行循环
条件变异是对IFEQ L3调用的,该调用检查hasNext的返回码以退出循环
如果PIT能够检测由for each循环生成的条件语句,那就太好了。我不确定我是否看过这种特殊情况,但一般来说,区分由语言特性产生的字节码和直接映射到开发人员编写的代码的字节码是困难的或不可能的
更新-从1.2.5开始,pitest应避免对每个循环的条件in进行变异。这是否取决于
顺序
是数组还是iterable?在后一种情况下,没有可求反的二进制运算符。orders是一个列表,这里也谢谢。:)