【问题标题】:Mutation Testing - Negated conditional on a for-each loop?突变测试 - 在 for-each 循环上否定条件?
【发布时间】:2016-12-01 02:52:46
【问题描述】:

我们只是在玩一些突变测试,但有一件事我不明白。为什么它总是试图在我的 for-each 循环上应用“否定条件修改器”:

for (final Order order : orders)

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

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

【问题讨论】:

  • 这取决于orders 是一个数组还是一个可迭代对象?在后一种情况下,没有可取反的二元运算符。
  • 订单是一个列表

标签: java mutation-testing pitest


【解决方案1】:

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

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

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

更新 - 自 1.2.5 起,pitest 应避免更改每个循环的条件。

【讨论】:

  • 在这里也谢谢您。 :)
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 2012-01-19
  • 2015-12-18
  • 1970-01-01
  • 2017-08-04
  • 2012-10-11
相关资源
最近更新 更多