我试图寻找Jacoco离线工具gradle脚本片段,但找不到。是否可以通过gradle脚本进行Jacoco离线检测?如果是的话...它的一个例子就是伟大的。感谢。
答案 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中工作的最佳方式