十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

自动化测试脚本越多越好?我们删掉一半后交付效率反而提升30%

自动化测试脚本越多越好?我们删掉一半后交付效率反而提升30% 直接说结论我们上个季度删掉了将近一半的自动化测试脚本结果版本交付周期反而缩短了30%以上。这个事在团队内部复盘时引起了不少争论后来跟几个同行交流发现类似的情况并不少见——自动化覆盖率明明在涨交付效率却在跌。今天就把这个“效率悖论”掰开揉碎聊一聊顺便把我们的判断逻辑、操作方法和踩坑记录都整理出来给正在为自动化脚本数量焦虑的团队一个参考。先说清楚背景。我们是一个做Web端和App端业务的研发团队测试这边维护了两套UI自动化框架Web端一套App端一套另外还有Python写的接口自动化层。去年中期统计的时候光是UI层脚本就积累了2700多条。听起来挺壮观对吧但真实情况是每次发版跑全量回归光执行时间就要四五个小时而且总有几十条用例随机失败需要人工一条条确认是真Bug还是脚本问题。测试同学每天被这些“狼来了”的告警淹没真正该投入精力的新功能测试反而被挤得没时间做。到后来部分开发同学甚至养成了习惯——看到自动化报红就默认“大概率是脚本挂了”先不管等测试确认再说。这种情况下自动化不但没有给交付提速反而成了流程里最不稳定的那一段。先说结论自动化测试脚本并不是越多越好覆盖率也不是越高越好。真正该关心的是“每一行测试代码对交付质量的边际贡献”。当维护成本、执行噪音、误报率开始吃掉自动化带来的收益时脚本数量再涨只会让交付越来越慢。下面我把整个分析过程、具体操作和避坑细节全部分享出来。1. 效率悖论的成因为什么自动化脚本越多交付越慢1.1 从“资产”变成“负债”的临界点很多团队对自动化测试都有一个朴素的认知用例数量多 回归覆盖全 版本质量稳 交付快。这个等式在前面两三百条用例的时候确实成立但过了某个临界点之后反转就出现了。我们做过一次内部统计。选取过去三个月的发版数据把冒烟、回归阶段的所有自动化用例按模块拆分记录每条用例的执行结果、最近十次的失败率、关联的Bug数量。结果发现将近45%的用例在过去两个月里没有发现过任何一个缺陷。这些用例里有一大半是在页面元素稍微调整后就跟着改一遍脚本纯粹是为了“让回归继续跑绿”。但问题在于你每多维护一条低价值的脚本就多了一个可能因定位超时、异步加载慢、弹窗遮挡、环境数据不干净而失败的“随机因素”。这些随机因素会造成多少浪费我们粗算过一次全量回归里因脚本本身不稳定导致的假失败平均需要测试同学花两到三分钟去确认。单看不多但乘以一轮回归几百条假失败就是十几个小时的人力成本轻轻松松把省下来的时间加倍还回去。这个现象学术界和工程社区都讨论过最典型的叫“自动化测试收益递减曲线”——新增脚本的早期收益增长很快到中后期每多一条脚本带来的额外保障在降低而消耗的维护精力和新增的不稳定性却在上升。两条曲线交叉的位置就是自动化这个“资产”开始变成“负债”的临界点。1.2 维护成本与执行噪音的恶性循环脚本越多维护成本和执行噪音就会形成恶性循环。团队里最常见的一个场景就是UI自动化测例因为一个按钮文案改动就红了。你需要定位是前端改版还是测试数据问题然后修改定位器、或更新快照提交代码再重跑。这一套操作下来最短也小十分钟。如果你的脚本里又有大量硬编码等待、依赖页面执行顺序、共享测试数据这些隐患那维护起来就更酸爽。执行噪音是另一个容易被人忽略的点。几百上千条脚本挂在那里每天定时任务跑完汇总一出来满屏飘红——其中真正因为代码改动引入的缺陷可能只有两三个其他全是脚本自身的稳定性问题。负责的同事必须逐条点进去看日志判断“这个是定位器失效”“这个是环境挂了”“这个是超时了”等他把真正有效的两三个Bug提取出来一上午已经过去了。假以时日团队慢慢会对自动化告警失去敏感性甚至出现“自动化报红也不影响合代码”的默契。这时候自动化测试不但没帮助你提升质量反而给了团队一个虚假的安全感大家以为测过了其实什么都没测准。2. 脚本存废判断我们如何决定删哪些、留哪些2.1 用“价值矩阵”代替“覆盖率”做评估删除脚本不是凭感觉乱删需要一套可量化的标准。我们用四个维度给每一条自动化用例打分发现缺陷的有效价值、执行稳定度、维护成本、业务重要性。先看“发现缺陷的有效价值”这个最简单——拉最近两到三个月的Git提交记录和缺陷管理系统看这条用例有没有真实拦截过回归缺陷。没有拦到过任何缺陷而且覆盖的功能点本身也很少变动那它大概率是低价值。有个Web端的购物车用例覆盖了“删除商品后价格联动”的场景过去四个月拦截过三次价格计算的回归Bug保留优先级就非常高。再看另一条用例覆盖的是一个几乎没人用的旧版报表导出入口过去半年只跑过两回从未失败过也没拦到过Bug代码变更从来也不会波及它这种就属于凑数用例删掉对公司业务没有任何损失。再看“执行稳定度”。我们统计每条用例最近20次执行的情况计算失败率。稳定度差的脚本就算业务价值高也要想解决办法因为如果十次有五次是脚本自身的误报它的置信度就太低了团队根本不敢依据它的结果做判断。这种脚本要么花时间根治要么降级成手动用例根据情况再考虑是否保留。最后看“维护成本”。参考的是过去三个月里这条脚本被修改的次数以及每次修改的平均耗时。有些脚本涉及复杂的跨模块数据预置每次排查环境问题就要花很多时间这种脚本哪怕偶尔能抓到Bug投入产出比也是负数。2.2 四类脚本的处理策略根据评分结果我们把2700多条UI脚本分成了四类分别采取不同的处理手段类型特征处理方式数量示例A类高价值高稳定拦截过缺陷、失败率低、维护少核心回归集优先保留约650条B类高价值低稳定能发现缺陷但总误报针对根因修复后保留约300条C类低价值高稳定几乎不发现问题但跑得稳合并冗余降低轮转频率约700条D类低价值低稳定既不发现问题又总出错直接删除或彻底重写约300条C类这批最纠结说它没用吧它还稳定说它有用吧它半年不发现一个Bug。我们的经验是让C类从每次全量回归中退出来改成每周跑一次或仅在相关模块大改时临时触发。这样既保留了一定的覆盖兜底又不会拖累日常交付。D类最不需要犹豫。这些脚本往往是从前人手里继承过来的用的定位方式早就过时了页面结构也改了好几轮。直接删除然后通过代码提交历史确认下一次真要覆盖这个功能点时用新的最佳实践重新写。3. 实操过程七天完成大刀阔斧的脚本裁剪3.1 准备阶段数据收集与基线评估我们的裁剪动作没有搞突击式的大会战而是花了整整两天做数据收集。把CI平台上所有自动化任务的输出日志、Git历史、缺陷关联记录全部汇总到一张表里。这个动作很枯燥但非常值得因为后续所有的删留判断都要靠这些数据支撑。如果没有数据你没法跟团队成员解释“为什么这条用例要删”说不清楚就会引发争论。数据怎么收集Git历史可以看每条用例文件的修改频率Jenkins或GitLab CI都能导出任务执行历史包括耗时、通过率、失败日志。缺陷管理系统里如果你们有在提交信息里关联用例编号的习惯那关联分析会更准确。我们当时还跟开发团队对了几个关键模块近三个月代码变更频率防止删掉覆盖高频变动区域的用例。3.2 执行阶段先砍D类再重构B类C类降频开始动手的时候我们遵循一个原则先做减法再做优化。具体执行分三步走。第一步删除所有D类脚本。当时有300来条直接在代码仓库里清空文件记录下删除清单等人评审确认。这里特别强调一下不是删完就完事了还要在测试计划管理平台里同步停用对应的测试用例不然就会出现“脚本没了但用例还在”的乌龙——手动执行时按照用例列表跑一遍跑到不存在的脚本一脸懵。第二步处理B类脚本。这300条左右的高价值但低稳定用例不要急着全保留也不能直接删。我们挑选了其中最有代表性的100条逐个查看最近失败日志定位根因。至少有三分之一的问题集中在测试数据不独立、用例之间互相依赖、硬编码等待这三类原因上。比如有一批用例都复用了同一个登录账号只要其中一条触发风控机制后面十几条全挂。改成各自独立创建测试数据之后稳定性一下子就上来了。剩下那部分短时间无法根治的我们也做了标记在回归集里暂时排除等工作日补上专项修复。第三步C类脚本降频。从原来的每次全量回归必跑改成每周跑一次。这个改动是在CI配置里直接调整的把任务触发器改成“每周日凌晨2点”。这就已经能省下回归流程整体30%以上的执行时长。3.3 验证阶段用两个稳定版本验证裁剪结果裁剪完成之后关键的一步是验证因为我们不能刚删完脚本就宣布胜利。我们的做法是后续两个发版迭代继续做全量回归但用的是裁剪后的脚本集跑同时人工补偿一部分手动冒烟测试。前两个版本团队花了额外大概一天的人工测试时间但执行结果非常稳定没有再出现满屏假失败。而且因为执行时间从原先四五个小时压缩到了一个半小时左右整个回归反馈的速度快了很多开发这边合代码、发版的等候时间也短了。两个版本之后我们抽查了线上问题反馈没有出现因为删除脚本而漏测引起的生产级别缺陷。当然这也不是说删除就一定安全但结合人工抽样结果和线上监控数据我们有理由相信这次裁剪的判断逻辑是对的。4. 自动化架构与工具层面的配套调整4.1 重新思考UI自动化的适用边界删除脚本只是表象本质上我们对“什么场景该做UI自动化”这个问题的认知升级了。UI自动化的核心价值在于验证端到端的核心用户流程比如登录、下单、支付、消息触达这种跨模块链路。它不适合用来做大量分支细节的穷举验证。页面上的边界值、异常输入、权限校验这些用接口测试和数据驱动的方式来做效率高得多也稳定得多。以前我们的误区是把UI自动化当成“大而全”的回归网什么东西都想用UI去覆盖。结果就是脚本集膨胀、维护瘫痪。正确做法是功能层面用接口测试覆盖尽量多的逻辑分支UI自动化只保留最核心的“业务烟囱”。接口层失败率低、执行快、定位问题快是性价比最高的自动化投入方向。这个认知可以解释为什么很多团队接口自动化用例数量是UI自动化的两三倍但维护成本反而更低。4.2 测试数据独立性与用例可重复性顺便聊聊测试数据独立性问题这是我们遇到的B类不稳定用例的主要病因之一。很多测试同学写脚本时喜欢直接复用现成的数据比如“取数据库里username等于test1的那条记录”。一旦数据被人改了、删了或者被另一条用例锁定脚本就开始失败。我们在重构B类用例时达成了一个约定每个用例执行前通过API接口或数据库脚本创建自己的独立测试数据用完后清理或者在专门构造的测试环境里不必强制清理。这个改造工作非常琐碎但做完之后整个用例集的稳定性是肉眼可见地往上走。如果你也面临大量Flaky用例优先查测试数据隔离性大概率能解决一半以上问题。4.3 合理利用录制生成与AI辅助脚本工具还有一个点容易被忽略就是很多团队在初期做自动化时喜欢用UI自动化录制生成脚本的工具。这类开源项目尤其针对Web端和App端确实能大幅降低脚本编写门槛但录出来的脚本往往存在通病——定位器冗长、操作步骤冗余、等待策略不科学。用这类工具快速产出原型可以但一定要在后期有专人review和重构。如果团队一味追求脚本数量拿着录制工具批量生产脚本那基本等于在未来半年内给自己堆了一座维护的“债务山”。最近AI相关的辅助测试工具也慢慢多起来比如利用LLM直接生成测试脚本有些能自动识别页面元素并生成稳定定位器。这类工具还在快速迭代中我们的经验是可以让它们做“草稿生成”但绝不能跳过人工评审。毕竟AI生成的脚本同样可能覆盖无效流程、使用不稳定的选择器甚至验证点不够明确。5. 团队考核与认知升级防止自动化反弹5.1 从“脚本数量”到“质量效率”的指标切换要想脚本裁剪这件事不反弹光靠一次性的清理不够还得从团队的工作方式和考核指标上动刀子。以前我们团队会用“自动化用例总数”“覆盖率”“每周新增脚本数”这类指标来衡量测试团队的工作量。这些指标的存在会让团队成员下意识地疯狂堆脚本——因为写新脚本是容易被看见的成绩。现在我们把指标逐步切换成“自动化发现的有效缺陷数”“全量回归执行时间”“接口测试覆盖率”“脚本失败率非缺陷导致”。这些指标更接近“自动化到底对交付有没有帮助”这个本质。如果你也是团队管理者或技术负责人强烈建议你审视一下团队周报里的指标。凡是鼓励堆数量的大概率都会走向低效。把考核导向“稳定性”和“有效性”之后大家才会愿意去删脚本、修脚本、重构脚本而不是只写新的。5.2 测试团队的时间重新分配脚本少了人是不是就闲了这个问题一定会在管理层被问。事实是我们省出来的时间全部投到了新功能测试和探索性测试上。就是以前被自动化回归挤占掉的那些环节——复杂的线上兼容性排查、性能波动的分析、核心链路的手动冒烟、以及更深入的需求评审和用例设计。开发提测之后我们不再需要先把四五个小时的回归跑完才能反馈结果而是先把核心链路快速冒烟掉接口自动化同步跑几分钟后就能给出“整体通过还有两个高危模块需要重点测”的结论。这带来的不仅是时间缩短更是整个研发节奏的改善。5.3 新用例准入“冷静期”为了防止未来脚本库再次膨胀我们定了一个“新用例冷静期”机制任何新的UI自动化用例上线之后必须连续稳定通过30次执行并且累计发现至少1个有效缺陷或者所在的模块发生过回归缺陷才能正式进入核心回归集。达不到这个标准的用例只能放在“候选池”里不参与全量回归。这个机制一举两得。第一它倒逼写用例的同学在提交前就把脚本质量做好第二它成功阻止了大量“为了凑覆盖率而写脚本”的冲动。很多同学在写脚本之前会先问一句“这个用例真的有必要自动化吗”这就是我们想要的效果。6. 常见问题与避坑指南6.1 删脚本时最怕团队情绪反弹最后聊一下在操作过程中可能遇到的一系列实际问题尤其是各种阻力。第一道坎来自团队成员的情绪。有人写了很久的脚本你突然说要删他会觉得这是对他工作的否定。我们的做法是事先把数据摆出来优先说明“不是否定你的能力而是这套自动化方案在当前阶段性价比不高”。同时尽量让写脚本的同学参与分析和判断过程让他自己得出“这条用例要删”的结论而不是让负责人直接下命令。这个过程需要一些耐心但比起硬推带来的团队怨气这点沟通成本非常值。第二道坎是“万一删出线上问题怎么办”的恐惧。没得解只能靠数据建立信心。我们在删除后连续两个版本的人工补偿测试就是这么来的用人工测试的结果来验证自动化的判断没有漏掉关键场景。跑两个版本之后大家心里有底了反对声音自然就小了。6.2 执行环境稳定是自动化的地基如果你的自动化本身构建在很不稳定的执行环境下比如测试环境经常挂、服务经常重启、数据经常被污染那删除多少脚本都无济于事。环境稳定是所有工作的地基。先跟运维和开发把测试环境的部署流程、数据构造机制、网络隔离开销问题理顺再来谈自动化优化。我们当时花了很大的力气在环境建设工程上包括测试环境的容器化部署、种子数据管理、依赖服务Mock方案。地基打好了脚本稳定性才有提升的可能。否则你会陷入一种“删也删不完修也修不好”的泥潭。6.3 Flaky用例的常态化治理最后强调一个观点Flaky用例要尽快根治而不是容忍。很多团队的自动化任务里常年挂着十几条随机失败的用例谁也不去处理时间一长大家就习惯了。这是一个非常危险的信号。如果不及时治理Flaky用例会像病毒一样扩散——因为写脚本的人看到别人的脚本也这样“偶尔红”就会不自觉地降低对自己脚本的要求。我们团队后面规定但凡一条用例在连续十次执行中出现超过两次非预期失败责任人必须在一周内完成根因排查和修复否则用例自动移出回归集待修复验证后才能回归。这个机制一开始执行压力挺大但坚持几个月之后自动化全集的稳定性越来越高反而省下了更多时间。6.4 别忘了一句话总结其实这个现象背后有一个朴素的道理自动化的初衷是帮人节省时间但当它本身成为一种需要大量时间供养的东西你需要的是砍掉它而不是继续喂养它。芯片行业有句话叫“没有完美的设计只有取舍的艺术”软件测试工作也是一样。我个人在实际操作中最深的体会是删脚本时需要一点“断舍离”的勇气但这份勇气背后一定要有数据支撑。没有数据支撑的删除叫拍脑袋有数据支撑的删除叫技术决策。先把这两件事分清楚你的自动化体系才有可能做到真正的长期健康。
返回列表