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

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

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

6383 次点击
所在节点    程序员
53 条回复
afxcn
253 天前
写好测试用例有时候比写代码本身还麻烦。
james122333
253 天前
我来解释一下为何 curl 非常好
首先 curl 有许多用法 最常用就是通常命令行的用法或者外加输出其他命令使用
但其实还能够写成脚本并带入变量 以下我从来没在公司用过 在公司我都故意写 shell+curl 命令写法
而不是 shell+curl 脚本写法
以下为小小范例 如果你如果同样是指令仔以下可以参考 命令行是很精妙的

#!/usr/bin/curl -K
variable: "%DOMAIN"
variable: "%QUERY=123"
expand-url: "https://{{DOMAIN}}/search?q={{QUERY}}"
header: "Test: 123"
header: "Test2: 789"
request: "GET"

第一行 variable 是从环境变量取得 DOMAIN 值
第二行 variable 是直接指派变量的值
第三行本来应写为"url:" 但由於需要置入变量需要前头"expand-"
第四五行为指定 header
第六行指定 method
所有选项可透过 man curl 查看双 dash 开头(--XXX)的参数参考
可加入注解

为什么你用 curl 该用这种方法
1. 方便管理 一个档案一个请求
2. 方便版本管控
3. 可搭配其他语言
4. 脚本即文档

我都讲了以后我可以在公司用了
james122333
253 天前
基本上还不只可以用作测试
毕竟还可以指定 output 输出档案,使用 cookie 等
iyaozhen
253 天前
@nuo7mi7 确实,目前(好) QA 就业面太窄了,只有大公司才能玩得动。之前百度的时候 QA 晋升明确是两条线:1 就是你说的项目推动,功能测试等部分 2 是技术线,做平台 中阶的话两则差不多,但往后确实技术线更好晋升
iyaozhen
253 天前
@cdlnls 我这么多年来看,主要是好 QA 的生存环境要求高,基本只有大公司才有空间。我同事都还好,比如提 bug 能定位到研发代码行模块/行。PM 需求评审能给出建设性意见
iyaozhen
253 天前
@msg7086 我的意思是要警惕过早优化陷阱。我们很多功能生命周期很短。和研发讨论也有类似困境,架构设计非常好、一行行代码死扣,但最终功能上线一个月就被砍了,甚至整个产品都没了
iyaozhen
253 天前
@james122333 哈哈哈 我说的 curl 只是代指,一些没有规划设计临时性的脚本,也包含本地 postman 临时请求
pojol7
253 天前
来试试 gobot 呢, 开源的游戏通用测试工具 https://github.com/pojol/gobot
pojol7
253 天前
1. c/s 架构,在 ci 中可以随意触发一个机器人进行接口测试
2. prefab 节点,每个逻辑节点都是一个 prefab 如果接口有变化,直接在 prefab 中修改,即可影响到所有引用的地方
3. 支持压力测试
4. 有状态(任何测试逻辑都可以进行准确覆盖
等等等
james122333
252 天前
@iyaozhen

我知道 但我觉得 curl 可以弄的很好
taihengw
252 天前
我做过 QA 岗位,也做过开发岗位,个人体验,软件开发本来是一个高度工程化的行业,和建筑业、制造业很像。但是国内由于软件发展时间较短+非常容易内卷的文化,把这个行业变成了一个劳动密集型的手工行业。所以本来全球范围内很多行业先例总结出来的优秀经验,在这里无法落地和被理解,更不用说被有效执行下来。再细化到开发和测试岗位,开发工作本身因为前面说的原因已经挤压变形为“手工纺织”行业,背后的工程规律被无视和践踏,相应的衍生行业:测试岗,就更加无法按照理性逻辑去理解。所以会出现很多同一概念执行结果千差万别的现象。我举个最简单的例子:冒烟测试,或者核心用例测试,拿这个概念去问 QA 行业的任何员工,100 个人可以出现 500 种不同的解释,而且无法达成共识。这就反映出行业的基本逻辑都非常混乱,所以整个行业有点无源之水、无根之木的虚浮感,总是感觉有很多可以做的事情,但是又很难理清哪些是重要的,哪些是次要的事情。根本的工程规律不被重视,其上生长出来的各种产物很难不畸形。就好像盖房子如果不按照基本的建筑原理和建筑进度来实施,在该筑梁的阶段不去筑梁,反而被一堆路人指指点点窗户位置不合适要去修改窗户,那么建筑工人永远也无法建出合格的房子,还会整日陷入疲于奔命的状态。
iyaozhen
252 天前
@pojol7 哈哈 我觉得不是工具的问题,我就是就平台的,但是没有开源,不然我敢说秒杀市面上绝大部分
iyaozhen
252 天前
@taihengw 老哥说的一针见血呀,但我想有机会还是可以把我局部的产品/业务做好,至少进步空间还是有的

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

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

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

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

© 2021 V2EX