Java Maven多模块项目,具有独立的测试模块-代码覆盖率?
我有一个maven多模块项目Java Maven多模块项目,具有独立的测试模块-代码覆盖率?,java,maven,code-coverage,jacoco-maven-plugin,Java,Maven,Code Coverage,Jacoco Maven Plugin,我有一个maven多模块项目 root: moduleA/ # no unit tests moduleB/ # no unit tests moduleC/ # no unit tests tests/ # All unit tests, since depends on modules A, B and C 所有测试都在称为tests/的单个模块中,所有代码都在单独的模块中 有什么方法可以获得代码覆盖率吗?我认为jacoco或cobert
root:
moduleA/ # no unit tests
moduleB/ # no unit tests
moduleC/ # no unit tests
tests/ # All unit tests, since depends on modules A, B and C
所有测试都在称为tests/的单个模块中,所有代码都在单独的模块中
有什么方法可以获得代码覆盖率吗?我认为
jacoco
或cobertura
都不能报告跨模块的代码覆盖率。在运行测试覆盖率报告之前,您可能希望尝试检测已编译的类,而不是依赖于动态检测
查看此
jacoco
maven以执行脱机检测。有一种方法可以完成此操作。神奇的是创建一个组合的jacoco.exec文件,并分两步完成。我的pom:
<properties>
...
<jacoco.overall.exec>${maven.multiModuleProjectDirectory}/target/jacoco_analysis/jacoco.exec</jacoco.overall.exec>
</properties>
<build>
<pluginManagement>
<plugins>
...
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.8</version>
<configuration>
<destFile>${jacoco.overall.exec}</destFile>
<dataFile>${jacoco.overall.exec}</dataFile>
</configuration>
</plugin>
...
</plugins>
</pluginManagement>
</build>
<profiles>
<profile>
<id>runTestWithJacoco</id>
<activation>
<property>
<name>runTestWithJacoco</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<append>true</append>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>createJacocoReport</id>
<activation>
<property>
<name>createJacocoReport</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>default-report</id>
<phase>validate</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
...
${maven.multiModuleProjectDirectory}/target/jacoco_analysis/jacoco.exec
...
org.jacoco
jacocomaven插件
0.7.8
${jacoco.total.exec}
${jacoco.total.exec}
...
用jacoco运行测试
用jacoco运行测试
真的
org.jacoco
jacocomaven插件
默认准备代理
配制剂
真的
CreateJacoReport
CreateJacoReport
真的
org.jacoco
jacocomaven插件
默认报告
验证
报告
将其添加到父pom中,然后执行
mvn clean install-DrunTestWithJacoco
和mvn validate-DcreateJacoReport
。现在您已经完全覆盖了一个类,而不管哪个测试覆盖了它。神奇的是使用maven.multiModuleProjectDirectory
创建一个组合的jacoco.exec文件。此属性自maven 3.3.1起可用,并指向启动maven构建的文件夹。自Jacoco版本:0.7.7以来,您可以使用报告聚合
根pom.xml:
[...]
org.jacoco
jacocomaven插件
0.8.6
配制剂
配制剂
报告
测试
报告
报告汇总
[...]
org.apache.maven.plugins
maven surefire插件
3.0.0-M5
org.apache.maven.surefire
surefire-junit47
3.0.0-M5
${argLine}-Dfile.encoding=UTF-8
[...]
子模块pom.xml:
[...]
org.apache.maven.plugins
maven surefire插件
[路径]
[...]
如果您使用Jenkin,您可以只使用jacoco插件和
report
,而不使用其他新功能。根据定义,单元测试是相应模块的本地测试,而不是提取到单独的模块。因此,单独单元测试模块的设置没有意义。Maven的意图是在同一个模块中拥有生产代码和适当的单元测试。正如文件夹结构显示的src/main/java
生产代码<代码> SRC/Test/java < /COD>单元测试代码。如果您认为测试模块是集成测试的位置,那么这是一个有效的设置。目前看来,jacoco并不支持这一点,如果你真的想这么做,你可以试试Sonar。否则,等待下一个版本的Jacoco,如果我们谈论集成测试,它可能实际上支持它:D()。是的,但这不是问题中的内容。如果你想用Jacoco运行集成测试,你需要一个代理,它必须在maven failsafe插件(如果我们谈论集成测试)中进行适当配置。请参见此处:在jacoco中,可能存在重复的,您不需要检测,因为它有一个可以相应配置的代理。