1

最近我开始使用 PITest 进行突变测试。当我运行命令时使用 maven 构建我的项目后,我mvn org.pitest:pitest-maven:mutationCoverage多次收到此错误:

-stderr  : objc[2787]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be ustderr  : sed. Which one is undefined.

有时错误之后是

PIT >> WARNING : Slave exited abnormally due to MEMORY_ERROR

或者PIT >> WARNING : Slave exited abnormally due to TIMED_OUT

我使用 OsX 版本 10.10.4 和 Java 8 (jdk1.8.0_74)。

对此有任何修复/解决方法吗?

4

1 回答 1

0

不用担心这个;

-stderr : objc[2787]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be ustderr : sed. Which one is undefined.

这只是为了提供有关 JavaLauncherHelper 有两种实现的信息,并且消息告诉您两者之一将使用 std-err 输出流,但不确定两者中的哪一个。这是一个已知问题,另请参阅此问题

另外两个是 PIT 正在做的事情的结果:它正在修改字节码,这可能不仅会影响操作的输出(通过测试检测到),而且实际上会影响运行时行为。例如,如果循环的边界以这种方式改变,则循环将无限运行。Pit 能够检测到这一点并打印出错误。由内存错误或超时错误检测到的突变可被视为“已终止”。但是你应该单独检查每一个,因为它们也可能是误报。

PIT >> WARNING : Slave exited abnormally due to MEMORY_ERROR 意味着修改后的代码会产生更多或更大的对象,因此分叉的 jvm 内存不足。想象一下这样的循环

while(a < b){
   list.add(new Object());
   a++;
}

并且a++被更改为a--. 循环可能最终会结束,但在此之前您更有可能内存不足。

文档

内存错误可能是由于突变增加了系统使用的内存量,或者可能是在存在突变的情况下重复运行测试所需的额外内存开销的结果。如果您看到大量内存错误,请考虑为测试配置更多堆和 permgen 空间。

超时问题与此类似,原因可能是您运行无限循环或系统认为您运行无限循环,即当系统太慢而无法计算更改的代码时。如果您遇到很多超时,您应该考虑增加超时值。但要小心,因为这可能会影响整体执行时间。

来自常见问题

运行突变测试时的超时是由以下两种情况之一引起的

  • 1 导致无限循环的突变
  • 2 PIT 认为发生了无限循环但错误

为了检测无限循环,PIT 测量每个测试的正常执行时间,而不存在任何突变。当测试在存在突变的情况下运行时,PIT 检查测试是否运行时间不超过正常时间 * x + y

不幸的是,现实世界比这更复杂。测试时间可能会因测试运行的顺序而异。类中的第一个测试的执行时间可能比其他测试长得多,因为 JVM 需要加载该测试所需的类。这在使用 XML 绑定框架(如 jaxb)的代码中尤其明显,其中类加载可能需要几秒钟。

当 PIT 针对突变运行测试时,测试的顺序会有所不同。以前需要几毫秒的测试现在可能需要几秒钟,因为它们现在承担了类加载的开销。因此,PIT 可能会错误地将突变标记为导致无限循环。

可能会在 PIT 的未来版本中开发此问题的修复程序。同时,如果您遇到大量超时,请尝试使用–timeoutConst(maven 中的timeoutConstant)将上述等式中的y 增加到一个较大的值。

于 2016-05-03T06:58:24.363 回答