自测覆盖率

90 阅读3分钟

流程

  • 1,开发人员需求开发完成后,将代码提交到需求分支
  • 2,使用Jenkins对需求分支进行打包,打包好后,下载自测
  • 3,自测完成,点击一个按钮,触发jenkins自测覆盖率流水线,生成h5增量覆盖率文件,发送金山协作消息,将报告链接和覆盖率通知对应人员
  • 4,需求分支覆盖率会记录在数据库,mr合并时,使用gitlab流水线,根据源分支读取自测覆盖率,达到目标覆盖率,流水线成功,可是合并,未达到,流水线失败,不能合并

实现具体步骤 前提,我们的项目实现了组件化,并且组件都是打成aar的形式被项目引用

  • 1,所有组件定义全量覆盖率task,统计所有代码覆盖率,具体就是在所有组件的build.gradle引入jacoco插件,在编译流程的class到dex阶段,jacoco会对我们的方法插入探针,实际上就是申明一个aar数组,对方法的每行插入一行aar[i]=true的代码,能执行到当前行,这个数组中行对应的数值就被设置成true,然后就知道哪些行被执行了,自测结束后,我们可以通过反射调用jacoco的一个getExecutionData的方法,将自测结果生成ec文件,生成报告的时候就可以根据这个数组对报告文件进行染色
  • 这是统计所有代码的自测覆盖率,但是我们开发需求的时候,可能之关系我们需求的覆盖率,所以还要统计增量覆盖率
  • 2,所有组件定义增量覆盖率task,统计增量代码覆盖率,这个task依赖全量覆盖率的task,执行完全量覆盖率task后,利用diff-cover库,根据当前分支和目标分支,筛选出当前需求增加的代码,根据增量代码,去ec文件里面查找哪些代码时被调用过的,生成增量覆盖率报告
  • 3,主工程的app build.gradle中定义一个全局覆盖率task,查询到所有组件的增量覆盖率任务,并执行。
  • 4,Jenkins打包,根据选定的分支,拉取源分支代码,解析项目中的依赖文件,解析出修改的组件,根据组件pom文件,获取组件项目名,分支名,然后拉取对应分支,进行级联,然后执行assemble任务进行打包,这个任务会传入主工程当前需求分支名称。
  • 5,打包之后,下载到apk到手机自测,自测完成后,点击一个按钮,生成ec文件,使用Jenkins api并触发Jenkins自测覆盖率流水线,携带ec文件和主项目需求名称。
  • 6,Jenkins自测覆盖率流水线也是首先拉取主项目需求分支代码,和修改的组件分支代码,级联之后,执行app module build.gradle中自定义的全局覆盖率统计任务
  • app中的jacoco统计覆盖率任务,会统计出所有组件中的jacoco覆盖率统计任务,然后分别对执行,
  • 执行完之后,将h5类型覆盖率报告通过Jenkins的publishHTML 上传到Jenkins页面进行查看
  • 另外还会统计出所有组件覆盖代码覆盖行数和总行数,计算出一个总体覆盖率,根据分支名,记录到redash数据库,并通过金山协作发送消息,将覆盖率通知对应人员
  • 7,mr的时候会使用gitlab流水线根据分支名读取需求自测覆盖率,使用gitlab api将覆盖率评论到mr下面,达到目标覆盖率,流水线成功,可是合并,未达到,流水线失败,不能合并,不通过之后进行自测,自测之后,会使用gitlab api根据需求分支查找主工程mr,在使用gitlab api对mr触发一个流水线