【问题标题】:SonarQube not showing test Jacoco coverage for JUnit tests in a Gradle multi-projectSonarQube 未在 Gradle 多项目中显示 JUnit 测试的测试 Jacoco 覆盖率
【发布时间】:2020-01-09 15:05:15
【问题描述】:

我想展示使用 Gradle 6.0 构建的多项目 Spring Boot 应用程序的测试覆盖率。我们目前使用 JUnit5。

即使存在一些首次测试,SonarQube 中的测试覆盖率仍为 0%。

顶级项目 (https://github.com/OpenReqEU/eclipse-plugin-vogella/blob/master/server/build.gradle) 中的 build.gradle 文件具有以下输入:

plugins {
    id "org.sonarqube" version "2.7"
    id 'jacoco'
}

repositories {
    jcenter()
}

subprojects {
    apply plugin: 'jacoco'
    apply plugin: 'java'
    apply plugin: 'eclipse'

    repositories {
        jcenter()
        maven { url 'https://repo.spring.io/snapshot' }
        maven { url 'https://repo.spring.io/milestone' }
        maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
            maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' }
    }

    jacocoTestReport {
        reports {
            xml.enabled true
            xml.destination file("${buildDir}/coverage-reports/coverage.xml")
            //html.destination file("${buildDir}/coverage-reports")
        }
    }

    ext {
        springBootVersion = '2.1.1.RELEASE'
    }

    sourceCompatibility = 1.8

}


wrapper {
    gradleVersion = '6.0'
}

在 Jenkins 构建中,我们设置了以下参数:

sonar.projectKey=eclipse-plugin-vogella
sonar.sources=server/com.vogella.prioritizer.server/src/main,server/com.vogella.prioritizer.server.bugzilla/src/main,server/com.vogella.prioritizer.server.issue.api/src/main
sonar.java.binaries=com.vogella.prioritizer.server/build/classes/java/main,com.vogella.prioritizer.server.bugzilla/build/classes/java/main,com.vogella.prioritizer.server.issue.api/build/classes/java/main
sonar.tests=server/com.vogella.prioritizer.server/src/test,server/com.vogella.prioritizer.server.bugzilla/src/test
sonar.coverage.jacoco.xmlReportsPath=server/com.vogella.prioritizer.server.bugzilla/build/jacoco/test.exec,server/com.vogella.prioritizer.server/build/jacoco/test.exec,server/com.vogella.prioritizer.server.issue.api/build/jacoco/test.exec

构建结果显示错误: 信息:解析 [/home/jenkins/workspace/issue-prioritizer/coverage-reports/coverage.xml] 错误:找不到报告路径或不是目录:/home/jenkins/workspace/issue-prioritizer/coverage-reports/coverage.xml

我看到每个项目都有一个生成的 ${buildDir}/coverage-reports/coverage.xml 文件,但是根文件是空的,这是预料之中的,因为我没有配置与此相关的任何内容。

在某个时候,我添加了一个复制任务,它将一个项目中生成的 xml 文件之一复制到根文件夹中,但构建作业抱怨类不匹配。

有人知道如何解决这个问题吗?我假设我必须添加一个配置来添加一个根 coverage.xml 文件,该文件是单个文件的集合,但我还没有找到解决方案。

我也尝试将 jacoco 应用于根项目,但也失败了,因为根项目不是 Java 项目。

【问题讨论】:

  • 我在您的配置中看到 sonar.coverage.jacoco.xmlReportsPath 指向 jaCoCo 的 .exec 二进制报告文件,而此属性应指向文档中指定的 xml 报告路径:docs.sonarqube.org/display/PLUG/JaCoCo+Plugin
  • 谢谢,我改一下路径。
  • 不幸的是,这并没有解决问题,根 coverage.xml 文件没有被创建。

标签: jenkins gradle sonarqube code-coverage jacoco


【解决方案1】:

需要生成xml格式的报告。将 sonar 属性添加到 xml 路径中,如下所示。

jacocoTestReport {
    reports {
        xml.enabled true
    }
}

sonarqube {
        properties {
            property "sonar.java.source", "1.8"
            property "sonar.java.coveragePlugin", "jacoco"
            property "sonar.jacoco.reportPaths", "build/reports/jacoco/test/jacocoTestReport.xml"
        }
}

使用 jacocoTestReport 运行 gradle 命令

gradlew sonarqube jacocoTestReport

【讨论】:

    【解决方案2】:

    我设法通过将顶级 build.gradle 更改为:

    plugins {
    //    id "org.sonarqube" version "2.7"
        id 'jacoco'
    }
    
    repositories {
        jcenter()
    }
    
    
    subprojects {
    
        println name;
        apply plugin: 'jacoco'
        apply plugin: 'java'
        apply plugin: 'eclipse'
    
        repositories {
            jcenter()
            maven { url 'https://repo.spring.io/snapshot' }
            maven { url 'https://repo.spring.io/milestone' }
            maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
            maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' }
        }
    
        jacocoTestReport {   
            reports {
                xml.enabled true
            }
        }
    
        ext {
            springBootVersion = '2.1.1.RELEASE'
        }
    
        sourceCompatibility = 1.8
    }
    
    // run the build with ./gradlew clean build generateMergedReport
    task generateMergedReport(type: JacocoReport) {
        dependsOn = subprojects.test 
    
        additionalSourceDirs.setFrom files(subprojects.sourceSets.main.allSource.srcDirs)
        sourceDirectories.setFrom files(subprojects.sourceSets.main.allSource.srcDirs)
        classDirectories.setFrom files(subprojects.sourceSets.main.output)
    
        executionData.setFrom project.fileTree(dir: '.', include: '**/build/jacoco/test.exec')
        println executionData;
    
        reports {
            xml.enabled true
            xml.destination file("../coverage-reports/coverage.xml")
        }
    }
    
    wrapper {
        gradleVersion = '6.0'
    }
    

    并更改 Jenkins 以构建 generateMergedReport:

    cd server && ./gradlew build generateMergedReport
    

    SonarQube 属性更改为:

    sonar.projectKey=eclipse-plugin-vogella
    sonar.sources=server/com.vogella.prioritizer.server/src/main,server/com.vogella.prioritizer.server.bugzilla/src/main,server/com.vogella.prioritizer.server.issue.api/src/main
    sonar.java.binaries=com.vogella.prioritizer.server/build/classes/java/main,com.vogella.prioritizer.server.bugzilla/build/classes/java/main,com.vogella.prioritizer.server.issue.api/build/classes/java/main
    

    不幸的是,SonarQube 仍然没有找到 coverage.xml 文件。

    INFO: parsing [/home/jenkins/workspace/issue-prioritizer/coverage-reports/coverage.xml]
    ERROR: Reports path not found or is not a directory: /home/jenkins/workspace/issue-prioritizer/coverage-reports/coverage.xml
    

    有人知道缺少什么吗?

    【讨论】:

      猜你喜欢
      • 2013-07-05
      • 2016-10-13
      • 2019-07-07
      • 2017-12-03
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 2020-11-14
      相关资源
      最近更新 更多