Arquillian tomee 远程 jacoco 代码覆盖率
Arquillian tomee remote jacoco code coverage
我正在 TomEE-Plus 7.0.4 远程中使用 Arquillian 进行集成测试,并尝试使用 Jacoco 0.8.2[=33= 获取代码覆盖率].由于我使用的是 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
我的配置的正确 java 代理选项是什么,它将连接到 arquillian-remote-tomee?
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>
免责声明:我既不是 Arquillian 也不是 TomEE 方面的专家,因此您可以根据自己的目的调整答案。
总之,简而言之,JaCoCo 检测字节码以提供覆盖率报告。
自从使用 Arquillian 以来,实际的测试执行发生在 TomEE JVM 中,而不是在实际 运行 测试套件的 JVM 中(可能是 CI 服务器或只是一个构建脚本运行 是测试),因此在此测试机器上配置 JaCoCo 不会做太多事情,您必须配置服务器本身。
JaCoCo 有一个 -javaagent
选项来执行此操作,此 Java 代理将 "intercept" 服务器加载 类 并检测它们。
现在,当 JaCoCo 工作时,它会生成一个 jacoco.exec
文件,该文件实际上包含一个覆盖率报告,稍后可以以各种方式显示(jenkins 插件显示覆盖率,声纳集成等等)。
这是迄今为止最常用的选项 AFAIK,所以如果你采用这种方法,考虑到仪器确实有效,测试完成后,你必须在测试机器上找到服务器并将其下载到构建机器并与 CI/Sonar 集成。
但是,还有其他解决方案:
JaCoCo Documentation 指出有三种模式 运行 检测 Java 代理:
- 文件系统:在 JVM 终止时,执行数据被写入本地文件。
- TCP 套接字服务器:外部工具可以连接到 JVM 并通过套接字连接检索执行数据。可以在 VM 退出时执行可选的执行数据重置和执行数据转储。
- TCP 套接字客户端:启动时,JaCoCo 代理连接到给定的 TCP 端点。执行数据根据请求写入套接字连接。可以在 VM 退出时执行可选的执行数据重置和执行数据转储。
从技术上讲,您可以为该 javaagent 提供不同的参数,以便它 运行 JaCoCo 处于其中一种模式。
无论如何,我们已经讨论了第一个选项,但如果需要,您也可以使用 TCP 配置。当然,在这里您必须处理安全问题(例如 expose/access 端口的权限等)。
如果您使用 TCP 模式,那么 Maven Plugin 可以派上用场。我自己没有使用过它,只是用谷歌搜索所以我不能评论它是否有任何好处,它在 Github 上只有 2 颗星,所以它可能还没有准备好生产,但也许你可以从它的源代码中得到一些想法代码。
我已通过 catalina opts in surefire 插件将正确的 java 代理 ( surefireArgLine) 添加到 TomEE 远程服务器。它有效。
surefireArgLine - Will be populate by Surefire prepare-agent at runtime.
<tomee.catalina_opts> ${surefireArgLine}</tomee.catalina_opts>
您可以在 arquillian.xml 中为 tomee 容器设置 catalina_opts。用 maven 过滤它以传递 jacoco javaagent,你就完成了:)。
我正在 TomEE-Plus 7.0.4 远程中使用 Arquillian 进行集成测试,并尝试使用 Jacoco 0.8.2[=33= 获取代码覆盖率].由于我使用的是 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
我的配置的正确 java 代理选项是什么,它将连接到 arquillian-remote-tomee?
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>
免责声明:我既不是 Arquillian 也不是 TomEE 方面的专家,因此您可以根据自己的目的调整答案。
总之,简而言之,JaCoCo 检测字节码以提供覆盖率报告。
自从使用 Arquillian 以来,实际的测试执行发生在 TomEE JVM 中,而不是在实际 运行 测试套件的 JVM 中(可能是 CI 服务器或只是一个构建脚本运行 是测试),因此在此测试机器上配置 JaCoCo 不会做太多事情,您必须配置服务器本身。
JaCoCo 有一个 -javaagent
选项来执行此操作,此 Java 代理将 "intercept" 服务器加载 类 并检测它们。
现在,当 JaCoCo 工作时,它会生成一个 jacoco.exec
文件,该文件实际上包含一个覆盖率报告,稍后可以以各种方式显示(jenkins 插件显示覆盖率,声纳集成等等)。
这是迄今为止最常用的选项 AFAIK,所以如果你采用这种方法,考虑到仪器确实有效,测试完成后,你必须在测试机器上找到服务器并将其下载到构建机器并与 CI/Sonar 集成。
但是,还有其他解决方案:
JaCoCo Documentation 指出有三种模式 运行 检测 Java 代理:
- 文件系统:在 JVM 终止时,执行数据被写入本地文件。
- TCP 套接字服务器:外部工具可以连接到 JVM 并通过套接字连接检索执行数据。可以在 VM 退出时执行可选的执行数据重置和执行数据转储。
- TCP 套接字客户端:启动时,JaCoCo 代理连接到给定的 TCP 端点。执行数据根据请求写入套接字连接。可以在 VM 退出时执行可选的执行数据重置和执行数据转储。
从技术上讲,您可以为该 javaagent 提供不同的参数,以便它 运行 JaCoCo 处于其中一种模式。
无论如何,我们已经讨论了第一个选项,但如果需要,您也可以使用 TCP 配置。当然,在这里您必须处理安全问题(例如 expose/access 端口的权限等)。
如果您使用 TCP 模式,那么 Maven Plugin 可以派上用场。我自己没有使用过它,只是用谷歌搜索所以我不能评论它是否有任何好处,它在 Github 上只有 2 颗星,所以它可能还没有准备好生产,但也许你可以从它的源代码中得到一些想法代码。
我已通过 catalina opts in surefire 插件将正确的 java 代理 ( surefireArgLine) 添加到 TomEE 远程服务器。它有效。
surefireArgLine - Will be populate by Surefire prepare-agent at runtime.
<tomee.catalina_opts> ${surefireArgLine}</tomee.catalina_opts>
您可以在 arquillian.xml 中为 tomee 容器设置 catalina_opts。用 maven 过滤它以传递 jacoco javaagent,你就完成了:)。