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

资讯详情

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

自动化测试框架选型与稳定性实战:从接口到App全栈指南

自动化测试框架选型与稳定性实战:从接口到App全栈指南 写自动化测试这些年热搜词一年比一年热闹但真正让我担心的是很多团队把“自动化测试”理解成“把手工测试升级成脚本执行”然后一头扎进工具细节最后又因为维护成本高、飘红多悄悄把项目边缘化。这篇文章不打算按工具手册的方式铺陈而是想站在一个长期跑自动化的人的角度把接口自动化测试、Web UI自动化、Appium移动端App测试、Playwright、Allure报告、AI自动化测试以及自动化测试平台这些方向串成一个体系。适合刚准备引入自动化的测试团队也适合已经写了几个月脚本、总感觉哪里不对的工程师。你可以把它当成一份排错地图也可以当成选型参考。核心判断就一句话自动化测试不是一门写脚本的手艺而是一门关于稳定性和可靠性的工程学科。1. 自动化测试的核心不是自动执行而是守住回归边界先把最容易被误解的地方拆开讲。自动化测试真正的价值不在于“我不用手工跑用例了”而在于它能把回归测试变成一种高频、可重复、不依赖人的耐性的机制。人做重复劳动会疲劳会漏步骤会今天想起来才点一下明天忘了就不点脚本不会。所以自动化测试的核心场景是回归不是拿新功能跑第一次验证。新功能你测一次就扔在那里不需要脚本反复跑真正值得自动化的是老功能、核心链路、以前出过线上故障的路径。如果某个功能这周被改坏了你得半夜爬起来救火那么这个功能就值得自动化。如果某个页面下个月直接下架那自动化脚本写得再漂亮也大概率是在浪费维护时间。1.1 算清回归账再决定哪些用例值得自动化很多团队一上来就把所有手工用例无脑转写成自动化维护成本很快就掉进泥潭。我一般会先用一个简单的算式做筛选一条手工用例执行一次要10分钟每周回归3次一年按52周算就是10乘3乘52一年1560分钟约26个小时差不多3.5个工作日。如果这条用例转成自动化开发加调试成本是两个工作日那半年左右就回本之后每周都在纯赚。反过来如果一条用例几个月才跑一次或者每次执行前都要准备一堆手工前置数据那它自动化的收益就很低至少也应该放到最后的优先级。你要做的是先挑那批“高频、稳定、逻辑关键”的用例而不是把整个测试计划照单全收。另外不是每条用例都要100%自动化。有些用例本身前置条件复杂比如依赖第三方支付回调、依赖短信验证码、依赖外部系统状态强行自动化只会让脚本三天两头挂掉最后变成人手去维护脚本而不是维护测试。这种用例保留手工执行反而更合理你要做的是把手工执行清单也结构化管理而不是让自动化背负一切。1.2 为什么很多自动化测试项目最后变成摆设我在实际团队里见过的失败模式几乎都绕不开这三个第一用例没选对自动化在跑一些跟当前版本毫无关系的历史流程第二脚本稳定性太差一会儿因为页面元素等待不够挂掉一会儿因为测试环境数据被改挂掉团队开始习惯性忽略红报第三报告没人看自动化跑完了只有测试负责人知道结果开发、产品、项目管理者根本不知道这套机制在干什么。所以我想强调一个思路自动化测试一开始就不是测试人员自己的事它是在换一种方式把质量结果持续暴露给整个团队。还有一种失败模式是目标定得太虚比如“我们要做到自动化率80%”。单纯追求自动化率团队就会去挑那些容易自动化的、低价值的用例来凑数而不是先把最核心的回归路径守住。我更愿意把目标定成“每次发布前核心链路能在15分钟内自动跑完并给出可信结论”。这个目标直接关联业务风险也逼着团队去评估到底哪些链路最值钱。1.3 自动化测试的分层接口、UI和端到端也不全是同一件事测试金字塔这个概念放在自动化测试里还是很好用的。金字塔底层是单元测试中间一层是接口或服务层测试最上层是UI和端到端测试。层数越低运行速度越快、稳定性越高、维护成本越低层数越高越接近真实用户视角但代价是执行慢、环境依赖强、问题定位难。这不是说UI自动化没用而是说大多数团队的资源有限应该把更多自动化投入放到接口层。在你做技术选型前先把这一层逻辑想清楚比纠结用哪个框架重要得多。我见过不少团队跳过接口层直接扑到UI自动化上最后整个回归过程被浏览器环境拖累。其实核心业务的接口链路一旦守住UI层只需要覆盖少数几条关键用户路径就够了。接口层相当于给系统装了一排传感器UI层相当于站在用户角度做最终验收。两者不是替代关系而是各守各的边界。2. 技术栈选型先确定被测对象在哪一层再谈工具很多人一聊自动化测试就开始比较框架这个习惯我建议先改掉。框架只是承接执行的容器真正决定技术栈的是被测对象长什么样。被测对象是一个纯后端接口是一个Web后台是iOS和Android都要覆盖的App还是带硬件交互的嵌入式设备选型策略完全不同。2.1 为什么接口自动化测试应该排在优先级最前面接口自动化测的是服务端逻辑不关心页面渲染不依赖浏览器环境稳定性运行速度通常比UI自动化快一个数量级。举个简单例子同一个下单流程接口测试可能几百毫秒就拿到返回结果UI自动化却要等待页面加载、按钮出现、弹窗关闭动不动就是几秒起步。再加上接口层的断言可以精确到返回字段一旦出错基本可以直接指向后端某个接口的某个字段而UI层要先排查是前端渲染问题还是后端返回问题还是测试环境问题。所以我做接口自动化的标准组合是Python加requests加pytest。requests负责发HTTP请求pytest负责用例收集、断言、fixture和报告配合。这个组合的入门成本极低新的测试工程师只要会写Python函数再加一条pytest装饰器就能跑通一条用例。如果团队技术栈偏向Java也可以对应地考虑TestNG/JUnit和Rest Assured但语言本身不是关键框架设计思路完全一致。我更推荐先把Python路线跑起来因为团队里即使不是专职测试的人也很容易看懂和维护。2.2 Web端UI自动化Selenium、Playwright和pytest怎么组合Web端UI自动化Selenium是老牌元老能做到的浏览器完全兼容生态庞大遇到问题搜个示例基本不用愁。但Selenium的核心问题是等待策略太原始脚本写起来大量靠显式等待甚至强制sleep稳定性撑不撑得住很大程度看写脚本的人有没有耐心。Playwright这两年的势头很猛我自己的项目已经从Selenium迁到Playwright最直观的感受是默认自动等待这件事救了很多不稳定脚本。你没写任何等待逻辑它也会在元素真正可以用来交互之后才继续下一步。Playwright可以配合pytest用官方就提供了pytest插件fixture直接给出来了。写用例的时候基本是page.goto打开页面page.click点击元素page.expect监听响应或断言文本。因为API设计比较贴近真实使用习惯新手上手比Selenium更快。如果你目前是Selenium老用户我的建议不是让你立刻全部迁移而是先拿一个高频核心流程去试点感受到差异后再一步步扩大逐步完成切换。2.3 移动端App自动化Appium为什么还是绕不开的选择移动端App自动化Appium依然是最不需要解释的选择。它本身不是一个测试框架而是一个协议转换层通过WebDriver协议把手机上的操作翻译给底层驱动iOS走XCUITestAndroid走UiAutomator2。好处是跨平台、语言绑定自由、社区成熟坏处是环境安装和版本匹配真的磨人。如果只是做Android端的自动化测试你可以考虑其他方案但要同时覆盖iOS和AndroidAppium目前还是最主流的一条路。我搭建App自动化测试环境时默认使用的是Appium加appium-python-client。这里有一个核心提醒Appium的坑往往不在Appium本身而在JDK版本、Android SDK版本、手机端Appium Settings这几个组件的版本匹配。比如JDK版本太高Appium服务启动可能直接报错Android SDK的build-tools版本和系统不匹配UiAutomator2初始化就失败。后面我会专门用一个小节写Appium的搭建细节这里先记结论版本匹配比命令本身重要。3. 可维护的接口自动化测试框架requests、pytest和allure的组合实操接口自动化测试是性价比最高的部分但做得好不好跟框架的组织能力有很大关系。我给出一套我实际用下来很顺手的目录结构。api_test_project/ ├── config/ │ ├── __init__.py │ └── settings.py # 环境配置域名、账号、超时时间 ├── data/ │ └── test_login.yaml # 数据驱动用例 ├── tests/ │ ├── __init__.py │ ├── test_login.py │ └── conftest.py # fixture和后置清理 ├── utils/ │ ├── __init__.py │ ├── http_client.py # requests统一封装 │ └── schema_validate.py # JSON Schema校验工具 └── reports/ └── allure-results/这套结构看上去有点复杂但它分层清楚后面加用例、换环境配置的时候不需要到处挖坑。很多人一开始图省事把所有代码堆在一个文件里跑到第两百条用例时就开始痛苦了。3.1 conftest.py和fixture在接口测试里的正确用法conftest.py是pytest最有价值的机制之一不需要手动importpytest会自动加载。我把登录态、数据库清理、测试数据准备都放在fixture里。比如大多数接口用例都带token可以写一个带session作用域的fixture整个测试会话只登录一次再通过autouseTrue让它自动生效。这样既省去每个用例重复登录的开销又能保持一套统一的前置步骤。另一个fixture的用处是环境切换。我在settings.py里维护DEV、TEST、PRE三套环境配置fixture根据命令行参数去加载对应的base_url和账号信息。跑测试的时候只要--envtest所有脚本就会指向测试环境切预发环境再把参数改成--envpre。前期把这个设计进去比后面逐个改脚本里的URL要省事太多。命令大概是这样的pytest tests -q --envtest pytest tests -q --envpre3.2 数据驱动和动态数据的正确姿势我习惯把测试数据放YAML文件因为YAML比JSON耐看支持注释比Excel容易维护。用例数据通过pytest的parametrize展开成多条用例。比如登录接口测试我可以在YAML里维护一个列表正常账号、密码错误、验证码错误、用户不存在每条数据对应一个用例。这样以后新增分支只要加YAML片段不需要改Python代码。测试数据的字段要尽量扁平、命名直观嵌套太深的话失败定位会很痛苦。动态数据也是接口测试绕不开的问题。比如下单接口每次跑都需要一个未删除的商品ID如果ID是写死在代码里的第二次跑就失败。我用faker库来生成随机字符串和随机数字用数据库查询或者接口预创建的方式来获取可用的业务数据。用例完成之后还要有一个后置fixture做数据清理保证下一次执行不受上一次残留状态影响。数据管理这件事在接口自动化里比重比预想的大得多。3.3 断言至少分三层传输层、协议层、业务层接口自动化最常见的问题是只看HTTP状态码等于200就认为通过。我见过不少项目接口返回业务错误HTTP状态码依然是200脚本一路绿灯线上出问题时却没有任何告警。正确做法是把断言分三层传输层看HTTP状态码和响应时间协议层看JSON结构是否完整业务层看关键字段和业务状态码。比如登录接口成功后你要断言token字段非空、user_type和预期一致如果业务要求密码错误返回特定错误码这个错误码也要写进断言。基于此我在框架里加入了jsonschema校验定义一份响应结构跑完用例后用整体结构去校验而不是在每条用例里堆一堆字段判断。这样可以显著减少断言代码的重复量也让用例的可读性更高。3.4 Allure报告不是锦上添花是给团队看的质量入口接口测试每天跑报告不清晰等于白跑。Allure和pytest配合是我推荐的方式。pytest执行过程中把步骤、请求信息、响应信息、失败时的截图写入allure-results目录再通过Allure命令生成HTML报告。报告里不只看到哪条用例挂还能点进去看到具体请求体、响应体、失败时的断言信息。开发需要看问题时不用再找测试要日志自己点开报告详情就能定位。很多团队把报告挂在CI流水线里每次提交代码后自动跑跑完自动生成报告链接消息推送到群聊。这样一来自动化测试就从“测试自己看的东西”变成了整个团队都能依赖的质量入口。这也是我为什么一直强调Allure不是锦上添花而是整套机制能不能持久运转的关键。4. UI自动化测试的稳定性工程等待策略、选择器与Appium细节UI自动化跑起来容易稳定跑起来难。这里的问题几乎都不是“用例写得对不对”而是“脚本跟页面之间的配合稳不稳”。我把最影响稳定性的几个点摊开讲。4.1 等待的是条件不是时间早期写Selenium脚本时很多教程会教你time.sleep(1)。实际跑起来你会发现页面快的时候这1秒是纯浪费页面慢的时候1秒可能又不够。我后来全面改成显式等待WebDriverWait和expected_conditions把“点击按钮”改成“等到按钮可点击后再点击”稳定性立刻上了一个台阶。如果你还在用大量固定sleep我建议先花一个下午把所有sleep改成显式等待。切到Playwright以后这个工作量省掉了因为Playwright默认自动等待元素达到可交互状态。不要小看这个改变。一次sleep用法不对看起来只影响一两个用例但几十条用例累积起来整个回归时间会被拖得很长人也越来越不想看结果。等条件而不是等时间是所有UI自动化脚本里性价比最高的优化。4.2 选择器等级data-testid优于CSS优于XPath定位元素的优先级我的顺序是稳定的唯一属性ID然后是专门给自动化预留的>
返回列表