
1. 一个被疯转的失败案例先看自动化测试项目是怎么死的2019年我接手过一个UI自动化测试项目团队投入了4个人吭哧吭哧写了半年维护了3000多条用例。上线时看起来很美每周能稳定跑出几百个失败结果——但如果你真的去翻那些失败日志会发现80%的失败都是元素找不到等待超时这类脚本自身问题真正抓到产品Bug的比例低得可怜。项目维持了不到一年最后彻底废弃只留下一堆没人愿意碰的历史遗留脚本。这绝不是个例。在我接触过的大大小小几十个团队里自动化测试项目从启动到烂尾的概率高得惊人。外面流传90%这个数字虽然没法精确统计但就我的观察以搭建自动化测试框架为起点、以维护成本爆炸为终点的项目确实占了绝大多数。很多人会把失败原因归结于框架选错了元素定位不稳定人员技术不够但往深了看这些其实都是表面现象。自动化测试项目失败真正的病灶通常不在技术栈而在更靠前的地方——项目目标、落地节奏、团队协作方式和度量方式。这篇文章我想把这些年在自动化测试项目上踩过的坑、救过的火、拆过的烂摊子一次性说清楚希望能帮你绕开那些几乎所有人都会踩的雷区。如果你正准备启动自动化测试或者已经在泥潭里挣扎下面的内容应该对你有用。2. 失败的真实病灶目标错位、度量失真与为了自动化而自动化2.1 最典型的三类死亡原因拆解我自己总结下来自动化测试项目的失败几乎逃不出下面三个大坑目标错位把用自动化替代所有手工测试当成目标等于一开始就给自己挖了个坑。自动化不是用来消灭手工测试的它是用来解决手工测试中重复费时容易漏的那部分问题的。有人把目标定成覆盖率必须到90%结果团队为了凑覆盖率把断言写得又浅又假跑了等于没跑。我甚至见过有人在没有任何断言的情况下跑了半年日报里写着用例全部通过实际上就是脚本从头跑到尾没报错。度量失真自动化测试项目的成败被简单地等同于用例数量和通过率。用例数量多了不代表质量高通过率高了不代表测出了价值。真正该看的是自动化发现的有效Bug数量节省的手工回归时间版本发布频次这些业务层面的指标。度量失真直接导致团队行为扭曲——既然考核用例数量那我就疯狂堆脚本反正写得糙一点也没人管。为自动化而自动化很多项目启动时根本没有充分论证哪些场景适合自动化、哪些场景不适合只是看行业内都在做领导也觉得自动化是测试团队技术能力的体现于是先框一个框架再去找场景。方向错了越努力越浪费。注意如果你当前的团队连手工测试的用例管理都是乱的、需求变更频繁到一个迭代三天两头改流程那现在根本不是启动自动化测试的时机。先解决流程问题比先引入工具重要得多。2.2 换个角度看自动化测试真正的适用边界我见过非常多传统测试团队觉得手工测试马上就要没落了拼命往自动化方向挤但现实是手工探索性测试的价值依然不可替代。自动化适合的场景其实非常明确不在这里面的硬做自动化基本都白搭。适用自动化的场景有几个共性需求相对稳定、执行频率高、期望结果可精确断言。回归测试版本迭代中最适合自动化的部分每次发版都要跑一遍老功能让人手工跑三个月人早疯了。接口层面的大规模数据校验手工构造几百组入参再挨个验证返回值这种工作交给脚本再合适不过。多环境、多设备、多浏览器的兼容性验证人肉在几十种组合上点一遍耗时且极度容易漏。冒烟测试每晚自动跑一轮有问题第二天上班直接看到结果。反过来不适合自动化的场景也有几个明显特征预期结果模糊、UI频繁改版、高度依赖人为判断。拿UI自动化举例产品还在快速验证交互阶段按钮位置一周变一次页面结构说改就改——这时候投入去写UI自动化脚本基本相当于在流沙上盖楼。等交互和布局稳定下来再补成本要低得多效果也会好得多。3. 从立项就要避开的四个深坑架构、脚本、数据与CI的隐藏成本3.1 架构选型为什么很多人一开始就选错了框架方向框架选型这件事最典型的错误是听别人说好就上。Selenium、Appium、Pytest、TestNG、Robot Framework……每个框架都有自身的适用场景没有绝对的好坏只有合不合适。Python生态有Pytest加Selenium的组合Java有TestNG加Selenium小程序方向还有官方工具链配合自动化接口层面则有成熟的HTTP客户端配合数据驱动框架。关键不是选哪一套而是你基于什么标准来选。我自己判断一个框架值不值得用主要看三个维度上手成本、调试友好度、社区活跃度。社区活跃度尤其重要一个小众框架遇到问题去搜索可能半天找不到一条有效解答那种折腾会耗尽整个团队的耐心。你不需要选最强的但要选出了问题找得到答案的。还有一点被很多人忽略框架选型和自动化测试脚本架构是两码事。框架只是工具脚本架构才是决定项目可维护性的灵魂。所谓脚本架构简单说就是你怎么组织页面对象、怎么封装公共方法、怎么管理测试数据、怎么设计断言、怎么处理用例之间的依赖关系。这些设计上的好坏直接影响半年后你的脚本维护成本是1倍还是5倍。3.2 脚本设计90%的人都在用复制粘贴的方式写用例我在评审别人的自动化测试代码时见过最典型的反模式就是一个用例一个文件、整篇全是重复代码。UI自动化里十个用例里有八个登录操作那就应该把登录封装成一个公共方法。接口自动化里鉴权、签名、公共请求头这些东西也应该统一处理而不是每个用例各写各的。还有更隐蔽的坑脚本之间的数据依赖。比如用例A创建了一个订单用例B要用这个订单继续操作。大部分人图省事直接让用例B依赖用例A的执行结果结果一旦用例A失败B、C、D全部跟着挂掉排查起来极其痛苦。这是我在无数项目里见过的最影响自动化稳定性的设计问题。正确的做法是用例之间尽量独立每个用例需要的测试数据要么自己提前构造要么从独立的测试数据准备接口获取。对比一下设计方式用例A失败后的影响维护单条用例的成本新人接手难度用例间存在数据依赖后续用例连环失败高改A要评估对B/C/D的影响高需要理解整个执行链路用例间完全独立只影响A本身低各管各的低每个用例可独立理解这个表你可以直接拿去做团队内部review的checklist。3.3 元素定位与等待策略UI自动化最大的稳定性杀手UI自动化如果非要说有什么必修课那一定是元素定位和等待策略。这两个问题直接决定了你的脚本是偶尔能跑通还是稳定能跑通。元素定位这条线我的建议是优先使用稳定的业务属性比如resource-id、name、>