自测覆盖率方案

93 阅读4分钟

##解决了什么问题 自测解决的是自测覆盖了哪些代码,并不能帮助发现逻辑错误,逻辑问题仍然需要开发自测时对 照测试ceas进行发现

##整体设计流程 整体流程

##设计原理

###自测覆盖率方案大致原理

  1. 主工程app 的build.gradle引入jacoco插件,自测过程中jacoco记录了哪些代码被调用,自测结束可将这些调用生成ec文件;
  2. 利用diff-cover库(Python库),根据当前分支(对每个项目需新建一个测试分支,例如:selftest分支)和目标分支(develop分支),筛选出当前需求增加的代码;
  3. 根据增量代码,去ec文件里面查找哪些代码时被调用过的,生成增量覆盖率报告;
  4. 报告中对增量代码覆盖率有明确量化,可以知道哪些增量代码是自测到的,哪些增量代码没有自测到(目前针对的代码,仅为main/java文件目录的代码),增量代码覆盖率也 可以作为开发和测试沟通的桥梁

##设计实现

###主工程接入jacoco

  1. 主工程app ,build.gradle引入jacoco插件
  2. 主工程基于jacoco插件,定义selfDiffTestReportTask,用于自测增量覆盖率统计

###Jenkins打包

  1. 定义jenkins流水线,拉取当前分支源码,进行打包(增加self_test字段,透传给覆盖了脚本,表示打自测包,覆盖率脚本会根据这个字段选择是否打开jacoco插件,生成覆盖率内存文件);
  2. 生成apk,apk名称可加上“自测”,标识这个apk是专门用来自测生成覆盖率的,可下载安装

###手机本地目录生成ec文件并上传

  1. 在合适的页面增加“生成自测覆盖率报告”按钮;
  2. 手工测试完成之后,点击“生成自测覆盖率报告”按钮,进行ec文件生成, 上传;
  3. ec文件生成后,利用Jenkins api 触发流水线,并携带ec文件;
  4. 上传完成后,弹出toast“自测覆盖率报告正在Jenkins上生成中,请前往Jenkins查看”,若 生成或上传失败,弹出“操作失败”
  5. 发现bug,覆盖安装之后,测试完成,生成ec文件时,依旧将结果写入到之前的ec文件中 (存储目录为:应用名/ec/分支名.ec,不存在清除问题)
  6. 在Jenkins查看报告之后,发现覆盖率较少,继续测试,生成ec文件时,依旧将结果写入到之 前的ec文件中
  7. 因为都是将后面生成的测试结果写到之前生成的ec文件,所有测试结果是累计的,修复某个 bug之后,不需要重新测试之前功能的情况
  8. 注意Jenkins不涉及存储ec文件,只是在当前流水线对于的文件中存放ec文件,流水线执行完成,生成报告之后,ec文件失效

###Jenkins生成增量覆盖率报告

  1. Jenkins服务器上安装diff-cover
  2. app中点击“生成自测覆盖率报告”后,会使用Jenkins api 触发自测job流水线
  3. 携带的参数有:ec文件,当前项目git地址,当前分支名称(selftest分支)

#####流水线步骤

  1. 根据git项目地址,分支名称,拉取当前分支,然后将携带的ec文件设置到当前分支目录
  2. 执行当前分支中的selfDiffTestReportTask,根据 (当前分支代码,对比分支代码,ec文件 )获取此次需求自测增量覆盖率报告
  3. 将覆盖率报告上传到Jenkins进行查看

##接入开发流程 ####方案1:

  1. mr人员对需求自测之后,触发Jenkins流水线获取覆盖率,将覆盖率存储到re数据库,例如redash数据库
  2. 开发人员提交代码时,通过jenkins流水线从redash数据库读取当前提交对应selftest分支的覆盖率,并评论到提交;

####方案2: 2. mr人员对需求自测之后,触发Jenkins流水线获取覆盖率,将覆盖率存储到re数据库,例如redash数据库

  1. 开发人员提交代码时,通过jenkins流水线从redash数据库读取当前提交对应selftest分支的覆盖率; a. 如果覆盖率不为空且大于目标覆盖率,并评论到当前mr,流水线成功,评论+1 b. 如果覆盖率为空或者低于目标覆盖率,则流水线失败,评论-1,
  2. mr人员自测之后,触发Jenkins流水线获取覆盖率,将覆盖率存储到readsh数据库,触发 jenkins流水线从redash数据库读取当前分支的覆盖率,并评论到当前mr,可以合并
  3. 紧急需求没时间自测,可让mr合并人员,发布#无需自测#,执行一个空操作流水线,成功后 合并