在 jacoco 报告中显示来自 jar 包的外部源

Show external sources from jar package in jacoco report

我们在 java 项目中使用带有 gradle 插件的 jacoco 来计算覆盖率。 问题是我们把从 XML 生成的 类 放在一个额外的项目中,并将其作为依赖项解决。我们也想要这些模型的代码覆盖率 类 来分析它。检查我们是否在映射器 类 中使用了数据容器的所有 setter 方法。模型项目中的代码覆盖不是一个选项。

目前 jacoco 仅在报告 (html/xml/csv) 中显示我们在主项目中的 类 而不是外部 jar 的 类。当我用 eclipse 或 intellij 加载它时,jacoco 会话包含覆盖率数据。

buildscript {
... 
    dependencies {
    ...     
        classpath 'externalpackage:externalpackage-model'
    ...
    }   
}

compile('externalpackage:externalpackage-model:0.0.8')  
testCompile('externalpackage:externalpackage-model:tests@jar')
testCompile('externalpackage:externalpackage-model:0.0.8:sources@jar')

jacoco {
    toolVersion = "0.7.6.201602180812"
    reportsDir = file("$buildDir/customJacocoReportDir")
}
jacocoTestReport {
    reports {
        xml.enabled true
        csv.enabled true
        html.enabled true
        html.destination "${buildDir}/jacocoHtml"        
}   

additionalSourceDirs files('externalpackage:externalpagage:0.0.8:sources@jar')
//Doesn't work either
//additionalSourceDirs files('C:/Users/sero/Downloads/test/externalpackage-0.0.8-sources')
//additionalSourceDirs = files('C:/Users/sero/Downloads/test/externalpackage-0.0.8-sources/de/mycompany/.../MyModelClasses.java')
}

jar源码包是这样的: (根)/de/mycompany/.../MyModelClasses.java

也许有人有想法

自己找的。问题是,您还需要指定 类 的路径。

我将 jars 解压缩到构建文件夹中,并将 additionalClassDirs 和 additionalSourceDirs 添加到报告作业中。

这是构建文件。

configurations {
    externalClasses 
    externalSources
}

dependencies {
    externalClasses "externalpackage:externalpackage-model:0.0.8@jar"
    externalSources "externalpackage:externalpackage-model:0.0.8:sources@jar"        
    ...
}

buildscript {
... 
    dependencies {
    ...     
        classpath 'externalpackage:externalpackage-model'
    ...
    }   
}

compile('externalpackage:externalpackage-model:0.0.8')  
testCompile('externalpackage:externalpackage-model:tests@jar')
testCompile('externalpackage:externalpackage-model:0.0.8:sources@jar')

jacoco {
    toolVersion = "0.7.6.201602180812"
    reportsDir = file("$buildDir/customJacocoReportDir")
}

task unzipExternalModel(type: Copy){
    from zipTree(configurations.externalSources.files.first())
    into "$buildDir/tmp/externalSources"
    from zipTree(configurations.externalClasses.files.first())
    into "$buildDir/tmp/externalClasses"
}

jacocoTestReport {
    dependsOn unzipExternalModel
    reports {
        xml.enabled true
        csv.enabled true
        html.enabled true
        html.destination "${buildDir}/jacocoHtml"        
    }   
    additionalSourceDirs = files("$buildDir/tmp/externalSources")
    additionalClassDirs = files("$buildDir/tmp/externalClasses") 
}

仅作记录,使用 7.1.1,此代码(受文森特的启发)有效:

test {
    useJUnitPlatform()
    finalizedBy jacocoTestReport
    jacoco {
        includes = ["com.mycompany.**"]
        includeNoLocationClasses true
    }
}

task unzipLibrariesJar(type: Copy){
    into "$buildDir/tmp/libClasses"
    from {
        configurations.runtimeClasspath
            .filter { it.path.contains("mycompany") }
            .collect {zipTree(it) }
    }
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

task unzipLibrariesSrc(type: Copy){
    into "$buildDir/tmp/libSources"
    from {
        configurations.runtimeClasspath
                .filter { it.path.contains("mycompany") &&  new File(it.getPath().replace(".jar", "-sources.jar")).exists() }
                .collect { new File(it.getPath().replace(".jar", "-sources.jar")) }
                .collect { zipTree(it) }
    }
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

jacocoTestReport {
    dependsOn test
    dependsOn unzipLibrariesJar
    dependsOn unzipLibrariesSrc
    reports {
        html.enabled true
    }
    additionalClassDirs.from = files("$buildDir/tmp/libClasses")
    additionalSourceDirs.from = files("$buildDir/tmp/libSources")
}

请注意,我只对“com.mycompany”包的所有 类 的日志感兴趣。您应该根据您的要求进行更改。