Jacoco在Gradle多项目中的应用

Jacoco在Gradle多项目中的应用,gradle,jacoco,Gradle,Jacoco,我在一些Gradle实现中使用了Jacoco,并决定改进它在多项目中的使用 我创建了一个类似于 parent-project - model-project - service-project 在我的build.gradle父项目中,我定义了: allprojects { apply plugin: 'jacoco' //apply other plugins repositories {...} test.finalizedBy(project.tasks.jac

我在一些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
所以我找到了我意识到的地方

如果某些子项目根本没有任何测试,jacocoRootReport将不起作用,因为这会导致jacoReport的onlyIf为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()
      })
    }
  }
}