十多年了,接口自动化测试越来越鸡肋?

254 天前
 iyaozhen

引言

从《 Google 软件测试之道》到后来的敏捷开发、DevOps ,10 多年了,接口自动化测试一直是测试领域必谈的重点。各种自动化测试工具( Postman 类)、自动化测试框架、自动化测试平台层出不穷,每个公司/部门甚至每个团队都有一套直接的自动化解决方案。但盲目投入后,反而会感觉越来越鸡肋,食之无用弃之可惜。

接口自动化的价值

不管你是 B/S 还是 C/S 架构,APP 还是小程序,还是什么协议,总体来说是由 GUI 和服务端 API 组成。通常一个迭代是 PM 需求、RD 开发/联调、QA 单功能测试、bugfix(穿插多轮)、合码 QA 集成/回归测试、发版。在这一套模式下,大家常说的接口自动化测试(暂不考虑 UI 自动化)的价值如下:

提高测试效率/降低人力成本?

因为自动化测试执行很快,所以引入接口自动化测试能提高测试效率。但有个很现实的问题,接口自动化只覆盖了服务端 API ,GUI 这部分也有很多逻辑,RD 也是有大量工作量投入的,这部分的测试是少不了的。即使是偏服务端 API 的功能,你的手工 GUI 测试替代率是多少?接口自动化执行完了能不需要手工测试吗?这恐怕不敢打包票吧。所以对于一个端到端的测试团队,反而接口自动化 case 的编写和维护成了额外的负担。

降低人力成本也是无稽之谈,因为你手工 GUI 测试的成本并没有降下来,反而需要投入写接口自动化的人力。除非你之前就有一批人是使用 Curl 测接口的。

提高测试覆盖率?

这个理论上有道理,一些接口参数分支,UI 上无法走到,通过接口则可以直接覆盖到,提升了覆盖率,后面 UI 上增加了此分支能保证基本的质量,提升迭代效率。但事实上产品变化很快,还没等覆盖到新参数分支,需求又变了,接口甚至都得重写一遍。掉入了过早优化的陷阱。

持续集成和持续交付( CICD )!

互联网大部分开发模式都是迭代开发、小步快跑。接口开发完成后还没到测试环节,这时候跑一遍自动化(回归测试),能保证基础功能没影响,代码就可以合入了,过几天就自动进入到测试环节。也能尽早发现问题,缩短交付周期。

同时还可以用作线上监控,保障服务稳定性。

保证结果的一致性和准确性!

手工用例总是需要人理解然后执行,因为各种原因,不同的人可能对同一条 case 理解不一样,造成执行偏差。然后人总有惰性,虽然很少,但偶尔还是会有因觉得执行过程偷懒而导致的漏测。而接口自动化一旦成为规模,执行的结果就是可靠的。

总的来说,如果你是想只通过接口自动化这一种方式降本提效,那接口自动化可能会事与愿违。而是应该把提质作为目的,即接口自动化作为质量保障的重要手段,尽早的写(不应该在服务上线了补),穿插到整个研发生命周期里面去,才能发挥更大的作用(特别是现在 DevOps 时代)。合适的度量指标:线上问题召回率(基本不可能通过手工召回)、自动化 Bug 发现比率(含 CICD 过程中发现的)。

接口自动化的成本

在评估自动化收益的时候我们常用这样一个公式:自动化收益 = 迭代次数 x (手工执行成本 – 用例维护成本)- 用例编写成本。但在接口自动化中不太合适,前面也说了,接口自动化和手工测试并不对等,并不是替代人工。不过自动化测试的成本倒是可以通过类似的公式计算:运行次数 x 用例维护成本 + 用例编写成本。这可能和大家想象的不一样,接口自动化通常被认为是边际成本很低,即用例编写成本会随着运行次数增加而摊薄。但事实上维护成本也不低,而且无法摊薄,因为不运行就不需要维护,只要运行就会出问题,就需要排查、维护。

维护成本的来源可能是多方面的,虽然都有一定的解决办法,但不能忽视这部分的成本,而且分散在日常中还是隐性成本,如果做的不好,甚至会出现团队都很累,但质量又很差的情况。

维护成本来源 解决方案
接口参数不兼容改动,需要相关 case 都改动 接口适当封装,case 使用封装后的模板或函数,方便使用和维护
前置变量失效导致 case 失败,比如商品 id 或者说一个新环境的适配成本 一方面 case 里面不能写死 id ,需要变量化,数据和逻辑分离;另一方面,case 需要自给自足,相关依赖资源在前置操作中产生,并在后置操作中销毁
case 间的量子纠缠 适当的执行用户隔离,一些资源操作加锁

很多测试框架/平台把重点放在写 case 这块,但其实都没 Postman 好用,不过也有一些新方式,比如流量录制导入。但拉长 case 周期来看,编写成本是一次性的,10 分钟写完一条 case 和 1 小时写完一条差别不大。更多的应该放在如何写好 case (场景构造、数据准备等)、维护好 case ,这才能降低最终的成本(放心没广告)。

总结

还是那句话:软件工程没有银弹。鸡肋不鸡肋要看目的,降本增效可能不是直接的收益。同时也要注意接口自动化维护成本也不小,需要重点投入解决这块的问题,才能使最终的 ROI 高。

当然,本文看着还是泛泛而谈,并没有说接口自动化该如何写,但我认为具体怎么写都是招式问题,先修一下内功心法总纲更重要。


分享自本人博客: https://iyaozhen.com/api-automation-test-tasteless.html

市面上测试远没有开发火热,我说的可能比较片面,但也希望大家讨论讨论,丰富下这块的话题

6381 次点击
所在节点    程序员
53 条回复
cleanery
254 天前
要不然微软砍掉测试部后, win10 怎么 bug 这么多呢?
经过多年的小白鼠人工测试, 终于稳定下来了.
securityCoding
254 天前
功能变动太快了,版本覆盖率还没上来呢下个版本就动刀
opentrade
254 天前
开源
yule111222
253 天前
接口自动化测试通常是外部 QA 团队做黑盒测试
测试反馈周期长,维护成本高,测试力度也不行,撑死在整个自动化测试的占比不要超过 10%

真正的自动化测试肯定是黑盒测试,要跑在 CI 环节的,代码提交 5 分钟内就要有反馈
yule111222
253 天前
@yule111222 说错一句,真正的自动化测试肯定是白盒测试
nullboy
253 天前
OP 为什么会得出这样的结论? pytest 的 conftest, fixture ,hook, parametrize,repeat,reruns,dist 这些不必 postman 强大的多。另外,我一直认为录制的测试用例屁用没有
> 很多测试框架/平台把重点放在写 case 这块,但其实都没 Postman 好用
iyaozhen
253 天前
@opentrade 额 开源是啥意思?
iyaozhen
253 天前
@yule111222 嗯嗯 你说的这个赞同

但 [接口自动化测试通常是外部 QA 团队做黑盒测试] 这个和我知道了不一样,可能我都是在互联网公司,这块并没有外包或者类似项目审计那种
iyaozhen
253 天前
@nullboy 不好意思,说的不准确。应该分两种,1 是工具类,很多轮子,但其实都是类 postman ,甚至很多功能没 postman 全
2 是代码框架,这个就和语言相关了,比如 Python 基本都是 pytest 上封装。这两类间本身不能比较

降低编写成本是很重要,但更应该关注维护成本。我想这也是你说录制的 case 没用的原因,录制一时爽,维护火葬场
nullboy
253 天前
@iyaozhen 给你分享一组数据。从 2023.1.6 至今,我们自动化项目共执行了 1978 次,共执行用例 81,930 个,共发现 bug 50+。所以,我不认为自动化测试越来越鸡肋
yule111222
253 天前
@iyaozhen #8 额,外部的 QA 团队不是指代外包,就是公司内的 QA ,我始终认为 QA 没有存在的必要
gsky411
253 天前
能节省自己回归测试时间的自动化测试才有用,否则都是扯淡
iyaozhen
253 天前
@nullboy 执行次数没啥意义吧,你们总 bug 数多少呢? 我们自动化发现的 bug 比率极低
zephyru
253 天前
自动化接口测试...和 postman 不是一码事吧,postman 也就调试阶段能用用...发现自己开发的问题顶天了。
自动化接口测试除了线上环境监测外还能对持续迭代时做保障,使新的修改不会对以前关联的老功能造成连锁破坏,工程大了/时间长了之后,单平台全量手工回归在成本上几乎是不可接受的事情。其它那些测试用例的关联关系天然的是平台业务的说明书,如果人员流动性大,有的时候有做这些功能的测试就是最理解业务的人了。
测试针对业务平台写自动化接口测试就和研发写单元测试一样,场景/项目没有复杂到一定程度时,的确容易投入和产出不成正比,但还远没到鸡肋的地步。
forQ
253 天前
测试团队=接口自动化 + UI 自动化 + 手工测试,三个不同的小组。
linuxsuren
253 天前
欢迎关注采用 Apache 协议的接口测试开源项目 https://github.com/LinuxSuRen/api-testing
1tangmizou
253 天前
@iyaozhen 一样,人工发现远大于自动化发现的 bug
ecloud
253 天前
每天下班前要求所有人 push 稳定代码,然后跑一个 daily build ,之后自动跑一套 apifox 的回归测试。早上来了看测试报告,谁的接口有问题扔给谁去看
当然这只适合中小型项目,大型项目 daily build 不现实
接口测试的真谛不是做完了程序再去写 case ,而是先在 apifox 这种软件里设计接口,写好 mock ,之后程序做好了往上一套(可能会有些修改)就直接用了
aiwoshishen
253 天前
@yule111222 非常赞同
iyaozhen
253 天前
@yule111222 哈哈 那我不得“失业”了。QA 这个岗位可能不需要,但质量保障这个事情还得需要

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1030520

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX