Jacoco离线仪器Gradle脚本

时间:2016-12-28 22:48:13

标签: java gradle build.gradle jacoco

我试图寻找Jacoco离线工具gradle脚本片段,但找不到。是否可以通过gradle脚本进行Jacoco离线检测?如果是的话...它的一个例子就是伟大的。感谢。

4 个答案:

答案 0 :(得分:7)

以下是使用JaCoCo Ant任务执行脱机检测的Gradle脚本示例:

apply plugin: 'java'

configurations {
  jacoco
  jacocoRuntime
}

dependencies {
  jacoco group: 'org.jacoco', name: 'org.jacoco.ant', version: '0.7.9', classifier: 'nodeps'
  jacocoRuntime group: 'org.jacoco', name: 'org.jacoco.agent', version: '0.7.9', classifier: 'runtime'
  testCompile 'junit:junit:4.12'
}

repositories {
  mavenCentral()
}

task instrument(dependsOn: ['classes']) {
  ext.outputDir = buildDir.path + '/classes-instrumented'
  doLast {
    ant.taskdef(name: 'instrument',
                classname: 'org.jacoco.ant.InstrumentTask',
                classpath: configurations.jacoco.asPath)
    ant.instrument(destdir: outputDir) {
      fileset(dir: sourceSets.main.output.classesDir)
    }
  }
}

gradle.taskGraph.whenReady { graph ->
  if (graph.hasTask(instrument)) {
    tasks.withType(Test) {
      doFirst {
        systemProperty 'jacoco-agent.destfile', buildDir.path + '/jacoco/tests.exec'
        classpath = files(instrument.outputDir) + classpath + configurations.jacocoRuntime
      }
    }
  }
}

task report(dependsOn: ['instrument', 'test']) {
  doLast {
    ant.taskdef(name: 'report',
                classname: 'org.jacoco.ant.ReportTask',
                classpath: configurations.jacoco.asPath)
    ant.report() {
      executiondata {
        ant.file(file: buildDir.path + '/jacoco/tests.exec')
      }
      structure(name: 'Example') {
         classfiles {
           fileset(dir: sourceSets.main.output.classesDir)
         }
         sourcefiles {
           fileset(dir: 'src/main/java')
         }
      }
      html(destdir: buildDir.path + '/reports/jacoco')
    }
  }
}

答案 1 :(得分:2)

classesDir在Gradle 5中不可用,此离线检测代码在Gradle 5.1.1上对我有用

 task instrument(dependsOn: [classes, project.configurations.jacocoAnt]) {

 inputs.files classes.outputs.files
 File outputDir = new File(project.buildDir, 'instrumentedClasses')
 outputs.dir outputDir
 doFirst {
     project.delete(outputDir)
     ant.taskdef(
             resource: 'org/jacoco/ant/antlib.xml',
             classpath: project.configurations.jacocoAnt.asPath,
             uri: 'jacoco'
     )
     def instrumented = false
     if (file(sourceSets.main.java.outputDir).exists()) {
         def instrumentedClassedDir = "${outputDir}/${sourceSets.main.java}"
         ant.'jacoco:instrument'(destdir: instrumentedClassedDir) {
             fileset(dir: sourceSets.main.java.outputDir, includes: '**/*.class')
         }
         //Replace the classes dir in the test classpath with the instrumented one
         sourceSets.test.runtimeClasspath -= files(sourceSets.main.java.outputDir)
         sourceSets.test.runtimeClasspath += files(instrumentedClassedDir)
         instrumented = true
     }
     if (instrumented) {
         test.jvmArgs += '-noverify'
     }
 }
}


test.dependsOn instrument

以上代码摘自链接  请https://github.com/esdk/g30l0/commit/82af4c9aad50aadc40d940471fe1b934473170c7继续,以获取更多信息。

答案 2 :(得分:0)

答案https://stackoverflow.com/a/42238982/2689114对我有用(有些适应于较新的gradle版本)。

如果您有多模块gradle项目,则应添加一些额外的配置以支持跨模块代码覆盖。

有关更多详细信息,请参见Cross-module code coverage with Jacoco offline instrumentation in gradle mutlimodule project

还有一个有效的示例:https://github.com/SurpSG/jacoco-offline-instrumentation

答案 3 :(得分:-1)

gradle jacoco插件不支持离线检测,它总是通过java代理进行在线检测。

如果ant jacoco插件支持离线工具,这可能是让离线工具在gradle中工作的最佳方式