Gradle+Kotlin+JUnit5+Jacoco配置后覆盖率显示0%问题求助
解决Gradle+Kotlin+Jacoco+JUnit5覆盖率报告显示0%的问题
我之前也碰到过类似的坑,结合你的配置和描述,大概率是几个关键配置或路径问题导致的,咱们一步步来排查修复:
首先排查最容易踩的路径坑
你提到项目目录是project/{src,test}/main/kotlin——这可能是核心问题!正常Gradle Kotlin项目的测试代码应该放在src/test/kotlin下,而不是test/main/kotlin。如果测试代码位置不对,Gradle的test任务根本找不到你的测试用例,自然不会生成任何覆盖数据,报告显示0%也就不奇怪了。
先把测试代码移到src/test/kotlin目录下,这是第一步。
修正Jacoco配置中的关键问题
你的现有配置存在几个可以优化的地方,调整后应该能正常生成覆盖率数据:
1. 明确启用JUnit 5执行
在test任务里一定要加上useJUnitPlatform(),否则Gradle可能不会用JUnit 5去执行你的测试用例:
test { useJUnitPlatform() // 必须添加,开启JUnit 5支持 jacoco { append = false destinationFile = file("$buildDir/jacoco/test.exec") includeNoLocationClasses = true } }
2. 让Jacoco报告依赖测试任务
确保jacocoTestReport在测试执行完成后再生成,避免拿到空的执行数据:
jacocoTestReport { group = "Reporting" description = "Generate Jacoco coverage report." dependsOn(test) // 关键:先跑测试再生成报告 // 用源码集引用类目录,避免硬编码路径出错 classDirectories.setFrom(files(sourceSets.main.output.classesDirs)) // 同样用源码集引用源码目录,更可靠 def coverageSourceDirs = sourceSets.main.allSource.srcDirs sourceDirectories.setFrom(files(coverageSourceDirs)) additionalSourceDirs.setFrom(files(coverageSourceDirs)) // 引用test任务生成的Jacoco执行数据 executionData.setFrom(file("$buildDir/jacoco/test.exec")) reports { xml.enabled = true html.enabled = true csv.enabled = true } }
3. 升级Jacoco版本
你当前用的是0.7.9,这个版本比较老,对Kotlin和JUnit 5的兼容性不太好,建议升级到0.8.10+:
jacoco { toolVersion = "0.8.10" reportsDir = file("$buildDir/reports") }
确认你看的是正确的报告
你说在build/reports/test/html看到0%覆盖率,但这个路径其实是JUnit的测试结果报告,不是Jacoco的覆盖率报告!根据你的配置,Jacoco覆盖率报告应该生成在build/reports/jacocoTestReport/html/index.html,别搞混了路径哦。
验证步骤
- 运行
./gradlew test,看控制台输出,确认你的测试用例被执行了(会显示类似X tests completed, Y failed的信息)。 - 检查
build/jacoco/test.exec文件是否存在,这个文件是Jacoco生成的覆盖数据,不存在的话说明测试没执行或者Jacoco配置有问题。 - 运行
./gradlew jacocoTestReport,然后打开build/reports/jacocoTestReport/html/index.html查看覆盖率。
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

