我正在使用Tomstrong-Plus 7.0.4 Remote中的 Arquillian 进行集成测试,并尝试使用 Jacoco 0.8.2 获得代码覆盖率。由于我使用arquillian-tomee-remote,所以代码覆盖率未涵盖在内。由于未涵盖代码,因此无法构建。我需要具有TomEE-plus Arquillian遥控器和使用Jacoco进行代码覆盖的示例代码。如果有任何示例工作代码或示例项目,我将不胜感激。
我使用了prepare-agent目标,该目标将生成surefireArgLine(javaagent)并在surefire插件中传递相同的目标。问题是,我正在使用远程Tomee,并且不知道如何生成设置为- javaagent:/home/user/.m2/repository/org/jacoco/org.jacoco.agent/0.8的正确Java代理surefireArgLine .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
什么是我的配置中正确的javaagent选项,它将连接到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>
答案 0 :(得分:1)
我已通过surefire插件中的catalina opts向TomEE远程服务器添加了正确的Java代理(surefireArgLine)。可以。
surefireArgLine-将在运行时由Surefire prepare-agent填充。
<tomee.catalina_opts> ${surefireArgLine}</tomee.catalina_opts>
答案 1 :(得分:1)
您可以在arquillian.xml中为tomee容器设置catalina_opts。用maven过滤它以传递jacoco javaagent,您就完成了:)。
答案 2 :(得分:-1)
免责声明:我不是Arquillian和TomEE的专家,因此您可以根据自己的目的调整答案。
无论如何,简而言之,JaCoCo会使用字节码来提供覆盖率报告。
自从使用Arquillian以来,实际的测试执行发生在TomEE JVM中,而不是在实际运行测试套件的JVM中运行(可能是CI服务器或只是运行测试的构建脚本),因此在此配置JaCoCo测试机不会做很多事情,您必须配置服务器本身。
JaCoCo具有一个-javaagent
选项,该Java代理将“拦截”服务器对类的加载并对其进行检测。
现在,当JaCoCo工作时,它将生成一个jacoco.exec
文件,该文件实际上包含一个覆盖率报告,以后可以通过各种方式显示该报告(jenkins插件显示覆盖率,声纳集成等等)。
到目前为止,这是最常用的选项AFAIK,因此,如果采用这种方法,考虑到工具确实有效,那么在测试完成后,您必须在测试计算机上找到服务器并将其下载到构建计算机上并与CI / Sonar集成在一起。
但是,还有其他解决方案:
JaCoCo Documentation指出了运行检测Java代理的三种模式:
从技术上讲,您可以为该javaagent提供不同的参数,以便它可以在其中一种模式下运行JaCoCo。
无论如何,我们已经讨论了第一个选项,但是如果需要,您也可以使用TCP配置。当然,在这里您必须处理安全问题(例如,公开/访问端口的权限等)。
如果使用TCP模式,则可以使用Maven Plugin。我没有自己使用它,只是谷歌搜索,所以我不能评论它是否有任何好处,它在Github上只有2星,所以它可能还没有准备生产,但是也许可以从它的源代码中得到一些想法。 >