测试人社区

[笔记] Android Jacoco代码覆盖率统计

Jacoco方案-offline

最开始想用on-the-fly模式统计Android的代码覆盖率, 但是不可以, 所以只能使用offline模式.原因如下:

android的apk包本质上不是jar,是一个被编译为android指令的dex包,指令上不一样,所以jacoco不能通过agent修改,但是可以通过jacoco提供的离线编译的方式操作。

Android 源码配置JACOCO步骤

1. 使用Android studio下载Android项目源码, 这个工程是gradle+kotlin的配置

2. 参考xinxi的文章, 在项目中加代码, Java代码可以自动转变为kotlin代码.

xinxi的文章: https://testerhome.com/topics/17066
gradle-jacoco官方文档: https://docs.gradle.org/current/userguide/jacoco_plugin.html

2.1. 在工程app路径下的build.gradle

2.1.1 在工程app路径下的build.gradle添加jacoco 依赖和jacoco 版本

2.1.2 在上面的文件build.gradle中, buildTypes里, 打开testCoverageEnable

2.1.3 在上面的文件build.gradle中, dependencies里, 添加依赖

2.1.4 在上面的文件build.gradle中, 添加jacoco生成report的task

2.2 在工程app路径下, 添加jacoco代码, 用于在手机端生成jacoco文件


2.3 在工程代码的app main方法里, 添加代码, 什么时候结束并保存数据


企业微信截图_98ae21b7-a50a-4620-a09b-12bd9d2ff9ee

Jacoco Report 生成步骤

  1. 打包APP debug包->安装在手机上→打开APP, 测试→APP退到后台, 根据代码里写的手机的/sdcard/jacoco里有coverage.ec的文件注意, 首先要给APP授权存储权限
  2. 把手机上的coverage.ec文件, 上传到Android源码中
    adb pull /sdcard/jacoco/coverage.ec gitProject/XXX(项目)/app/build/outputs/code-coverage/connected
    code-coverage/connected 的路径如果在项目中没有, 手动添加
  3. 执行jacocoTestReport

企业微信截图_605b93b5-2f8c-4c11-b8b0-33525bcde1af

  1. 在下面路径中, 可以看到生成的jacocoReport

企业微信截图_1e00bfca-4fa6-4281-931c-ccf37a4e9d09

  1. 使用浏览器打开index.html, 获得代码覆盖率报告

  2. 覆盖率报告如何查看

踩坑记录

1. jacoco在手机上的文件创建失败

  • 原因: /sdcard/jacoco/coverage.ec路径创建失败
  • 过程:
    Files.createDirectory(mCoverageFileDirectory.toPath())
    Files.createDirectory(),会捕获异常, 打印出真正失败的原因:
    java.nio.file.AccessDeniedException: /sdcard/jacoco
  • 解决方法: 手机上的文件存储权限打开

2. 生成jacoco报告失败

  • 过程: gradle jacocoTestReport
  • 报错: Cannot set the value of read-only property ‘classDirectories’
  • 解决方法: 确定下面两个文件夹和文件存在,没有手动添加

3. jacocoReport打开后是空白

  • 错误提示: app: no class files

  • 原因: 代码的源文件没有找到, 配置了错误的路径dir: ‘./build/intermediates/classes/debug’
  • 解决办法: 确认自己项目编译后的源码地址, 添加到dir:后面

参考文章