gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:04:11 24 4
gpt4 key购买 nike

我们只是在玩弄突变测试,有一件事我不明白。为什么它总是像这样在我的 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 来执行循环。

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

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

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

关于java - 突变测试 - 以 for-each 循环为条件否定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38607129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com