Java 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

我有一个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
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中,可能存在重复的,您不需要检测,因为它有一个可以相应配置的代理。