【问题标题】:Arquillian tomee remote jacoco code coverageArquillian tomee 远程 jacoco 代码覆盖率
【发布时间】:2019-01-16 04:10:31
【问题描述】:

我正在使用 Arquillian in TomEE-Plus 7.0.4 remote 进行集成测试,并尝试使用 Jacoco 0.8.2 获得代码覆盖率。由于我使用的是 arquillian-tomee-remote,因此未涵盖我的代码覆盖率。由于未涵盖代码,因此无法构建。我需要带有 TomEE-plus arquillian 遥控器的示例代码和使用 Jacoco 的代码覆盖率。如果我能得到任何示例工作代码或示例项目,我将不胜感激。

我使用了 prepare-agent 目标,它将生成 surefireArgLine ( javaagent) 并在surefire插件中传递相同的内容。这里的问题是,我正在使用远程 Tomee 并且不知道如何生成正确的 java 代理surefireArgLine 设置为 -javaagent:/home/user/.m2/repository/org/jacoco/org.jacoco.agent/0.8 .2/org.jacoco.agent-0.8.2-runtime.jar=destfile=/home/user/project/target/coverage-reports/jacoco-ut.exec,append=true,excludes=/config /*.class:/util/*Constants.class

我的配置将连接到 arquillian-remote-tomee 的正确 javaagent 选项是什么?

Jacoco 插件

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${plugin.maven.jacoco.version}</version>
        <configuration>
            <propertyName>coverageAgent</propertyName>
            <append>true</append>
            <excludes>
                <exclude>**/config/*.class</exclude>
                <exclude>**/util/*Constants.class</exclude>
            </excludes>
        </configuration>
        <executions>
            <execution>
                <id>pre-unit-test</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
                <configuration>
                    <destFile>${sonar.jacoco.reportPath}</destFile>
                    <propertyName>surefireArgLine</propertyName>
                    <append>true</append>
                </configuration>
            </execution>
            <execution>
                <id>post-unit-test</id>
                <phase>test</phase>
                <goals>
                    <goal>report</goal>
                </goals>
                <configuration>
                    <dataFile>${sonar.jacoco.reportPath}</dataFile>
                    <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
                    <append>true</append>
                </configuration>
            </execution>
            <execution>
                <id>check</id>
                <goals>
                    <goal>check</goal>
                </goals>
                <configuration>
                    <dataFile>${sonar.jacoco.reportPath}</dataFile>
                    <haltOnFailure>true</haltOnFailure>
                    <rules>
                        <rule>
                            <element>BUNDLE</element>
                            <limits>
                                <limit>
                                    <counter>LINE</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>0.99</minimum>
                                </limit>
                                <limit>
                                    <counter>BRANCH</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>0.99</minimum>
                                </limit>
                                <limit>
                                    <counter>CLASS</counter>
                                    <value>MISSEDCOUNT</value>
                                    <maximum>0</maximum>
                                </limit>
                            </limits>
                        </rule>
                    </rules>
                </configuration>
            </execution>
        </executions>
    </plugin>

依赖关系

<dependency>
    <groupId>org.jboss.arquillian.testng</groupId>
    <artifactId>arquillian-testng-container</artifactId>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.jboss.arquillian.config</groupId>
    <artifactId>arquillian-config-api</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.arquillian.extension</groupId>
    <artifactId>arquillian-jacoco</artifactId>
    <version>1.0.0.Alpha10</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>org.jacoco.agent</artifactId>
    <classifier>runtime</classifier>
    <scope>test</scope>
    <version>${plugin.maven.jacoco.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jacoco/org.jacoco.core -->
<dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>org.jacoco.core</artifactId>
    <version>${plugin.maven.jacoco.version}</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.apache.tomee</groupId>
    <artifactId>arquillian-tomee-remote</artifactId>
    <version>${tomee.version}</version>
    <scope>test</scope>
</dependency>

Arquillian.xml

<extension qualifier="jacoco">
    <property name="includes">com.demo.*</property>
</extension>

【问题讨论】:

    标签: jacoco jboss-arquillian apache-tomee jacoco-maven-plugin tomee-7


    【解决方案1】:

    您可以在 arquillian.xml 中为 tomee 容器设置 catalina_opts。用 maven 过滤它以传递 jacoco javaagent ,你就完成了:)。

    【讨论】:

    【解决方案2】:

    我已通过 catalina opts in surefire 插件将正确的 java 代理 (surefireArgLine) 添加到 TomEE 远程服务器。它有效。

    surefireArgLine - 将在运行时由 Surefire 准备代理填充。

    <tomee.catalina_opts> ${surefireArgLine}</tomee.catalina_opts>
    

    【讨论】:

      【解决方案3】:

      免责声明:我不是 Arquillian 和 TomEE 方面的专家,因此您可以根据自己的目的调整答案。

      总之,JaCoCo 检测字节码是为了提供覆盖率报告。

      由于使用 Arquillian,实际的测试执行发生在 TomEE JVM 中,而不是在实际运行测试套件的 JVM 中(可能是 CI 服务器或只是运行测试的构建脚本),因此在此配置 JaCoCo测试机不会做太多,你必须自己配置服务器。

      JaCoCo 有一个 -javaagent 选项来执行此操作,并且此 Java 代理将“拦截”服务器加载类并对其进行检测。

      现在,当 JaCoCo 工作时,它会生成一个 jacoco.exec 文件,该文件实际上包含一个覆盖率报告,该报告可以在以后以各种方式显示(用于显示覆盖率的 jenkins 插件,声纳集成等等)。 这是迄今为止最常用的选项AFAIK,所以如果你采用这种方法,鉴于仪器确实有效,测试完成后,你必须在测试机器上找到服务器并将其下载到构建机器并与 CI/Sonar 集成。

      但是,还有其他解决方案:

      JaCoCo Documentation 指出运行检测 Java 代理的三种模式:

      • 文件系统:在 JVM 终止时,执行数据被写入本地文件。
      • TCP 套接字服务器:外部工具可以连接到 JVM 并通过套接字连接检索执行数据。可以选择在 VM 退出时重置执行数据和转储执行数据。
      • TCP 套接字客户端:启动时,JaCoCo 代理连接到给定的 TCP 端点。执行数据根据请求写入套接字连接。可以选择在 VM 退出时重置执行数据和转储执行数据。

      从技术上讲,您可以为该 javaagent 提供不同的参数,以便它以其中一种模式运行 JaCoCo。

      无论如何,我们已经讨论了第一个选项,但如果需要,您也可以使用 TCP 配置。当然,在这里您必须处理安全问题(例如公开/访问端口的权限等)。

      如果您使用 TCP 模式,有一个Maven Plugin 可以派上用场。我自己没有用过,只是用谷歌搜索过,所以我无法评论它是否好用,它在 Github 上只有 2 颗星,所以它可能还没有准备好生产,但也许你可以从它的源代码中获得一些想法。

      【讨论】:

      • 我了解测试正在远程 tomee 容器中运行。我需要知道如何为我的场景配置 javaagent
      • 由于我没有使用过 TomEE,我可能无法拥有太多东西,在 Tomcat 的情况下,我认为您应该将 javaagent 定义添加到 JAVA_OPTS 变量中(请参阅它的启动脚本) 当然选择了 jacoco 调用的模式(这三个之一)。希望我们的同事能提供更准确的答案。
      • 我知道,我的答案并没有改变,它只是由 Godin 编辑(格式、命名等)。希望实际处理过 TomEE 和 Jacoco 的人能够提供具有真实配置的精确解决方案。你试过JAVA_OPTS修改吗?运行测试后是否会创建 jacoco.exec 文件(即使没有更高级的 TCP 模式)?
      • 我当前的配置创建 jacoco.exec。但它不连接远程 tomee,因为我不知道远程 tomee 的 javaagent 配置
      • 我的意思是在 TomEE 服务器上,你在 javaopts 中使用过 javaagent 吗?你是怎么配置的?请使用此信息更新问题。
      猜你喜欢
      • 1970-01-01
      • 2016-11-11
      • 2019-01-02
      • 2012-11-02
      • 2014-11-09
      • 2017-06-07
      • 2018-05-28
      • 2012-06-11
      • 1970-01-01
      相关资源
      最近更新 更多