当前位置: 首页 > 知识库问答 >
问题:

"IllegalStateExctive:在...中类的不兼容执行数据."Jacoco在为现有耳朵运行时例外

江敏学
2023-03-14

我正在使用一个大的应用程序来测试。为了运行测试,我将可测试的war文件(test.war)添加到现有的应用程序中。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>

应用程序。ear得到部署,即使测试运行正常,但在生成报告时,Jacoco失败,出现异常“IllegalStateException:Jacoco中类的不兼容执行数据……”

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

因为我不能共享我正在使用的专有代码,所以我在github上创建了三个简单的项目来模拟相同的项目。

  • 项目1(CurrencyConverter):这个项目有一个无状态ejb,远程接口有三种方法

对我来说,看起来Jacoco代码中有一些bug,但我也可能是错的。请帮帮我。

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

步骤1:签出所有三个项目,并作为eclipse项目导入eclipse。

第2步:运行maven命令清洁instll为项目1

第三步:为项目2(earapp)运行maven命令清理包。这将在目标目录中创建一个耳文件。

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

步骤5:为项目3运行maven命令clean install(eartest)。这将使用步骤3中生成的ear,并将其部署到WildFly 10应用服务器中,然后运行测试

共有1个答案

竺承望
2023-03-14

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

[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

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

 类似资料:
  • 我正在使用Jacoco使用ANT查找单元测试的代码覆盖率,但报告没有生成,我得到了这个错误序列: 我已经阅读了这些答案,但似乎没有一个可以帮助我解决问题。 Jacoco代码覆盖报告生成器显示错误:“捆绑包‘代码覆盖报告’中的类与执行数据不匹配” jacoco:对于报告生成,必须使用与运行时相同的类文件 我在Eclipse上编译了所有类,并使用ANT构建工具对这些类执行代码覆盖。由于一些依赖关系,我

  • 我们有一个Maven多模块项目,由父级(HelloWorld)和不同的子级(HelloWorldServices和HelloWorldPresentation)组成,并使用Jenkins进行构建。 运行成功测试后的错误是

  • 我有一个python脚本,它计算给定文件的字数,并在执行后将输出保存到“result.txt”文件中。我希望docker容器在容器启动时执行此操作,并在控制台上显示输出。下面是我的docker文件和python文件 我正在映射一个本地目录,它有两个文本文件IF. txt和Limerick1.txt从主机到容器内的目录/home/data,容器内的python代码读取文件并将输出保存到result.

  • 我正在尝试在PhantomJS中运行Jasmine。经过很多努力,我可以归结为: 代码一直执行到it(),但回调永远不会执行:| [编辑]我正在尝试将phantom与jasmine一起用于端到端测试。我已经有了一个应用程序服务器,并且我正在使用Karma进行单元测试。所以我认为testRunner.html不会有帮助。PhantomJS应该登录我的应用程序并做一些事情,我会用Jasmine进行测试

  • 我正在使用 Maven 3.8.3、JUnit 5.4.2 和 Jacoco 0.8.2,并且我正在尝试创建测试覆盖率报告。 我有一个只有单元测试的项目,但我无法运行报告,我反复收到错误:由于运行时缺少执行数据文件而跳过JaCoCo执行: 以下是我的pom的配置方式: 任何想法,我错过了什么配置?