在 Gradle 多项目中应用 Jacoco

Applying Jacoco in Gradle Multiproject

我在我的一些 Gradle 实现中使用 Jacoco,并决定改进它在多项目中的使用。

我创建了一个类似于

的结构
parent-project
  - model-project
  - service-project

在我的 build.gradle 父项目中,我定义了:

allprojects {
  apply plugin: 'jacoco'
  //apply other plugins

  repositories {...}

  test.finalizedBy(project.tasks.jacocoTestReport)

  jacocoTestReport {

    reports {

      csv.enabled false

      html{
        enabled true
        destination "${buildDir}/reports/jacoco"
      }

      xml.enabled false
    }

    additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
  }

  //other configurations

  buildscript {

    repositories {

      jcenter()
      mavenCentral()
      mavenLocal()
    }

    dependencies {
      classpath 'org.ajoberstar:gradle-jacoco:0.2.0'
    }
  }
}

当我一直执行这段代码时,我收到:

jacocoTestReport SKIPPED

所以我发现 this discussion 我意识到

jacocoRootReport doesn't work if some subprojects don't have any tests at all because this causes the onlyIf of JacocoReport to be false

我试过在最后插入下面的代码但是还是不行

task jacocoRootReport(type: org.gradle.testing.jacoco.tasks.JacocoReport) {
  dependsOn = subprojects.test
  additionalSourceDirs = files(subprojects.sourceSets.main.allSource.srcDirs)
  sourceDirectories = files(subprojects.sourceSets.main.allSource.srcDirs)
  classDirectories = files(subprojects.sourceSets.main.output)
  executionData = files(subprojects.jacocoTestReport.executionData)
  reports {
    html.enabled = true
    xml.enabled = true
    csv.enabled = false
  }
  onlyIf = {
    true
  }
  doFirst {
    executionData = files(executionData.findAll {
        it.exists()
    })
  }
}

我也试过在服务项目中创建一个测试...仍然没有用,跳过的消息仍然存在

我该如何解决这个问题?

配置不正确。至于我使用 TestNG 而不是 JUnit,我需要在 build.gradle

中指定它

所以我的父配置更改为:

subprojects {

  apply plugin: 'jacoco'
  //apply other plugins

  def coverageSourceDirs = [
    'src/main/java'
  ]

  repositories {...}

  jacoco {
    toolVersion = '0.7.5+'
  }

  jacocoTestReport {

    additionalSourceDirs = files(sourceSets.main.allSource.srcDirs)
    classDirectories =  files(sourceSets.main.output)
    sourceDirectories = files(sourceSets.main.allSource.srcDirs)

    reports {

      csv.enabled false

      html{
        enabled true
        destination "${buildDir}/reports/jacoco"
      }

      xml.enabled false
    }
  }

  test {
    useTestNG()
  }

  test.finalizedBy(project.tasks.jacocoTestReport)

  dependencies {

    testCompile "org.testng:testng:$testNGVersion"
    testCompile "org.hamcrest:hamcrest-all:$hamcrestVersion"
    testCompile "org.springframework:spring-test:$springVersion"
  }

  task jacocoRootReport(type: org.gradle.testing.jacoco.tasks.JacocoReport) {

    additionalSourceDirs = files(subprojects.sourceSets.main.allSource.srcDirs)
    classDirectories = files(subprojects.sourceSets.main.output)
    dependsOn = subprojects.test
    executionData = files(subprojects.jacocoTestReport.executionData)
    sourceDirectories = files(subprojects.sourceSets.main.allSource.srcDirs)

    reports {

      csv.enabled false

      html{
        enabled true
        destination "${buildDir}/reports/jacoco"
      }

      xml.enabled false
    }

    onlyIf = {
      true
    }

    doFirst {
      executionData = files(executionData.findAll {
        it.exists()
      })
    }
  }
}

JaCoCo Report Aggregation 插件在 gradle 7.4.2 中引入。

它将多个 JaCoCo 代码覆盖率报告的结果聚合到一个报告中。

使用testCodeCoverageReport任务并且不要忘记声明jacocoAggregationdependencies.