当前位置: 首页 > 知识库问答 >
问题:

SonarQube覆盖范围始终为0

仲孙毅
2023-03-14

我有一个项目,使用SonarQube来分析我的代码。正如标题所示,尽管我有多个JUnit测试,但在SQ报告(在我的服务器上)中覆盖率指标总是显示为0。我目前运行以下命令

清理包部署声纳:声纳-Dsonar.projectKey=某物名-Dmaven.test.skip=true

在詹金斯建立我的项目时(詹金斯·马文项目)。

我有类似的问题前一段时间在不同的项目。我设法通过这篇文章解决了它。然而,这一次却无济于事。搜索了一下,找到了第1条和第2条(还有一些想法类似的)。两人都提出了一些好建议,但不幸的是,没有任何建议奏效。

我注意到我每次也会得到以下警告(不知道是什么原因造成的)

Cobertura report not found at /var/lib/jenkins/jobs/SomeProjectName/workspace/SomeFolderName/target/site/cobertura/coverage.xml

起初,我试图添加cobertura插件(如本文所建议的),但这只是删除了警告(报告中的覆盖率仍然为0)。我目前的理解是,它覆盖了Jacoco,但我没有找到原因或解决方案。

我的插件:

<build>
        <plugins>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>scala-compile-first</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>add-source</goal>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>scala-test-compile</id>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <verbose>true</verbose>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <finalName>uber-${project.artifactId}-${project.version}</finalName>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.5</version>
                <executions>
                    <execution>
                        <id>pre-unit-test</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
                            <propertyName>surefireArgLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-unit-test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <configuration>
                            <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
                            <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
                        </configuration>
                    </execution>
                    <execution>
                        <id>pre-integration-test</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile>
                            <propertyName>failsafeArgLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-integration-test</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <configuration>
                            <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>
                            <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.avro</groupId>
                <artifactId>avro-maven-plugin</artifactId>
                <version>1.9.2</version>
                <executions>
                    <execution>
                        <configuration>
                            <outputDirectory>${project.basedir}/target/generated-sources</outputDirectory>
                            <sourceDirectory>${project.basedir}/src/main/resources/</sourceDirectory>
                        </configuration>
                        <goals>
                            <goal>schema</goal>
                            <goal>protocol</goal>
                            <goal>idl-protocol</goal>
                        </goals>
                        <id>schemas</id>
                        <phase>generate-sources</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

我的物业:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>11</java.version>
    </properties>

共有1个答案

杜嘉木
2023-03-14

有几件事必须正确设置,以使您的测试覆盖率显示在SonarQube中。其中一些设置可能有默认值,但我尽量避免神奇的默认值,以确保我的设置彼此一致。

Surefire和Jacoco必须具有彼此一致的设置,SonarQube必须知道在哪里可以找到覆盖数据文件。

我将建议一些属性值供您使用。

sonar.coverage.jacoco.xmlReportPaths: ${basedir}/target/jacoco_report/jacoco.xml
jacoco.path: ${basedir}/target/jacoco_report

下面是你的jacoco插件的摘录:

<!-- Prepares the property pointing to the JaCoCo runtime agent which 
    is passed as VM argument when Maven the Surefire plugin is executed. -->
<execution>
    <id>pre-unit-test</id>
    <goals>
        <goal>prepare-agent</goal>
    </goals>
    <configuration>
        <propertyName>surefireArgLine</propertyName>
    </configuration>
</execution>
<!-- Ensures that the code coverage report for unit tests is created 
    after unit tests have been run. -->
<execution>
    <id>post-unit-test</id>
    <phase>test</phase>
    <goals>
        <goal>report</goal>
    </goals>
    <configuration>
        <!-- Sets the output directory for the code coverage report. -->
        <outputDirectory>${jacoco.path}</outputDirectory>
    </configuration>
</execution>

最后,这是Surefire插件的配置块:

<!-- Sets the VM argument line used when unit tests are run. -->
<argLine>${surefireArgLine}</argLine>

然而,在你的情况下,你有一个非常严重的问题,这将导致零覆盖率,即使你已经正确地完成了所有这些设置。感谢@Ian W指出这一点。

当我看到你写“尽管我有多个JUnit测试”时,我相信你的话,你实际上是在执行单元测试。命令行上有“-Dmaven.test.skip=true”,这将导致它无法执行任何单元测试。去掉那个。

 类似资料:
  • 我的项目中有一个com.org.projectname.model包。我想做的是,从SonarQube覆盖范围中排除此包中的所有文件。我试过了,和,仍然没有成功。 如何解决这个问题?或者还有别的办法吗?

  • 我的sonarqube服务器版本8.3.1启用了cobertura插件来显示cobertura覆盖报告。现在我想报告Jacoco XML覆盖数据(使用gradle Jacoco插件生成),但它不起作用。cobertura和Jacoco之间是否存在任何已知问题?或者两种机制都应该在一个sonarqube上工作?

  • 我有一个问题,在声纳Qube v6.7中,线路覆盖范围低于哈科报告。 当我打开声纳时,我的类文件有很多未覆盖的行。打开 jacoco 报告时,它显示这些行已覆盖。 我正在使用gradle插件。(v2.6) 有什么想法可以是问题吗?

  • 我对C#UTF8编码感到困惑... 假设这些“事实”是正确的: Unicode是定义每个字符的“协议” 根据C#参考,每个字符的可接受范围为0x0000到0xFFFF。我不明白另一个字符是什么,它在0xFFFF之上,在Unicode协议中定义的? 与C#相比,当我使用Python编写UTF8文本时-它涵盖了所有预期范围(0x0000到0x10FFFF)。例如: 这对C不起作用。此外,当我将Pyth

  • 问题内容: 除了主应用程序外,我的项目中还有两个分别用于单元测试和UI测试的目标。这两个目标有不同的方案,因此我可以在CI服务器上分别运行它们。我在这两个方案中都选中了“收集代码覆盖率”。最初,我通过使用“ Cmd + U”分别构建和运行这两个方案来确保所有功能都在XCode中正常工作,并且对于这两个方案,覆盖数据均正确显示。 在我的Jenkins CI中,我使用快速通道为这两种方案提供了单独的工

  • 我正在运行我的selenium项目模块,它不是主项目的一部分,我用Jacoco maven插件和surefire插件运行selenium测试,Jacoco只给出了selenium项目的代码覆盖(exec文件),而不是整个项目...我需要如何配置我的Jacoco和Surefire以获得外部/整个项目覆盖??