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

2024-04-08 11:39:38 +08:00
 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

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

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

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

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

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

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

https://ex.noerr.eu.org/t/1030520

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

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

© 2021 V2EX