code-coverage - Testng、Emma、Cobertura、覆盖率和 JDK 7 导致 ClassFormatError 和VerifyError

标签 code-coverage java-7 cobertura emma jacoco

我已经切换到最新的 JDK 7,并且在使用 emma 覆盖工具处理的字节码上运行 testng 单元测试时遇到问题。我的测试用例都没有正确运行,并且对于大多数测试用例,我都收到了此类错误。

 java.lang.ClassFormatError: Illegal local variable table length 10 in method measurement.meter.AbstractSerialPortMeter.<init>(Lmeasurement/meter/SerialPort;)V at measurement.meter.Elc3133aTest.setUp(Elc3133aTest.java:42)

我在这里找到一篇文章JSR 292 Goodness Fast Code Coverage Tool Less 10k , 也就是说,“JSR 292 引入了新的字节码指令 invokedynamic,而且还引入了几种新的常量池常量。这意味着大多数解析字节码的工具(如 ASM、BCEL、findbugs 或 EMMA)需要更新为 java 7兼容。”

查看了Emma的主页,好像已经很久没有更新了。

有人解决过类似的问题吗?

我也尝试过 Cobertura。它看起来工作得更好一些,但我收到了很多 VerifyError 类型的异常。

java.lang.VerifyError: Expecting a stackmap frame at branch target 85 in method measurement.meter.AbstractSerialPortMeter.close()V at offset 26
at measurement.meter.AbstractSerialPortMeterTest.setUp(AbstractSerialPortMeterTest.java:27)

最佳答案

我在使用 Maven cobertura 插件时遇到了同样的问题。从 cobertura:report 运行时,所有测试均失败。但是当直接从 Surefire 插件运行时,所有测试都成功了。正如你们中的一些人已经说过的,问题是 coberture 字节码检测与 JDK7 不兼容。

你可以在这里看到http://vikashazrati.wordpress.com/2011/10/09/quicktip-verifyerror-with-jdk-7/该异常与“具有 StackMapTable 属性的新类型检查器”相关(请参阅 http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html 中的 -X:+UseSplitVerifier JVM 选项)。

所以我的解决方案是配置surefire-plugin始终使用JVM arg“-XX:-UseSplitVerifier”执行测试。无论有没有cobertura检测,它都可以很好地工作。

我在 Maven 中的可靠配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12</version>
    <configuration>
        <argLine>-XX:-UseSplitVerifier</argLine>
    </configuration>
</plugin>

关于code-coverage - Testng、Emma、Cobertura、覆盖率和 JDK 7 导致 ClassFormatError 和VerifyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7010665/

相关文章:

testing - 什么是代码覆盖率以及如何衡量它?

version-control - 如何限制 Jenkins 中对 Cobertura 覆盖率报告的访问

java - 通过bash脚本在Ubuntu 16.04上安装Java7

jetty - Cobertura 报告在任何地方都具有 100% 的覆盖率

unit-testing - ReactJS:未经测试文件的 Jest 覆盖率报告显示覆盖率 0%

junit - 如何指定 Clover 忽略的代码行?

gis - QGIS 在 Ubuntu Precise 上缺少 libjvm.so

Java 7 在没有安装 JDK 的情况下触发堆转储

java - 如何使用 Cobertura Maven 插件查看 HTML 覆盖率报告?