我在这里遇到了很多人遇到的同样问题,即在使用 Jacoco/Gradle 和 Powermock 时获得正确的代码覆盖率信息。
我已经阅读了这里和其他地方的所有各种线程,并且我成功地创建了一个任务(对于 Gradle 6.4),该任务对我的项目类进行离线检测。作为参考,执行此操作的代码如下:
task instrumentClasses(dependsOn: [ classes, project.configurations.jacocoAnt ]) {
inputs.files classes.outputs.files
File outputDir = new File(project.buildDir, 'instrumented')
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
jacocoOfflineSourceSets.each { sourceSetName ->
if (file(sourceSets[sourceSetName as String].output.classesDirs.singleFile.absolutePath).exists()) {
def instrumentedClassedDir = "${outputDir}/${sourceSetName}"
ant.'jacoco:instrument'(destdir: instrumentedClassedDir) {
fileset(dir: sourceSets[sourceSetName as String].output.classesDirs.singleFile, includes: '**/*.class')
}
//Replace the classes dir in the test classpath with the instrumented one
sourceSets.test.runtimeClasspath -= sourceSets[sourceSetName as String].output.classesDirs
sourceSets.test.runtimeClasspath += files(instrumentedClassedDir)
instrumented = true
}
}
if (instrumented) {
//Disable class verification based on https://github.com/jayway/powermock/issues/375
test.jvmArgs += '-noverify'
}
}
}
现在,在大多数情况下,这似乎工作正常。我已成功验证我的课程现在已正确配置,并且我看到 Jacoco 生成的报告包含正确的信息。问题是我的 SonarQube 服务器仍然将有问题的类列为未涵盖的类。关于这一点,我不知道我需要做什么来解决它。
作为参考,我正在使用以下版本的 sonarqube 插件:
"org.sonarqube" version "2.7"
我的 CI 以以下方式运行 Gradle 任务:
- ./gradlew jacocoTestReport sonarqube ${SONAR_GRADLE_EXTRA_PARAMS} -Dsonar.projectKey=${CI_PROJECT_ID} -Dsonar.host.url=${SONAR_URL} -Dsonar.login=${SONAR_LOGIN} -Dsonar.branch.name=${CI_COMMIT_REF_NAME};
我确实知道这一定是 SonarQube 或我运行 Gradle 任务的方式的一些配置问题,但我不确定罪魁祸首是什么。