5

我有一个与 JaCoCo 和 SONAR 的多模块 maven 项目相关的问题。

我有一个父模块和 3 个子模块。

父 |-child1 - pom.xml |-child2 - pom.xml |-child3 - pom.xml |-pom.xml

我在父 pom.xml 中包含 JaCoCo 插件。当我从父 pom.xml 运行 mvn clean install sonar:sonar build 时,我看到每个孩子都生成了自己的 jacoco.exec 文件。像这样的东西 child1/target/jacoco.exec, child2/target/jacoco.exec 等等。但是,在父级没有生成 jacoco.exec。

当我运行声纳分析时,我看到单元测试覆盖率在声纳仪表板上显示为 0.0%。

我的问题是
1. 我应该怎么做才能看到整个项目的单元测试覆盖率?
2. 为了显示一个单元测试覆盖率,SONAR 是从父级还是从子级选择 jacoco.exec 文件?

请帮忙。这对我来说真的是一个障碍。感谢您的所有投入。

4

2 回答 2

1

我遇到了同样的问题,然后我在每个模块 pom xml 中包含以下内容并且它有效:

<!-- Sonar START -->
        <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
        <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
        <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
        <sonar.language>java</sonar.language>
        <jacoco.version>0.7.9</jacoco.version>
        <!-- Sonar START -->

插件:

<!-- SONAR config START -->
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>${jacoco.version}</version>
                <configuration>
                    <destFile>${sonar.jacoco.reportPath}</destFile>
                    <append>true</append>
                </configuration>
                <executions>
                    <execution>
                        <id>agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo>Project Base Path (WEB):: ${project.basedir}</echo>
                                <echo>Jacoco exec target path (WEB):: ${sonar.jacoco.reportPath}</echo>
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.sonarsource.scanner.maven</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
                <version>3.2</version>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
                <version>2.7</version>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19</version>
                <configuration>
                    <argLine>${argLine}</argLine>
                </configuration>
            </plugin>
            <!-- SONAR config END -->

并在 Jenkins 中将“目标和选项”配置为:

sonar:sonar

对于运行特定测试:

sonar:sonar -DfailIfNoTests=false -Dtest=<Test Class> test
于 2017-03-13T11:05:49.913 回答
1

我遇到了类似的问题,使用 SonarQube 6.7.2 对 Sonar 仪表板进行 0.0% 的覆盖率和没有单元测试:Maven:3.5.2,Java:1.8,Jacoco:使用 7.0/7.9/8.0,操作系统:Windows

经过大量努力寻找正确的解决方案,解决了这个配置的问题,我的父 pom 看起来像:

 <properties>
            <!--Sonar -->
            <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
            <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
        <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
            <sonar.language>java</sonar.language>

        </properties>

        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <source>1.5</source>
                            <target>1.5</target>
                        </configuration>
                    </plugin>

                    <plugin>
                        <groupId>org.sonarsource.scanner.maven</groupId>
                        <artifactId>sonar-maven-plugin</artifactId>
                        <version>3.4.0.905</version>
                    </plugin>

                    <plugin>
                        <groupId>org.jacoco</groupId>
                        <artifactId>jacoco-maven-plugin</artifactId>
                        <version>0.7.9</version>
                        <configuration>
                            <destFile>${sonar.jacoco.reportPath}</destFile>
                            <append>true</append>
                        </configuration>
                        <executions>
                            <execution>
                                <id>agent</id>
                                <goals>
                                    <goal>prepare-agent</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>

                </plugins>
            </pluginManagement>
        </build>

我尝试了一些其他选项,例如jacoco-aggregate甚至通过将其包含在父 pom 中来创建子模块,但没有任何效果,这很简单。我在日志中看到<sonar.jacoco.reportPath>已弃用,但仍按原样工作,并且似乎在执行时自动替换,或者可以手动更新<sonar.jacoco.reportPaths>或最新。在 cmd 中进行设置后,先使用mvn clean install然后mvn org.jacoco:jacoco-maven-plugin:prepare-agent install然后再执行mvn sonar:sonar,这是我尝试过的,如果有其他最好的请告诉我可能的解决方案。希望这会有所帮助!如果没有,请发布您的问题..

于 2018-04-09T03:04:09.060 回答