乐趣区

关于devops:阿里巴巴如何进行测试提效-阿里巴巴DevOps实践指南

编者按:本文源自阿里云云效团队出品的《阿里巴巴 DevOps 实际指南》,扫描上方二维码或返回:https://developer.aliyun.com/topic/devops,下载完整版电子书,理解阿里十年 DevOps 实践经验。

在任何业务倒退的过程中都会不可避免的面临服务的收缩,利用复杂度的减少,可继续测试的难度一直减少。一方面,用例集会一直的收缩,一次 CI 验证要数十分钟,用例的保护老本越来越高,开发效率开始升高。另一方面,咱们花了精力写了很多自动化用例,心愿可能进步投入产出比,也就是测试的有效性。

晋升测试速度

分布式测试

分布式测试的核心思想是通过减少计算资源,并发的对 case 进行执行,并在执行后对测试产生的结构化后果进行解析合并,进而晋升单次测试的执行速度。

整个测试的执行过程能够划分为以下三个阶段:

  • 测试用例解析与散发
  • 分组用例的执行
  • 分组测试后果合并

以阿里云某云产品外围团队的某工程为例,该工程领有 1 万多个单元测试用例,在没有采纳分布式测试计划之前,一次 CI 的验证时长超过 4 小时,导致问题发现、修复时长拉长,影响了日常的迭代速度。该团队后采取了分布式测试的形式进行,均匀的执行时长被优化到了半小时以内。

分布式测试的实质就是用执行资源的重叠,去换取更快的执行速度。实践上咱们把每一个测试用例拆分到一个容器内执行,能够取得极致的反馈速度。然而并不是所有场景下都适宜采纳分布式测试,例如用例之间存在依赖,这些用例不能无差别的散布在不同的执行分组。

精准测试

分布式测试很大水平上解决了测试执行的速度问题。然而如果在任何状况下都无差别的执行全量的用例,会存在一些问题:

  • 对计算资源的节约
  • 引入了大量的有效执行
  • 用例自身稳定性问题导致排查工夫节约
  • 在摸索测试有效性的过程中,咱们引入了精准测试的计划

什么是精准测试?

通过建设测试用例与业务办法的关联关系,在代码发生变化时,精准的举荐出须要运行的用例,进行测试执行与后果反馈。通过精准的圈定测试范畴,能够带来效率和速度的双重收益。

精准测试的基本要素

  • 测试用例(Case)与利用代码办法(CodeMethod)关联关系的建设。这种关联关系,咱们定义为 基线
  • 代码产生变更,依据 基线 中用例与利用代码办法的关联关系,精确举荐出 变动的办法、关联的测试用例和变动的测试用例,并进行运行

如何建设测试基线

  • 基线的建设形式有多种,在阿里巴巴外部应用过以下两种办法去建设用例与代码的关联。
  • 通过字节码注入的形式,埋入 trace 调用,并在调用中传入用例与业务办法的签名。通过采集 trace 的日志,拿到所有的测试用例与办法调用链路,建设起用例与办法的关联关系。
  • 通过 AST 解析的形式。

如何进行用例举荐

在代码产生变更后,会基于代码变更解析出变动的测试用例与变动的业务办法。办法的变动通常是新增、删除、更新。

用例的代码变更状况比较简单,所有新增和更新的用例都会纳入到回归范畴。

被测利用代码变更,要分状况思考:

  • 新增 的办法:匹配不到任何用例,针对此次变更,开发或测试可能补充了测试用例,也可能未补充,须要进行提醒。
  • 更新 的办法:更新的办法分两种状况,第一种,更新的办法有关联的用例,须要举荐进去;第二种,更新的办法本来就没有关联任何用例,须要提醒用户补充测试用例进行笼罩。
  • 除的办法:删除的办法也分两种状况,第一种,该办法自身就不关联任何测试用例,不做任何提醒;第二种,该办法关联了一些测试用例,那么思考到办法有可能只是重构或者更名的状况,这部分关联的测试用例在没有被删除的状况下,也是须要进行回归的。

阿里云某外围云产品,通过应用精准测试的计划,一个迭代了一周左右的代码变更,从原先每次 CI 须要全量执行 3700+ 用例,到每次 CI 能够精准的执行变更影响的用例范畴。速度晋升了近一倍,测试范畴放大到不到原先的 1/6。


晋升测试有效性

咱们心愿编写和运行的测试用例可能无效的笼罩代码的逻辑,其中重要的一个着手点是测试覆盖率,通过测试覆盖率来裸露问题,并促成问题的解决。

测试覆盖率

测试覆盖率,在本文中,指的是代码的覆盖率。即行覆盖率,分支覆盖率等。

此外,本文中所有波及覆盖率采集的示例都以 Java 为例。

如何收集残缺的覆盖率

一个利用下通常存在多种不同类型的自动化测试集

  • 单元测试
  • 手工测试
  • API 测试
  • WebUI 测试
  • 其余

为了可能精确的反映一个利用的残缺覆盖率,须要对上述多种自动化测试的后果进行聚合。在阿里,每一个测试的运行都会关联到相应的利用,从而能够对测试后果进行聚合。

为了可能收集所有类型的测试覆盖率,咱们做了以下事件:

单元测试

对于单元测试来说,覆盖率数据产生在单测执行的机器上,咱们会依据执行机上的原始代码信息,编译后的 class 信息,单测执行后产生的覆盖率数据原始文件,以及变更的代码信息,计算出单元测试的覆盖率报告。

手工 / 自动化测试

咱们实现了一个覆盖率采集客户端,和一个覆盖率采集 / 报告计算解析的覆盖率平台。通过运维平台将覆盖率采集客户端部署到利用的集成环境,在利用启动时会挂载一个 javaagent 过程。当咱们在任意测试平台触发任意类型的自动化测试时,会告诉覆盖率平台与覆盖率采集客户端进行交互,实现覆盖率计算原始数据的采集与解析。

另外,在进行公布卡点时,咱们会合并相应的单测覆盖率造成残缺的覆盖率报告。

测试覆盖率能给研发过程带来哪些价值

  • 剖析未笼罩局部的代码,从而反推在后期测试设计是否充沛,没有笼罩到的代码是否是测试设计的盲点,为什么没有思考到?需要 / 设计不够清晰,测试设计的了解有误,工程办法利用后的造成的策略性放弃等等,之后逐渐补充测试用例。
  • 代码覆盖率高不能阐明代码品质高,然而反过来看,代码覆盖率低,代码品质不会高到哪里去,能够作为测试自我扫视的重要工具之一。
  • 剖析变更代码的笼罩状况,从而保障对变更的测试充沛,加强公布成功率与信念。

除了上述的“测试覆盖率”,还能够应用雷同的技术来统计“线上业务对代码的笼罩状况”。也就是统计进去有哪些代码是被真正的线上业务所用到的,哪些是素来没有被调用到的。从而检测出程序中的废代码,能够逆向反推在代码设计中思维混乱点,揭示设计 / 开发人员理清代码逻辑关系,晋升代码品质。

增量覆盖率

有了残缺的测试覆盖率数据之后,就能够让它发挥作用了。但脱离了具体的场景,独自谋求一个较高的测试覆盖率数值是没有意义的。如果一味的谋求较高的覆盖率的数值,往往带来的的是用例的适度设计。如何衰弱无效的让我的项目的测试覆盖率稳步的晋升,在阿里巴巴外部,咱们更多的是采纳关注增量覆盖率的形式来晋升整体的测试覆盖率。

什么是增量覆盖率

增量覆盖率是指,某一次测试过程中,变动的代码的测试笼罩状况。

变动的代码 = 被测分支的代码与指标比照分支的 diff(通常指标比照分支是咱们最终会合入的分支)。

增量覆盖率 = 变动的被笼罩的代码行 / 变动的代码行。

增量覆盖率的价值

  • 公布之前是否存在漏测
  • 针对漏测欠缺用例集
  • 加强变更公布的成功率与公布信念
  • 通过谋求增量覆盖率进而进步被测利用的整体测试充沛度

增量覆盖率的利用

在单元测试的时候,会有单元测试的增量覆盖率,在测试 / 预发等环境进行各种接口自动化 /UI 自动化 / 流量回放 / 手工测试时,也会有增量覆盖率产生。当增量覆盖率与继续交付流水线进行联合时,可能无效的保障我的项目品质是在往好的趋势倒退。

在阿里巴巴外部的实际中,咱们通常会在 CICD 流水线中的要害阶段设置各类卡点,保障在多人合作的场景下,每个开发同学提交进入集成的代码通过充沛的自测。在上线前的集成阶段,进入的代码在集成环境中被充沛验证后,才会被容许公布上线。

通过增量覆盖率的反馈,开发 / 测试同学能够针对性的去补充各类测试用例,尽可能的保障在各阶段不存在测试脱漏。同时,在一直的欠缺测试集的状况下,我的项目的整体测试覆盖率也会失去衰弱无效的晋升。

线上覆盖率

覆盖率的采集咱们通常不会利用到线上环境中,然而如果将覆盖率采集放到线上环境,又能演化出利用瘦身的场景,帮忙咱们从另外一个角度晋升效率。

通常在线业务的服务都会部署多个正本,为了缩小危险,咱们会在其中的大量正本上进行覆盖率采集。通过一个较长的采集周期后,会生成线上覆盖率报告。在这个时候能够认为被笼罩到的代码都是无效代码,而剩下的那些长时间没有流量笼罩的代码,须要审慎的思考删除 / 重构。通过这样的形式去精简咱们的代码,从而升高保护老本。

在阿里巴巴外部,当咱们决定对某些保护艰难或者腐化显著的利用进行重构时,都会进行一段时间的线上覆盖率采集,并依据报告去领导咱们进行代码重构,代码瘦身。

小结

分布式测试为测试速度插上了翅膀,精准测试无效的辨认出了测试的范畴,增量覆盖率又为测试的一直齐备提供了无利的指引,线上覆盖率帮忙咱们无效的进行利用瘦身。充分利用好这些技术手段进行测试提效,能够让继续交付的过程更加的顺畅。

【对于云效】

云效,云原生时代一站式 BizDevOps 平台,反对公共云、专有云和混合云多种部署状态,通过云原生新技术和研发新模式,助力翻新守业和数字化转型企业疾速实现研发麻利和组织麻利,打造“双敏”组织,实现 10 倍效力晋升。

立刻体验

退出移动版