覆盖率报告(Coverage Report)是一种软件测试工具生成的报告,用于评估测试用例对代码的覆盖程度。它通过统计代码中哪些部分已经被测试用例执行过,哪些部分还没有被执行,来衡量测试的充分性。覆盖率报告通常包括以下几种类型的覆盖率指标:
1.行覆盖率(Line Coverage):
- 衡量代码中每一行是否被至少执行过一次。
1.行覆盖率(Line Coverage):
- 衡量代码中每一行是否被至少执行过一次。
2.分支覆盖率(Branch Coverage):
- 衡量代码中每个条件分支(如if语句、switch语句等)是否都被执行过。
3.函数覆盖率(Function Coverage):
- 衡量代码中每个函数是否都被调用过。
4.语句覆盖率(Statement Coverage):
- 衡量代码中每个语句是否都被执行过。
5.路径覆盖率(Path Coverage):
- 衡量代码中所有可能的执行路径是否都被覆盖到。
覆盖率报告的作用:
1.评估测试质量:
- 通过覆盖率报告,开发人员和测试人员可以了解当前测试用例对代码的覆盖情况,从而评估测试的质量和充分性。
2.发现未测试的代码:
- 覆盖率报告可以帮助识别那些从未被执行过的代码段,这些代码段可能存在潜在的缺陷或逻辑错误。
3.优化测试用例:
- 根据覆盖率报告,可以针对性地增加或修改测试用例,以提高代码的覆盖率,确保更多的代码逻辑得到测试。
4.提高代码质量:
- 通过提高代码覆盖率,可以减少代码中的潜在缺陷,提高软件的整体质量和可靠性。
5.支持持续集成:
- 在持续集成(CI)流程中,覆盖率报告可以作为一个重要的指标,帮助团队监控和维护代码质量。如果覆盖率低于某个阈值,可以触发警报或阻止代码合并。
6.辅助代码审查:
- 覆盖率报告可以作为代码审查的一部分,帮助审查人员更好地理解代码的测试情况,从而提出更有针对性的改进建议。
7.风险管理:
- 通过覆盖率报告,项目管理者可以更好地评估项目的测试风险,制定相应的风险管理策略。
2.3.1 Android生成全量报告
Jacoco插件有完整的一套覆盖率相关功能,所以当采集了覆盖率数据文件后,就可以生成覆盖率报告。这样没有指定变化的内容,直接对整个项目生成的报告是全量报告,目前有两种生成覆盖率报告的方法,我们将逐一介绍。
一,Gradle任务生成报告
1,添加gradle任务
在采集了覆盖率数据文件,要生成覆盖率任务的项目中,找到app的gradle文件,添加如下任务:
task jacocoTestReport(type: JacocoReport) {
reports {
xml.enabled = true
html.enabled = true
}
def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*']
def debugTree = fileTree(dir: "$buildDir/intermediates/javac/debug", excludes: fileFilter)
def mainSrc = "$project.projectDir/src/main/java"
sourceDirectories.from = files([mainSrc])
classDirectories.from = files([debugTree])
executionData.from = files("$buildDir/outputs/code_coverage/debugAndroidTest/connected/coverage.ec")
}
注意:
- sourceDirectories:项目的源码文件,要指到java层,否则报告中无法渲染代码覆盖情况。
- classDirectories:项目构建的类文件,注意是插桩后构建的文件,但在javac文件夹下。
- executionData:覆盖率数据文件路径,如果没有这个路径,请创建这个目录,并把上节下载的覆盖率数据文件放到这个目录中,重新命名。
2,生成覆盖率报告
添加任务后同步项目,可以看到gradle文件中对应任务的左侧有一个执行标示,单击选择"Run Android....."

Android Studio输出如下,生成覆盖率报告。

也可以在命令行下执行 ./gradlew jacocoTestReport,同样能生成报告。报告路径如下:app/build/reports/jacoco/jacocoTestReport/

二,命令行生成报告
Jacoco还可以不使用Android Studio直接使用命令行生成报告,此时需要下载jaoco的包: EclEmma - JaCoCo Java Code Coverage Library,下载指定的包,如我们使用的0.8.7的包。

打开压缩包,找到libs文件夹,就可以看到jacococli.jar包,这个就是要使用的工具。

命令使用方法:
java -jar ${jacococli.jar的路径} report ${exec文件路径}
--classfiles ${类文件路径} --sourcefiles ${源码文件路径,要到/src/main/java}
--encoding utf-8 --html ${报告路径}
所以生成上面项目的覆盖率报告,命令行方法可以是:

报告内容和上面完全一样:

2.3.2 Android增量报告(Incremental Report)
增量报告是指在连续的构建或测试过程中,仅显示相对于上一次构建或测试的变化部分的报告。这种报告方式主要用于跟踪和分析代码覆盖率的变化,特别是在持续集成(CI)和持续交付(CD)环境中非常有用。
增量报告的特点
1.变化部分:
- 增量报告只关注当前构建与上一次构建之间的差异,而不是整个项目的完整覆盖率。
- 例如,如果某个文件在上一次构建中已经完全覆盖,而在当前构建中没有新的测试用例,增量报告将不会显示该文件的覆盖率信息。
2.效率:
- 通过只显示变化部分,增量报告可以更快地生成和解析,减少资源消耗。
- 在大型项目中,增量报告可以显著提高构建和测试的速度。
3.问题定位:
- 增量报告有助于快速定位新引入的代码或测试用例对覆盖率的影响,便于开发者及时发现和修复问题。
4.持续集成:
- 在持续集成环境中,增量报告可以作为构建过程的一部分,帮助团队实时监控代码质量的变化。
- 例如,如果新提交的代码导致覆盖率下降,增量报告可以立即提醒开发人员进行修正。
增量报告的应用场景:
1.代码审查:
- 在代码审查过程中,增量报告可以帮助审查者快速了解新提交的代码对现有测试用例的覆盖情况,确保新代码的质量。
2.持续集成:
- 在持续集成系统中,增量报告可以作为构建过程的一部分,自动检测每次提交对代码覆盖率的影响,确保代码质量的持续改进。
3.回归测试:
- 在回归测试中,增量报告可以帮助测试人员快速识别新引入的代码是否引入了新的问题,确保回归测试的高效性。
2.3.3 生成增量报告的方案
网上生成增量报告的方案很多,介绍性文档较多,具体使用效果不得而知。主要集中在如下几种:
1,diff-cover

项目地址: GitHub - Bachmann1234/diff_cover: Automatically find diff lines that need test coverage.,通过python处理diff信息以及生成增量覆盖率报告。
缺点:增量信息较多时,处理速度慢。生成报告样式和jacoco完全不同,有一定的学习成本。
2,增量插桩
根据需求的diff信息,在引入jacoco插件时,进行针对性插桩,生成报告的时候只生成插桩的文件,具体方案网上有本处不再展开: https://juejin.cn/post/6920029313316159502。
缺点:生成报告符合要求,但是无法同时采集全量覆盖率数据,在日常测试过程中需要同时生成全量和增量的覆盖率报告,此方案需酌情使用。

3,二次开发jacococli工具
网上的开源项目: jacoco: jacoco二开,支持增量代码覆盖率 ,可以通过命令行指定diff信息,并根据diff信息生成报告,渲染增量代码,完全符合要求。

缺点:需要有一定的开发能力,对项目重新打包;项目较老,需要做相应的修改。
覆盖率相关功能是精准测试平台的核心,为了更好的开发我们的平台,增量报告采用第三种方案,下节将详细介绍如何使用此方案。