【问题标题】:Exclude packages from Jacoco report using Sonarrunner and Gradle使用 Sonarrunner 和 Gradle 从 Jacoco 报告中排除包
【发布时间】:2015-01-17 23:16:09
【问题描述】:

有没有办法从 SonarQube(由 gradle + sonar-runner 检测)覆盖率报告(由 jacoco 生成)中排除包而不将它们完全排除在项目之外?

以下是我目前尝试过的:

版本信息

  • SonarQube 4.5.1
  • Gradle 2.2。

Jacoco 配置

// JaCoCo test coverage configuration
tasks.withType(Test) { task ->
    jacoco {
        append = false

        // excluded classes from coverage defined in above configuration
        excludes = excludedClasses()
    }

    jacocoTestReport {
        doFirst {
            classDirectories = fileTree(dir: "${buildDir}/classes/main/").exclude(excludedClasses())
        }
    }

}

Sonarrunner 配置

从声纳分析中排除包的属性设置。将此添加到我的配置中会导致软件包在 Sonar 中根本不显示。

property 'sonar.exclusions', excludedClasses().join(',')

从 jacoco 中排除包的属性设置。设置此选项会导致包被排除在覆盖率分析之外,但显示为 0%,这会导致总分不佳。

property 'sonar.jacoco.exclusions', excludedClasses().join(',')

【问题讨论】:

    标签: gradle jacoco sonar-runner


    【解决方案1】:

    通过使用 sonar-project.properties 中的 sonar.coverage.exclusions 属性,我已设法从覆盖率报告中排除特定包。属性描述在官方documentation

    【讨论】:

    • Gradle 配置:sonarqube { properties{ property 'sonar.coverage.exclusions', "**/com/some/package/*,**/com/other/package/Class*" } }
    • 正确的工作模式是:sonarqube { properties { property 'sonar.coverage.exclusions', '*/model/, */commons/ , */exception/, */controller/, */utils/, **/Test.java' } }
    • 链接已损坏@Mikalai-Parafeniuk
    【解决方案2】:

    将@Mikalai 的答案和@pavel 的评论组合成更易于复制和粘贴的内容:

    要从所有声纳检查(覆盖率、代码异味、错误等)中排除包或类,请将以下内容添加到build.gradle

    sonarqube {
        properties {
            property 'sonar.exclusions', "**/com/some/package/**"
        }
    }
    

    要仅从 Sonar 代码覆盖率检查中排除包或类,请将以下内容添加到 build.gradle

    sonarqube {
        properties {
            property 'sonar.coverage.exclusions', "**/com/some/package/**"
        }
    }
    

    【讨论】:

    • 我正在运行声纳 v7.9 并在我的 build.gradle 中进行了相同的配置。仍然声纳仪表板将这些类显示为 0% 覆盖率。是否需要任何其他配置/设置?
    【解决方案3】:

    从 android 项目的声纳代码覆盖范围中排除资源、资产、自定义包和自动生成的类。

    如下创建排除列表

    exclusionList = [
                //Res and Assets
                "src/main/res/**/*.*",
                "src/main/assets/**/*.*",
    
                //Auto-Generated
                '**/R.class',
                '**/R$*.class',
                '**/BuildConfig.*',
                '**/*Manifest.*',
                'android/**/*.*',
                'androidx/**/*.*',
    
                // excluded packages
                **/com/<your-package-path>/**/*]
    

    为声纳覆盖属性提供排除列表

    property 'sonar.coverage.exclusions', exclusionList
    

    注意:

    • 保留完整路径以排除完整目录
    • **/* 包含父目录Refer Here下的所有文件和子目录
    • *Bean 包括所有包含“Bean”的类名。
    • **/ 以它开头,涵盖特定包的父目录。

    执行上述更改后,运行 Jacoco 命令并检查声纳门户的覆盖部分。

    【讨论】:

      【解决方案4】:

      如果您使用带有 Kotlin DSL 的 Gradle 5+,您可以像这样从覆盖范围中排除文件:

      // configure the SonarQube plugin
      sonarqube {
          val exclusions = listOf(
              "**/com/some/package/**",
              "**/all/files/under/package/*",
              "**/com/some/package/OneClass.kt"
          )
      
          // exclude the directories only from coverage (but not from other analysis)
          // https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-gradle/
          properties {
              property("sonar.coverage.exclusions", exclusions)
          }
      }
      

      【讨论】:

        【解决方案5】:

        从 Sonarqube 中排除多个模块或类。将以下代码添加到 build.gradle:

        示例: 包名= com.student.result.detail , com.customer.order , com.student

          sonarqube {
            properties {
                property 'sonar.exclusions', "**/com/student/result/details/**",
                                             "**/com/customer/order/**",
                                             "**/com/student/**";
                }
            }
        

        【讨论】:

          【解决方案6】:

          这对我来说适用于 gradle 6,sonarqube 插件 2.8

          property "sonar.coverage.exclusions" , "**/com/some/package/entity/**/*," + "**/com/some/package/config/**/*,**/com/some/package/dto/**/*,**/com/some/package/dao/**/*"

          注意:包以逗号分隔,但在单个字符串中

          【讨论】:

            【解决方案7】:

            我在这里看到的大部分答案都对我不起作用,导致以下错误:

            Execution failed for task ':sonarqube'.
            > Could not find method property() for arguments [sonar.coverage.exclusions, **/package/path/Class1**, **/package/path/Class2**, **/package/path/Class3**, **/package/path/Class4**] on object of type org.sonarqube.gradle.SonarQubeProperties.
            

            原因是声纳要求一个字符串而不是几个逗号分隔的字符串作为属性值。所以而不是:

              sonarqube {
                properties {
                    property 'sonar.exclusions', "**/com/student/result/details/**",
                                                 "**/com/customer/order/**",
                                                 "**/com/student/**";
                    }
                }
            

            我的解决方案是:

              sonarqube {
                properties {
                    property 'sonar.exclusions', "**/com/student/result/details/**,"+
                                                 "**/com/customer/order/**,"+
                                                 "**/com/student/**";
                    }
                }
            

            【讨论】:

              猜你喜欢
              • 2018-09-22
              • 2013-01-18
              • 2017-01-20
              • 2013-06-27
              • 2023-03-28
              • 1970-01-01
              • 2015-03-04
              • 2015-02-06
              • 1970-01-01
              相关资源
              最近更新 更多