【发布时间】:2015-07-20 14:06:19
【问题描述】:
可以在此处找到包含用于此问题的代码的 Github 存储库: https://github.com/thenewmr/UnitTestCoverageExample
我们在尝试通过正确生成 Jacoco 获取代码覆盖率报告时遇到了严重问题。
我们已经关注了互联网上的各种指南,包括 this one 和 Patrick McLaren,他在他的 answer 中链接到这个 question。
我们还研究了有关堆栈溢出的各种问题,但到目前为止还没有什么乐趣。
这是我们目前所掌握的(以项目符号的形式,以免这个问题太长而无法阅读):
- 将
testCoverageEnabled = true添加到调试闭包中创建了一个名为“createDebugCoverageReport”的任务 -
运行此任务:
- 在以下位置为我们的 Android 测试生成报告:app/build/outputs/reports/androidTests/connected/index.html,其中包含测试通过和失败等的准确报告
- 但覆盖率报告不准确(0% 覆盖率)位于:app/build/outputs/reports/coverage/debug/index.html
- 它还会在以下位置生成看似空的覆盖率数据:app/build/outputs/code-coverage/connected/coverage.ec
-
现在,如果我们添加以下内容:
apply plugin: 'jacoco' //specify which directories should be examined by jacoco def coverageSourceDirs = [ 'src/main/java' ] task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") { group = "Reporting" description = "Generate Jacoco coverage reports" classDirectories = fileTree( dir: 'build/intermediates/classes/debug', excludes: ['**/R.class', '**/R$*.class', '**/*$ViewInjector*.*', '**/BuildConfig.*', '**/Manifest*.*'] ) additionalSourceDirs = files(coverageSourceDirs) sourceDirectories = files(coverageSourceDirs) executionData = files('build/jacoco/testDebug.exec') reports { xml.enabled = true html.enabled = true } }
到应用程序的 build.gradle 文件(有或没有上面的位)并运行 jacocoTestReport,我们得到:
- 原版单元测试的测试报告位于:app/build/reports/tests/debug/index.html
- app/build/reports/jacoco/jacocoTestReport/html/index.html 上的准确代码覆盖率报告
因此,我们得到了适用于普通单元测试的正确内容,但不适用于 Android 单元测试。
上面提到的blog post 讲的是如何合并两个报告。但是如果我们一开始就不能得到Android测试覆盖率报告,那似乎就没有意义了。
问题似乎是由于前面提到的空 coverage.ec 文件。
这个答案说这曾经是一个错误: https://stackoverflow.com/a/28080713/487812
这个错误报告说这个问题已经修复: https://code.google.com/p/android/issues/detail?id=78556
但也许它作为回归被重新引入?我们是否遗漏了一些明显的东西?
【问题讨论】:
标签: android unit-testing gradle code-coverage jacoco