PITest:JavaLaunchHelper在两者中实现

时间:2016-04-04 11:30:55

标签: mutation-testing pitest

最近我开始使用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

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

任何修复/解决方法?

1 个答案:

答案 0 :(得分: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输出流但是未确定两者中的哪一个。这是一个众所周知的问题,另见this question

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

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

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

a++变为a--。循环可能最终结束,但在此之前你更有可能耗尽内存。

来自documentation

  

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

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

来自FAQ

  

运行突变测试时的超时是由两件事之一引起的

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

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

     

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

     

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

     

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