一、背景介绍:
随着业务与需求的增长, 回归测试的范围越来越大,测试人员的压力也日益增加。线上仍然会存在回归不到位或测试遗漏的地方导致出现线上故障。因此我们通过jacoco的集成测试覆盖率统计框架,来判断的回归范围是否精准、测试场景是否遗漏,尤其是新增功能,新增代码是否被验证。针对这一点,我们提出了Android测试覆盖率统计工具, 借此来辅助我们更全面的进行测试,减少线上问题的发生。
二、工具选择:
Android开发语言为java,Java常用覆盖率工具为Jacoco、Emma和Cobertura,结合三者的原理、覆盖程度,我们选择Jacoco来作为我们的第三方。
获取覆盖率数据是要提前在代码中完成插桩工作。针对字节插桩可以分为两种:1、On-The-Fly(在线插桩) 2、Offliine(离线插桩)
根据Android特性,我们确定了Android Jacoco覆盖率是采用离线插桩的方式。
三、实现原理:
1、Jacoco覆盖率原理:
JaCoCo通过ASM在字节码中插入Probe指针(探测指针),每个探测指针都是一个BOOL变量(true表示执行、false表示没有执行),程序运行时通过改变指针的结果来检测代码的执行情况(不会改变原代码的行为),其中,探针是使用了一个boolean数组, 只要执行过对应的路径就对boolean数组进行赋值, 最后对boolean进行统计即可得出覆盖率。
2、Offliine覆盖率统计原理:
四、具体实现方案:
1、 Android工程中需要在build.gradle添加jacoco插件,以及在buildTypes里, 打开testCoverageEnable开关:
- 在工程app路径下的build.gradle添加jacoco插件。
- 在build.gradle中, buildTypes里, 打开testCoverageEnable开关。
2、android jacoco SDK实现方案:
集成了jacoco.jar,生成ec文件并上传到ftp,上传IP,机型,版本号以及分支名称。
3、AndroidJacocoService实现方案:
Sever端接收到安卓客户端上传的信息(ec文件、机型、版本号以及分支名称),完成新建task,并添加到数据库,调用AndroidJacocoService生成覆盖率报告,更新数据库。最后展示到覆盖率报告平台。
五、效果展示:
六、总结
通过覆盖率报告,可以逆向反推在代码设计中思维混乱点,提醒开发人员理清代码逻辑关系,提升代码质量;并且可以判断出冗余代码,进一步提升开发人员的代码质量。成为测试、开发自我审视的重要工具之一。