ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

自动化测试实战:接口与UI设计、稳定性优化及AI辅助

自动化测试实战:接口与UI设计、稳定性优化及AI辅助 刚好最近好几个同事在聊自动化测试的事有人问我团队现在手工测试都忙不过来上自动化到底值不值也有人问网上教程一大堆Selenium、Appium、接口框架到底先学哪个我从接触自动化测试到现在也有不少年头了从最早只会录脚本回放到后来自己搭接口测试框架、设计UI自动化用例再到最近试用AI辅助生成自动化脚本踩过的坑和积累的经验都还热乎着。这篇就把我对自动化测试的理解、选型思路、实操细节和踩坑记录讲清楚核心目标是让你看完之后能判断自己的项目适不适合做自动化以及该从哪一步开始落地。内容会覆盖接口自动化和UI自动化两大方向顺带聊聊Appium移动端测试和AI辅助测试的新玩法。不管你是刚入行的测试新人还是已经在写脚本但总感觉不稳的老手应该都能找到用得上的东西。1. 先想清楚自动化测试到底在解决什么问题很多人一提自动化测试第一反应就是用脚本代替手工点点点这个理解对了一半。自动化测试的本质其实是把重复、稳定、可验证的测试行为固化成代码从而释放人力去做更有价值的探索性测试。但如果你没想清楚这一点很容易一头扎进工具里最后折腾半天发现收益远低于投入。1.1 自动化测试能干的活和不该干的活从我实际负责过的项目来看适合自动化的场景通常有这几个特征回归测试频率高。每次发版都要把核心流程重新过一遍手工跑一遍至少两小时这种活交给自动化脚本跑完还能自动出报告。测试数据准备复杂。比如订单流转要构造各种状态的订单手工准备又慢又容易出错脚本可以快速造数。多环境、多浏览器覆盖。同一套用例要在测试环境、预发环境来回跑或者要覆盖Chrome、Firefox、Edge手工重复劳动量巨大。接口层面的校验比UI层面更可靠。有些修改只影响后端逻辑UI没变化这时候用接口自动化去验证明显更高效。反过来说有些场景我真不建议硬上自动化。比如界面布局和视觉样式这种主观性强的检查或者需求还在频繁变动、页面结构一周改三次的项目脚本维护成本会高到让你怀疑人生。1.2 自动化测试的投入产出比要怎么算我见过不少团队上自动化的姿势领导拍板我们要搞自动化然后招人、买工具、搭平台忙活大半年最后自动化用例的维护成本比手工执行还高然后就烂尾了。算投入产出比的时候有个简单的公式可以参考自动化收益 单次手工执行成本 × 执行频率 × 用例存活周期 - 脚本开发成本 - 脚本维护成本举个例子一个核心业务流程手工回归要30分钟每周要跑3次一年就是156次单这一条用例的时间成本就是78小时。如果写这条自动化用例花4小时后续每周维护平均半小时一年维护成本约26小时那这条用例一年净省约48小时。这个模型下自动化就是划算的。但如果一个用例你每个月才跑一次或者功能下个月就要重构那自动化纯属给自己找事。判断标准就一句话这个用例能不能在至少三个月内稳定执行且执行频率足够高。1.3 一个误区自动化测试是降低测试成本还是提升测试质量这个问题我是在一次面试中被问到的当时我的回答是自动化测试的直接价值是降低回归成本间接价值才是提升质量。为什么这么说因为自动化本身不会发现更多Bug它只能帮你更快地发现改挂了的问题。真正提升质量的是你在梳理自动化用例的过程中对业务规则和系统行为的理解更深入了顺便把那些容易漏测的边界场景补进了用例集里。另外自动化测试跑起来之后测试人员就能腾出时间去做探索性测试、性能测试、安全测试这些更考验人判断力的工作。所以我在带团队的时候一直强调自动化不是替代手工测试而是把团队的能力结构从重复执行型推向分析设计型。这点想通了很多技术选型问题就好决定了。2. 接口自动化框架设计为什么它比UI自动化更值得先做如果让我给刚起步的团队一个建议我一定说先做接口自动化。理由不复杂接口层比UI层稳定得多而且接口测试覆盖的是业务逻辑本身发现问题更早、定位更准。2.1 接口自动化的分层思路我自己搭接口自动化框架的时候参考了业界比较成熟的分层思想核心是把用例和底层实现解耦。大致分四层层次职责典型内容数据层管理测试数据接口入参、断言数据、环境配置请求层封装HTTP请求请求方法、Headers、鉴权、日志业务层封装业务操作登录、下单、支付等业务动作用例层定义测试场景正常流程、异常流程、边界条件这样分层的核心好处是当接口字段变化时往往只需要改请求层或数据层用例层不用大动。如果业务层的登录逻辑从账密登录改成验证码登录你只需要改业务层的封装所有依赖登录的用例自动兼容。2.2 选型对比Java系和Python系各自适合谁每当有人问我接口自动化用什么语言我都会反问一句你们团队更熟什么自动化测试框架的选型团队的技术栈匹配远比框架本身是否业内流行更重要。我做过一个简单的对比贴出来供参考维度Python系requests pytestJava系RestAssured TestNG上手难度低语法简洁适合测试团队快速入门中高需要理解Java生态断言语义pytest的assert直观表达能力好TestNG的断言丰富但代码量稍大数据驱动pytest的parametrize非常灵活TestNG的DataProvider也比较成熟报告与插件Allure支持好pytest-html轻量Allure、ExtentReport选择多适合场景中小团队、快速见效大厂Java技术栈、需深度集成现有平台的时候从经验看Pythonrequestspytest的组合是目前绝大多数团队的性价比之选因为测试人员大多不是科班开发出身Python的学习曲线平缓很多容易在团队内推广开。2.3 一个接口用例的完整落地过程空谈框架没有感觉我拿一个实际例子走一遍流程。假设要测试用户登录后获取订单列表这个接口完整落地过程是这样的读取环境配置不同环境测试/预发的BaseURL、账号信息、数据库连接存到config.yaml里脚本启动时动态读取。发送登录请求获取Token登录接口会返回Token提取出来后放入后续请求的Headers中。调用订单列表接口携带Token请求/api/orders?status全部。断言返回结果先断言HTTP状态码是200再断言响应中的code字段是0最后断言data列表中订单状态的取值都在允许范围内。这里有两个容易被忽略的细节。第一Token的获取和传递要做到框架层而不是每个用例里都写一遍登录逻辑否则一旦鉴权方式变了你所有用例都要改。第二断言不能只断状态码更不能只断success: true要断到具体的业务字段这样才能真正拦截业务逻辑错误。2.4 接口自动化的数据管理与断言技巧接口测试做久了你会发现最花时间的不是写脚本而是准备测试数据和维护断言。数据管理方面我推荐的做法是测试数据与脚本分离。把入参数据放到Excel或YAML文件里用数据驱动的方式批量执行。比如一个查询接口你有正常参数、缺失参数、非法参数、超长参数四组用例只需要在数据文件里定义四组数据脚本跑四次就行。断言方面我踩过最大的坑是断言太粗或者太死。断言太粗只判断接口返回code0结果列表里返回了别的类型的数据或者排序不对也没发现。断言太死直接把整个响应体跟一个硬编码JSON比对结果只是新增了一个字段用例就红了三天两头要维护。更稳妥的做法是分层断言第一层断状态第二层断业务码第三层断关键字段第四层对需要精确校验的场景如支付金额才做全量比对。3. UI自动化绕不开的稳定性问题UI自动化比接口自动化更出名因为Selenium的名头实在太响亮了。但做过的人都明白UI自动化最大敌人不是写脚本而是不稳定——今天能跑通明天环境一变就挂而且挂了你还得花时间排查是功能Bug还是脚本问题。3.1 Selenium核心原理和它的弱点Selenium的底层原理是通过WebDriver协议和浏览器进行通信脚本把指令发给浏览器驱动驱动再转成浏览器原生操作。这个机制本身很成熟但带来一个问题UI自动化依赖前端元素的可定位性和稳定性。只要前端改个class名、改个DOM结构脚本就废了。所以Selenium能做的是帮你把能跑通的自动化跑起来但跑不动的自动化它帮不了。这也是我在团队里反复强调的UI自动化用例的设计标准不是能跑通而是抗前端改动能力强。3.2 元素定位的优先级策略元素定位是UI自动化里最基础也最关键的技术点。我的经验是按优先级选择定位策略优先用IDID定位最快最稳前提是前端愿意加稳定ID。次选CSS选择器CSS选择器灵活能用层级关系定位但要小心父元素层级变动。谨慎用XPath绝对路径的XPath从html开始写千万别用前端一改就挂相对XPath可以用但尽量用稳定的属性组合比如//button[contains(text(),提交)]。文本定位是最后手段页面上有多个相同文本时容易误中但某些按钮没有好属性时也只能用它。我还经常建议测试和前端同学约定核心业务按钮加上>
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进