一盏小灯 我们的自动化之路 -- 一些技术之外的总结

Jerry li · 2023年10月21日 · 最后由 阿里阿多 回复于 2023年11月02日 · 8876 次阅读

背景

这段时间和小伙伴在整理我们当前的自动化运行模式。觉得有些技术之外的东西值得总结记录一下。

1. 自动化测试的定位、目的和对应策略

由于我们团队负责的是一个长期运营的产品,并且在可预见的未来,都会继续长期地运行下去。因此自动化测试的目的,就很直接和纯粹:

通过提高回归测试的自动化测试覆盖率,节省每个开发周期里的回归测试时间和工作量,成为季度版本、月度版本开发发布环节中的重要一环

为了实现这一目的,我们对自动化测试的范围进行了如下界定:

  1. 整理出完整的产品回归测试用例库
  2. 从回归测试用例库中,挑选出可被自动化的用例,打上 “待自动化” 的标签。这就是我们的自动化目标。
  3. 将所有待自动化的用例进行归类和拆分,根据模块分配到对应的同事头上,并制定具体的实施计划。
  4. 已完成自动化的用例打上 “已自动化” 的标签。这样可以很直接的通过 “已自动化”/“待自动化” 算出自动化进度;通过 “已自动化”/总用例数,算出自动化覆盖率。
  5. 每个开发版本结束后,整理更新产品回归测试用例库:根据产品的迭代更新,对回归测试用例进行增删改。
  6. 根据回归测试的级别不同,自动化测试用例也设置不同的级别标签,执行某个测试任务时可以精确匹配对应的测试用例。简单来说冒烟测试就只执行冒烟用例,全回归就执行所有用例。

通过梳理出以上的流程,团队对于我们的自动化任务的目的和计划都会有相对清晰的理解,大家执行起来也会更快速。

2. 如何让自动化测试真正帮助回归测试

上面讲到我们的自动化测试目的就是为了帮助回归测试。相信每个团队都有自己的思考和尝试。我们的做法是这样的:

背景:我们所有的测试用例和测试执行都是在 jira 上面管理。

  1. 将自动化测试脚本和 jira 用例进行一一关联。在每一条自动化测试用例的代码上,都备注上对应的是哪一条 jira 用例,标记上对应的 id。
  2. 每次回归测试时,都会通过 jira 建立对应版本的 test cycle,将所有回归测试用例拉到 cycle 中。这些就是本次回归测试需要测试的范围。
  3. 对应的自动化用例执行完成后,我们会在 Jenkins pipeline 中加入一步:读取整个测试中每条用例的执行状态,并通过 jira api,将 cycle 中的测试用例标记为通过。

通过将自动化用例和回归测试的管理真正打通,实现了每天晚上的自动化测试 pipeline 跑完之后,第二天马上可以看到有多少用例已被自动化执行通过。这样测试的同事只需要将剩下的用例(未被自动化,或者自动化执行失败)手工执行即可。

自动化测试覆盖率越高,自动化通过率越高,直接决定了回归测试中为团队节省的工作量。
直接让大家看到自动化测试的收益,才能更大程度地激励小伙伴们投入到自动化用例编写和维护的热情;而且从产出的角度来看,也确实节省了工作量。

3. 如何提高自动化测试的执行效率

在最开始的阶段,所有的自动化测试用例都是按线性的方式来执行的。随着用例数量的不断提升,整个测试任务的时间就会拉得越来越长,很明显不能满足未来的需求。
所以我们针对性地做了一些策略上的调整:

  1. 将单线程的任务改成多线程: 将整个测试库按照模块拆分成不同的集合,同时启动多个不同的子任务去执行。简单地看,1000 条用例拆分成 5 个子任务,理想状态下就是把执行时间缩短到 20%。
  2. 配合多线程任务,配置不同的测试帐号:由于我们系统上单点登录的,所以必须为不同的线程配置单独的测试帐号和测试数据。
  3. API 测试:结合测试框架的能力,设置多线程并发执行。

4. 针对不同的测试需求,设置不同的验证策略

一般的自动化测试用例,在用例的验证断言部分,通常的做法就是每个字段,每个元素都做一个断言。但在某些情况下,是有缺陷的:

  1. 某些页面上会特别关注页面布局,比如 app 的登录页面等。如果单个元素逐个去验证,即使元素都存在,也无法验证位置、大小、颜色是否正确。所以我们加入了图像对比的验证方式(diff image),即自动化到了这个页面的时候直接截图,和预设的期待图片进行对比。如果图片差别超出我们设置的阈值就直接报错,并且高亮两种图片中不一样的地方。这种方式就不需要关心页面每个元素对不对,而是更直接更准确地识别页面中的错误。
  2. 在 API 测试中,某些情况下我们需要回归验证整个返回中的每个字段、结构都是正确的。这种情况下我们也是可以通过 json diff 的方式,将测试返回和预设值进行对比,快速识别任何错误和变化。

总结

以上是我们其中的一些经验。虽然对于自动化测试来说,发展到现在有很多不同的语言、工具和框架来选择。但在真正做自动化的过程中,还是建议大家可以抛开具体的技术细节,去想如何完成和优化自动化这个工程。想法和思路是无限的,不要被技术的细节限制了自己。

共收到 18 条回复 时间 点赞

这需要耐心啊

这个过程中,个人最难的还是用例的持续维护,要面对诸如人员离职、架构变动、工作调整等一系列主动/被动变化带来的影响,对应的用例运营机制一定要明确、可执行可管理、考虑严谨。一旦维护跟不上就有破窗效应,越做越烂,最后被放弃。

王稀饭 回复

那没办法了,对于我们这种传统行业,产品已经存在了十几年,而且很可能在未来的十年里都会一直存在。即使已经迭代过好多批人,这些业务知识和用例也会一直存在,只是随着产品的更新不停地在微调和迭代。

赞!这才是最有效的自动化手段。最近面试经常被问到是如何做自动化的,本人都是回答楼主的第 1、2 点,可面试官大都关心用了什么框架,我真是服了。

自动化测试要考虑好投入产出比,否则不要轻易给领导承诺

这大概率是外企

ddDian 回复

看问题的不同角度而已,可能面试官着重考察的是你落地的能力

ddDian 回复

面试官关心地也许只是契约测试,楼主这偏向实际业务测试。楼主这套看起来简单,实际上背后需要很大的维护成本的,尤其在快速迭代的项目。关于自动化,有点自相矛盾的问题是,快速迭代的项目最需要自动化测试去帮助进行回归测试,但却很难做自动化测试,长期稳定缓慢迭代的项目好做自动化测试,却不那么需要自动化测试。

恒温 回复

是的,我们也是快跑了一段时间,但是效果不容易体现出来,才慢下来思考和改变。

aabbcc 回复

是的

每个任务都要考虑投入产出比和承诺时间啊
如果领导都支持你或者希望你能做,就把主要精力放在规划和计划上面,找领导支持; 不容易承诺,有时候在领导眼里就是没有干劲,畏首畏尾。

我不完全同意你的说法。
迭代快的项目不代表不适合做自动化,反而由于迭代频繁,回归测试的次数更多,对自动化的依赖更大。不然每周一个版本,每周一次全量回归,全靠手工测试,早晚把团队干废了。
只是对应的策略要适当调整: 既然迭代那么频繁,自动化的颗粒度是否可以粗一点? 代码是否用上了 po 模式,可以快速适应页面的变化? 自动化能不能左移,在需求确定下来之后,开发完成之前就把自动化调整好或者写好了?

自动化测试在我的团队里面不存在 “是否需要” 的争论。整套质量管理的流程下来,每一个步骤都可以这么讨论:单元测试需不需要?集成测试需不需要?需求设计评审需不需要?
在 “自动化是一定要做的” 这个前提下,团队的精力才会集中在怎么做得更好。

ddDian 回复

我也感觉。。。。而且还会问你自己有写过什么测试框架没。。。。。我心想我这工作内容又不是开发框架来的,明明就是为了服务业务的,如果时间紧,找个开源的二开也行,关键是怎么结合业务。但是现在真的很流行用开发的问题和思维去面试测试

总结的点还是可以的,博主用心思考了,我准备参照这篇文章,写一篇 MeterSphere 的版本。

我意思是业务自动化体系才是最核心的,使用了什么框架是次要的

LTV 回复

听起来就很厉害,给你点赞👍

可以,之前在富途也是采用的这套做法

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册