【问题标题】:How to exclude certain classes from being included in the code coverage? (Java)如何将某些类排除在代码覆盖范围之外? (爪哇)
【发布时间】:2019-09-24 18:01:34
【问题描述】:

我已经可以通过在我的 POM 文件的标签中添加它来排除带有声纳立方体报告的类。

 <properties>
        <java.version>1.8</java.version>
        <sonar.exclusions> 
            /src/main/java/com/example/org/test/mainpackage/message/**/*
            ,
            /src/main/java/com/example/org/test/mainpackage/security/jwt/**/*
            ,
            /src/main/java/com/example/org/test/mainpackage/security/services/**/*
            ,
            /src/main/java/com/example/org/test/mainpackage/controller/AuthRestAPIs.java
            ,
            /src/main/java/com/example/org/test/mainpackage/controller/TestRestAPIs.java
        </sonar.exclusions>
    </properties>

但是,相同的代码在本地运行以测试代码覆盖率时根本不起作用。

在哪里可以使用 Maven 和 Spring Boot 以编程方式进行设置?

我已经可以通过

排除我想要的类

设置 > 构建、执行、部署 > 排除 > [Class(es) to be 排除]

或通过

Edit Configurations > 选择 Code Coverage 选项卡 > 然后添加 我想被排除或仅包含在代码中的包或类 覆盖率报告。

我想要的是对要排除的类进行编码,即在 pom 文件中,就像我在排除声纳 qube 的代码时所做的那样。

为了简短。如何以编程方式执行此操作?

我想以编程方式执行此操作的原因是,我为排除在代码覆盖范围中报告的文件而执行的上述两个步骤是,我的所有项目中都没有包含可以推送到存储库中的文件,以便我对排除项所做的更改将反映在所有将从 git 存储库中提取的人身上。在没有添加任何文件或配置的情况下,我可以推送并反映到 repo 中的所有内容。这意味着我的排除项仅适用于本地,不适用于其他人。正确的?。所以在这里我要求一种以编程方式执行的方法,例如将排除项放入 POM 文件中。

【问题讨论】:

  • 你的意思是你想用Java代码而不是POM文件来做?
  • 是的,只要它以编程方式。顺便说一句,我已经通过 POM 文件做到了这一点,但它只适用于 Sonar Qubes Code Coverage 而不是本地。我的 IntelliJ 仍然报告代码覆盖率非常低。
  • 我希望以编程方式完成此操作的原因是我不想每次都为了添加排除项而搜索项目的设置。此外,它似乎也不会在推送 git 时被结转因为当我通过 IntelliJs 运行配置或设置中的排除项进行排除时,我的项目中没有跟踪任何文件。因此,我想通过 POM 文件或以编程方式执行此操作,以便 git 跟踪排除,并且可以推送这将对那些从 repo 中提取的人生效。
  • it only worked for Sonar Qubes Code Coverage and not locally。没有办法知道(您的问题的编写方式)您的本地配置和服务器配置之间是否有任何区别。 Not working at all 应该是您在本地拥有的内容的描述。当地会发生什么?你有任何代码覆盖率吗?或者您是否涵盖了所有代码并忽略了声纳排除?你使用 Maven 配置文件吗?如果是,选择的配置文件在服务器和本地是否不同?
  • 在添加声纳的排除项之前,我在声纳和本地获得了几乎相同的代码覆盖率。但是,与现在一样,我在本地没有匹配的代码覆盖率报告,因为我的本地代码覆盖率报告仍然不排除我为声纳所做的类。我不知道如何以编程方式执行此操作以在本地排除相同的类。我不知道您所说的个人资料,但到目前为止这是我的问题。我在声纳中排除的代码覆盖率的类没有被 IntelliJ 的本地代码覆盖率报告排除。

标签: java spring maven spring-boot


【解决方案1】:

默认情况下,Intellij 使用 Intellij IDEA 作为默认代码覆盖运行程序。

如果您使用的是jacoco,则将此选项更改为JaCoCo。可以在jetbrains 网站上找到详细信息。 https://www.jetbrains.com/help/idea/configuring-code-coverage-measurement.html

按照上述操作,您的&lt;sonar.coverage.exclusions&gt; 中定义的所有排除类都将被考虑在内,并将与您在远程SonarQube 服务器配置中的内容相匹配。

【讨论】:

    【解决方案2】:

    当您使用 Maven 时,您需要在 jacoco 插件中配置排除项,该插件用于捕获覆盖率统计数据并将其传递给声纳。

    <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.1</version>
    <executions>
            <execution>
                <id>prepare-agent</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <execution>
                <id>report</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>report</goal>
                </goals>
                <configuration>
                    <!-- Sets the path to the file which contains the execution data. -->
                    <dataFile>target/jacoco.exec</dataFile>
                    <!-- Sets the output directory for the code coverage report. -->
                    <outputDirectory>target/jacoco-ut</outputDirectory>
                </configuration>
            </execution>
    </executions>
    <configuration>
        <systemPropertyVariables>
            <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile>
        </systemPropertyVariables>
        <excludes>
            <exclude>snmaddula/app/domain/*.class</exclude>
            <exclude>snmaddula/app/exception/*.class</exclude>
            <exclude>snmaddula/app/filter/*.class</exclude>
            <exclude>snmaddula/app/App.class</exclude>
        </excludes>
    </configuration>
    </plugin>
    

    参考文献:

    【讨论】:

    • 如何格式化排除标签中的目录?如果我有这个目录要排除。 [/src/main/java/com/example/org/test/mainpackage/controller/AuthRestAPIs.java] 目前,我正在使用同一个目录进行排除,并且它不会对代码覆盖率造成任何影响全部。
    • 嗨 joshua,要排除目录,请使用 &lt;exclude&gt;snmaddula/app/dto/**/*.class&lt;/exclude&gt;,这将排除 dto 包的所有类和子包。
    【解决方案3】:

    这不是我真正想要的答案。但现在这对我有用。仍在寻找通过 pom 文件、java 或 bean 执行此操作的方法。谢谢

    解决方案:

    因此,如果您在项目的运行配置中进行了排除。那是通过我在问题中提到的第二步,即通过

    编辑配置 > 代码覆盖率。


    然后实际添加您的排除项。 您只需勾选共享文本框并单击应用。 您所做的排除将在您的项目目录下的

    中可用

    .idea/runConfigurations/[您所做的排除的 xml 文件和 其他运行配置]。

    为了能够推动这个,只需删除

    .idea 在 git 中的 .gitignore 文件中。


    然后您就可以将运行配置文件推送到您的存储库中以供其他人使用。或导出,这样就不必在 intellij 的编辑配置中手动配置。

    PS: 这可能会影响 Sonarqube 中的覆盖率报告。您必须撤消此操作并从您的存储库中取消推送本地运行配置才能使用您的声纳 qubes 类排除项。出于某种原因,它跳过了我在执行此操作之前所做的所有排除。

    【讨论】:

      【解决方案4】:

      application.properties 中你可以这样做:

      sonar.exclusions=src/main/java/com/example/org/test/mainpackage/message/**/*, 
      src/main/java/com/example/org/test/mainpackage/security/jwt/**/*, 
      src/main/java/com/example/org/test/mainpackage/security/services/**/*,
      src/main/java/com/example/org/test/mainpackage/controller/AuthRestAPIs.java,
      src/main/java/com/example/org/test/mainpackage/controller/TestRestAPIs.java
      

      另外,其他方式是在声纳中以管理员身份登录并转到

      settings>Exclusions> 源文件排除 - 在此处添加您的包。 重启服务器。

      【讨论】:

      • 不工作。本地的覆盖率报告仍然没有变化。甚至尝试只排除一个类,但它被包含在覆盖率报告中。还有其他方法吗?我的意思是,我已经用声纳完成了这项工作,我只需要它在本地工作。到目前为止,我在本地和声纳 qube 上的覆盖率报告根本不完全匹配,因为我为声纳 qube 所做的排除不是为本地测试代码覆盖率设置的。 ://
      • @iamjoshua 更改后你重启服务器了吗?
      • 对于我的本地编译?是的。
      • @iamjoshua 用于声纳服务器--> sonar.sh 重启
      • 不,这不是声纳相关的代码覆盖问题。我已经解决了。这是在您使用 Coverage 运行项目时由 IntelliJ 报告的本地覆盖率报告。
      猜你喜欢
      • 2021-05-28
      • 1970-01-01
      • 2013-01-05
      • 2021-08-29
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多