gpt4 book ai didi

java - 针对现有耳朵运行时,Jacoco 出现 “IllegalStateException: Incompatible execution data for class in…” 异常

转载 作者:行者123 更新时间:2023-11-30 07:05:14 24 4
gpt4 key购买 nike

我正在尝试使用 Arquillian 和 TestNG 测试传统的大型 EAR (app.ear) 应用程序。为了运行测试,我已将可测试的 war 文件 (test.war) 添加到现有的 app.ear 中,并远程部署在 WildFly 10 服务器上。

@Deployment
public static EnterpriseArchive createDeployment(){
return ShrinkWrap.createFromZipFile(EnterpriseArchive.class, new File("../earapp/target/earapp-0.0.1-SNAPSHOT.ear"))
.addAsModule(Testable.archiveToTest(ShrinkWrap.create(WebArchive.class, "test.war")
.addClass(CurrencyConverterTest.class)
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")));
}

我的要求的下一部分是在测试运行后获取代码覆盖率报告。为此,我使用 Jacoco 并通过 Jacoco Maven 插件运行它。

<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.7.201606060606</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
</plugin>

app.ear 已部署,甚至测试运行良好,但在生成报告时,Jacoco 失败并出现异常“IllegalStateException:Jacoco 中类的执行数据不兼容…… ...”

仅包含测试用例的类会出现异常。如果我在 Jacoco Maven 插件中使用排除标记排除该类 (CurrencyConverterTest.class),异常就会消失,但 Jacoco 生成的报告不包含任何数据。我还检查了 jacoco.exec,据我所知它包含有效数据。

由于我无法共享我正在使用的专有代码,因此我在 github 上创建了三个简单的项目来模拟相同的代码。

  • 项目 1 (currencycoverter):该项目有一个无状态 ejb,其远程接口(interface)具有三种方法。
  • 项目 2 ( earapp ):此项目使用项目 1 作为 ejb 模块创建ear 文件。
  • 项目 3 ( eartest ):此项目测试项目 2 生成的耳朵。

对我来说,Jacoco 代码中似乎存在一些错误,但我也可能是错的。请帮帮我。

更新: 构建在 git repo 上共享的项目的步骤

第1步:检查所有三个项目并将其作为eclipse项目导入到eclipse中。

第 2 步:为项目 1(货币转换器)运行 Maven 命令clean inSTLl

第 3 步:为项目 2 (earapp) 运行 Maven 命令clean package。这将在目标目录中创建一个ear文件。

第 4 步:在本地计算机上以独立模式启动 WildFly 10。

第 5 步:为项目 3(eartest)运行 Maven 命令全新安装。这将使用步骤 3 中生成的 Ear 并将其部署在 WildFly 10 应用程序服务器中并运行测试。

最佳答案

不幸的是,您的示例无法构建:

[ERROR] Failed to execute goal on project eartest:
Could not resolve dependencies for project com.sg.eartest:eartest:jar:0.0.1-SNAPSHOT:
Could not find artifact org.jboss.osgi.metadata:jbosgi-metadata:jar:3.0.1.Final in central (https://repo.maven.apache.org/maven2)

如果它位于单个 GitHub 存储库中,使用它也会更简单。

但是:

确保在所有测试模块中使用完全相同版本的 JaCoCo。

并确保被测试的 JVM 正常终止,否则您可能会收到损坏的“jacoco.exec”文件,因为默认情况下它是在 JVM 关闭期间保存的。在 JaCoCo 的早期版本中,此类损坏的文件可能会导致

IllegalStateException: Incompatible execution data for class...

(根据https://github.com/jacoco/jacoco/issues/95#issuecomment-17271597)

JaCoCo 版本 0.7.7 中改进了文件被截断时的错误消息 - https://github.com/jacoco/jacoco/pull/397使用最新发布的版本是一个很好的做法,因为它们带来了错误修复和改进 - http://www.eclemma.org/jacoco/trunk/doc/changes.html

最后 - 似乎您的测试完全位于与被测主代码不同的模块中。 “report” mojo 为当前模块的类创建报告。使用“report-aggregate”来聚合跨模块的覆盖范围 - 其文档可以在 http://www.eclemma.org/jacoco/trunk/doc/report-aggregate-mojo.html 找到。 https://groups.google.com/forum/#!msg/jacoco/8zjkSseaxD4/QOux-Ws-AgAJ中提到了一些例子

关于java - 针对现有耳朵运行时,Jacoco 出现 “IllegalStateException: Incompatible execution data for class in…” 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40259246/

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