一、背景介绍:

      随着业务与需求的增长, 回归测试的范围越来越大,测试人员的压力也日益增加。线上仍然会存在回归不到位或测试遗漏的地方导致出现线上故障。因此我们通过jacoco的集成测试覆盖率统计框架,来判断的回归范围是否精准、测试场景是否遗漏,尤其是新增功能,新增代码是否被验证。针对这一点,我们提出了Android测试覆盖率统计工具, 借此来辅助我们更全面的进行测试,减少线上问题的发生。

二、工具选择:

     Android开发语言为java,Java常用覆盖率工具为Jacoco、Emma和Cobertura,结合三者的原理、覆盖程度,我们选择Jacoco来作为我们的第三方。

    获取覆盖率数据是要提前在代码中完成插桩工作。针对字节插桩可以分为两种:1、On-The-Fly(在线插桩) 2、Offliine(离线插桩)

android 代码测试覆盖率 测试覆盖率平台_Android

根据Android特性,我们确定了Android Jacoco覆盖率是采用离线插桩的方式。

三、实现原理:

1、Jacoco覆盖率原理:

JaCoCo通过ASM在字节码中插入Probe指针(探测指针),每个探测指针都是一个BOOL变量(true表示执行、false表示没有执行),程序运行时通过改变指针的结果来检测代码的执行情况(不会改变原代码的行为),其中,探针是使用了一个boolean数组, 只要执行过对应的路径就对boolean数组进行赋值, 最后对boolean进行统计即可得出覆盖率。

android 代码测试覆盖率 测试覆盖率平台_Android_02

2、Offliine覆盖率统计原理:

android 代码测试覆盖率 测试覆盖率平台_android 代码测试覆盖率_03

四、具体实现方案:

1、 Android工程中需要在build.gradle添加jacoco插件,以及在buildTypes里, 打开testCoverageEnable开关:

  • 在工程app路径下的build.gradle添加jacoco插件。

android 代码测试覆盖率 测试覆盖率平台_java_04

  • 在build.gradle中, buildTypes里, 打开testCoverageEnable开关。

android 代码测试覆盖率 测试覆盖率平台_android_05

2、android jacoco SDK实现方案:

集成了jacoco.jar,生成ec文件并上传到ftp,上传IP,机型,版本号以及分支名称。

3、AndroidJacocoService实现方案:

Sever端接收到安卓客户端上传的信息(ec文件、机型、版本号以及分支名称),完成新建task,并添加到数据库,调用AndroidJacocoService生成覆盖率报告,更新数据库。最后展示到覆盖率报告平台。

android 代码测试覆盖率 测试覆盖率平台_Android_06

五、效果展示:

android 代码测试覆盖率 测试覆盖率平台_Android_07

android 代码测试覆盖率 测试覆盖率平台_java_08

android 代码测试覆盖率 测试覆盖率平台_android_09

六、总结

      通过覆盖率报告,可以逆向反推在代码设计中思维混乱点,提醒开发人员理清代码逻辑关系,提升代码质量;并且可以判断出冗余代码,进一步提升开发人员的代码质量。成为测试、开发自我审视的重要工具之一。