尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

自动化测试流程如何落地?从需求分析到持续集成的全套实践

自动化测试流程如何落地?从需求分析到持续集成的全套实践 作为常年跟自动化测试打交道的人我见过太多团队把“自动化测试的流程”理解成“用工具跑脚本”结果脚本写了一大堆一跑就废最后沦为摆设。真正的流程不是画一张流程图就算完而是从需求分析、方案选型、用例设计、脚本开发到持续集成的整套闭环。这篇内容我想把这些年亲自趟过的坑和沉淀下来的通用套路掰开揉碎讲给你听适合所有刚接触自动化测试、或者在现有项目里流程跑不通的测试同学参考。1. 先搞清楚自动化测试的流程到底在解决什么问题1.1 没有流程的自动化测试后来都怎么样了我见过太多项目是这么起步的开发提测一个模块测试同学觉得手工回归太累随手用Selenium录了个脚本跑通了然后发到群里说“我们项目有自动化测试了”。接下来几天脚本因为页面元素变了、数据不对、环境没起接连挂掉没人有耐心去维护于是这个“自动化测试”就死在了一个没人记得的角落。这不是个例。你会发现凡是跑得起来的自动化测试项目背后一定有一套清晰的流程在约束什么阶段该做什么事、产出物是什么、谁负责、怎么判断能不能继续推进。而凡是跑不起来的几乎都是跳过了这些约束直接奔着“写脚本”去了。流程在这里起到的作用不是增加繁琐的文档负担而是给整个自动化项目提供“可预测性”。你不再靠运气等脚本跑完而是从一开始就知道这会花多少时间、会遇到哪些风险、需要哪些资源。尤其是当自动化用例规模到几百上千条的时候没有流程约束任何一次环境变更都能让你的测试体系全线崩溃。1.2 自动化测试流程的整体框架从输入到产出的闭环我把一套能长期跑下去的自动化测试流程拆成几个阶段这套框架无论是做Web UI测试、App测试还是接口测试都通用需求分析与可行性评估明确测什么、有没有必要自动化、ROI是否划算技术选型与方案设计选定框架、测试分层、目录结构、数据管理方案测试环境与数据准备搭建可重复执行的测试环境准备隔离的测试数据用例设计与脚本开发把业务场景转换为可执行的自动化用例执行与结果反馈分层执行策略、定时触发、结果通知维护与持续改进定位稳定性问题、定期重构、适应业务变化这几个阶段的产出物也很明确分别对应《自动化测试可行性分析报告》《技术方案选型文档》《测试数据与环境的约定规范》《自动化测试用例集》《测试报告与失败分析记录》《维护手册》。你注意看这里每一步都不是孤立的。比如“测试环境与数据准备”很多团队会觉得这是运维的事但真实情况是90%的自动化用例不稳定根源都在环境或数据上压根不是脚本本身的问题。所以流程设计的核心思路就是要在大规模执行之前把可能引起结果偏差的外部因素尽量锁死让用例失败的原因可追踪、可解释。1.3 流程设计的关键原则低成本验证快速反馈我在设计流程时最看重的是“快速反馈”这一点。很多团队的自动化流程做得极其完善几十个环节每个环节都有严格审核结果一个用例从提交到出报告要等两天这种流程只会让人想逃离。好的流程应该是“先窄后宽、小步快跑”的。所谓先窄后宽就是先选定一个典型的业务主流程把整套流程从环境搭建到CI集成都跑通验证可行性再逐步增加复杂的业务场景。这样做的好处是在前期就能暴露出80%的流程设计问题成本却只有全面铺开的五分之一。另外还要记住流程中必须有“停止点”。当失败率超过某个阈值比如单日失败率超过20%对应的处理策略是停止执行定位根因而不是继续无脑地重跑。不然你得到的每一份报告都是垃圾数据反而会误导团队判断。2. 框架选型流程起步前必须做的关键决策2.1 被测对象类型决定工具方向Web、App与接口选错框架是整个流程里最尴尬的一件事。框架选错了后面写得越努力沉没成本越高。我一般会先按被测对象类型给工具分类。Web UI自动化最主流的选择还是Selenium。生态成熟、案例多、团队招人好招不管是配Python还是Java都有大量现成的封装库。近几年Playwright也很有竞争力它的自动等待机制和内置的Trace Viewer调试方式比Selenium更省心适合从零起步的新项目。Cypress则更适合前端团队出身的测试团队因为它的执行方式跑在浏览器内直观、调试友好但它的定位也更偏向组件和局部流程测试不适合大型跨域场景。移动端App自动化Appium依然是覆盖面最广的方案Android和iOS都能测但它最让人头疼的地方是环境配置复杂、速度慢。如果你只测Android或者主要针对国内安卓生态Airtest会更接地气特别是游戏和带图型界面的App它的图像识别定位机制能处理很多原生控件定位搞不定的场景。要注意Airtest的定位方案虽然方便但也容易因为分辨率、主题变化导致误判所以测试机上最好固定分辨率和版本。接口自动化测试我个人认为是性价比最高的自动化测试类型。框架上直接用Python的requests加pytest就能搞定80%的需求。如果公司内部需要多人协同可以在此基础上封装一层关键字驱动或数据驱动的简单平台不必一上来就追求复杂的平台化建设。接口自动化的稳定性远高于UI层建议把核心回归的覆盖重点放在这一层。2.2 选型的底层考量ROI、团队能力与维护成本工具选型的本质是选维护成本最低、收益最明显的组合。这里我给出几个关键维度的比较方便你直接做判断维度权重分析SeleniumPlaywrightAppiumAirtestrequestspytest跨平台能力Web/移动端兼容Web强Web强移动端强安卓生态强接口通用环境搭建成本越低越好中中高低最低调试便利性影响排障效率中高低中高社区资料量影响学习成本极高增长快高中极高维护成本趋势长期运营关键中高中高中低一个很典型的反面案例是有团队用Selenium去测一个嵌在浏览器里的视频播放器结果频繁因为播放器进度条是Canvas绘制的普通DOM定位根本拿不到元素最后只能靠坐标点去点击脚本稳定率极低整个过程苦不堪言。其实这种情况要么换用Playwright做视频帧截图对比要么搭配图像识别工具而不是硬刚原生控件。还有一个实际情况团队里没人写过代码。你不能指望招一堆测试开发才能把项目搞起来。我的建议是如果团队不会写代码优先考虑Airtest或有限封装好的自动化测试平台用录制回放加简单拖拽的方式起步流程跑通了再逐步培养写脚本的能力而不是选一个对你团队来说完全陌生的“热门框架”把自己的流程从一开始就架在沙滩上。2.3 自动化的分层策略UI、接口、单元测试如何配比很多团队一提自动化第一反应就是要做UI自动化这是误区。UI自动化是成本最高、稳定性最差的一层适合做端到端的主流程冒烟而不是大规模回归的依赖。我推荐的分层比例大致是接口自动化覆盖60%到70%的回归场景UI自动化覆盖20%到30%的端到端主流程单元测试交给开发侧覆盖核心逻辑。这样配比的根本原因是接口层的一个失败能直接定位到具体服务而UI层的一个失败可能是前端问题、后端问题、网络问题、数据问题叠加出来的排障链路越长稳定性和有效性就越差。接口层跑完UI层只是验证关键交互链路是否通业务流程是否符合预期。这个分层设计会直接决定你后续流程里用例的设计思路、执行顺序和结果分析方法。别一上来就本末倒置。3. 从用例设计到持续集成一套可落地的自动化测试流程3.1 用例设计先给自动化测试划定边界进入到用例设计阶段第一件事不是写代码而是对着需求文档和接口文档梳理业务场景给可自动化的范围划线。什么用例适合自动化我的标准有三个执行频率高、步骤可重复、预期结果可判断。像“登录”“下单”“支付回调”“数据查询列表”这类核心链路就非常适合。反过来像“验证码识别”“图片上传的样式预览”“需要肉眼判断页面美观”这类用例自动化不仅帮不上忙还会拖垮你的流程稳定性。用例设计建议采用“场景法”加“数据驱动”相结合把一条完整业务操作流定义为一个场景然后把这个场景里的关键输入参数化用多组数据去覆盖不同分支。比如登录场景就分为正确账号登录、错误密码、账号不存在、密码过期、账号被锁定等。每一个参数组合对应一条测试用例。对接口自动化来说数据驱动尤其顺手用Excel或JSON维护测试数据pytest的parametrize直接就能驱动脚本跑多组数据。这里我有一个重要的实操心得用例设计阶段就要给每条用例标注稳定性等级。核心级用例要求全量回归必须通过扩展级用例允许偶发失败但要有明确的重试策略探索级用例只用来收集缺陷信息不做结果门禁。这个划分会直接影响后续执行策略的设计避免一出现失败就整个流程停摆。3.2 脚本开发从能跑到跑得稳的进化之路脚本开发是整个流程中最容易“走偏”的部分。很多人把重点放在“如何定位到元素”“如何写出漂亮的关键字驱动框架”上但真正决定自动化测试流程能不能跑下去的是“稳定性”。我总结了一些直接有效的实践。元素定位优先顺序是data-testid id name CSS选择器 XPath。优先用专门为自动化预留的定位属性或者id是因为页面结构和样式变动时这些属性一般不会变。XPath虽然最灵活但它对页面结构的依赖最强经常一个节点变化就定位失败是维护成本最高的定位方式。如果实在要用XPath尽量避免使用下标比如//div[1]/div[2]这种写法改用//div[contains(class, xxx)]这种相对不依赖层级的方式。等待机制是稳定性最大的功臣。新手最容易犯的错就是脚本里到处sleep(3)图一时省事。后来你就会发现网络一波动sleep太短会查不到元素sleep太长又会拖慢整个执行速度。我推荐使用显式等待机制像Selenium里的WebDriverWait配expected_conditions或Playwright内置的自动等待让脚本在条件满足时立即执行条件不满足时按超时机制报错这才符合流程稳定性的要求。数据管理是脚本开发里最容易被忽视的环节。你写了一个下单流程第一次跑通了第二次跑就发现“库存不足”因为上一次的订单已经把库存占掉了。这种用例不可能稳定。正确的做法是每次执行前做好数据准备要么通过API造数要么从数据库备份恢复要么使用专属测试账号加测试数据工厂。记住用例和数据必须解耦数据准备必须在脚本开始前完成。下面我用一个接口自动化测试的简单示例展示接入pytest后的脚本结构# test_order.py import pytest import requests pytest.mark.parametrize(case, [ {desc: 正常下单, product_id: P001, qty: 1, expected_code: 200}, {desc: 库存不足, product_id: P002, qty: 999, expected_code: 400}, ]) def test_create_order(case, setup_user_token): 下单接口冒烟用例数据驱动验证不同分支 url https://api.example.com/order/create headers {Authorization: fBearer {setup_user_token}} payload {product_id: case[product_id], quantity: case[qty]} resp requests.post(url, jsonpayload, headersheaders) assert resp.status_code case[expected_code]这个脚本本身很简单但它背后对应的流程是setup_user_token是前置条件负责去登录接口拿tokenparametrize里的数据从数据文件或Excel导入由测试数据模块统一管理每条用例的失败截图和请求日志会自动被pytest的插件采集。你会发现脚本只是整个流程里最薄的一层真正让这套流程稳定的是前置准备、数据管理和结果收集机制。3.3 执行策略分层执行、定时触发与结果门禁用例写好了怎么跑也是一门学问。我强烈建议把自动化测试的执行拆成三个级别。第一级是提交级别的冒烟测试。开发每次提测时只跑五到十条和本次改动相关的核心用例要求在15分钟内出结果起到快速反馈的作用。第二级是每日夜间回归测试跑全量用例输出完整报告。第三级是版本发布前的全链路回归结合接口和UI跨服务跑完整业务流。定时触发最省心的做法是在CI里挂定时任务。以GitLab CI为例你可以在.gitlab-ci.yml里定义一个定时执行的job跑的指令就是pytest加报告插件stages: - test regression-test: stage: test script: - pip install -r requirements.txt - pytest tests/ --envstaging --maxfail5 --htmlreport.html artifacts: paths: - report.html when: always rules: - if: $CI_PIPELINE_SOURCE schedule执行结果必须设置门禁。我习惯在CI里加一个规则全量用例通过率低于90%就判定这次回归失败且失败用例对应的模块负责人需要跟进定位未修复前不允许发版。这个规则看上去严格实际上非常必要它能倒逼团队重视用例质量而不是让自动化测试报告沦为形式。3.4 环境与数据准备很多崩溃发生在脚本之外我见过最典型的环境问题是测试环境是所有人共用的开发在联调、产品在看数据、测试在跑自动化结果用例跑着跑着某个测试账号被同事改了权限某条配置被联调任务改掉了脚本在毫无预兆的情况下失败。排查半天发现业务代码压根没问题纯粹是环境“脏”了。所以自动化测试流程里环境和数据的准备不只是一种日常维护而是一种“隔离策略”。尽量准备一套独立的自动化测试环境如果不能完全独立至少要确保核心测试数据专用、不被其他团队改动的数据库并固定一套测试账号定期做数据重置。我在实际项目中会写一个reset_environment.py每次执行前自动比对测试环境的关键接口响应和数据库标志位如果发现数据不干净先执行数据清理再开始跑用例这样一来失败分析就只需要盯着代码和业务逻辑不用再扯皮环境问题。4. 避坑实录自动化测试流程中最常见的6类问题4.1 用例不稳定同一套代码这次过下次挂这是自动化测试流程里最磨人的问题。通常原因集中在三个方面数据没有隔离、操作没有充分等待、用例之间存在顺序依赖。排查思路是先看失败时截图确认页面状态。再查失败用例最后一次操作前后的接口返回和数据库记录。如果发现数据被改过就是数据准备问题如果元素迟迟不出现就是等待机制问题如果这条用例依赖前一条用例生成的数据就是用例耦合问题需要改成独立造数、不依赖执行顺序。我个人的做法是给每条用例都加上“失败现场快照”。在pytest里通过hook接到失败事件把当时的页面截图、请求日志、页面源码、网络请求记录全部落盘。这样做的好处是排查问题时不用赌运气直接看快照就能定位80%的问题。# conftest.py import pytest from pathlib import Path pytest.hookimpl(tryfirstTrue, hookwrapperTrue) def pytest_runtest_makereport(item, call): outcome yield report outcome.get_result() if report.when call and report.failed: screenshot_dir Path(artifacts/screenshots) screenshot_dir.mkdir(parentsTrue, exist_okTrue) driver item.funcargs.get(driver) if driver: driver.save_screenshot(str(screenshot_dir / f{item.name}.png))4.2 元素定位失效页面没变脚本却找不到了有些页面表面上没变但DOM层级被某个前端框架升级重构了原来的XPath自然失效。这类问题只能靠定位策略去对冲优先用稳定的data-testid不要依赖层级关系同时把元素封装成页面对象模型页面结构变了只改页面对象里的一个方法而不是全项目到处找选择器。更深层的经验是凡是和前端同事关系不错的团队一定要推“自动化专用属性”。开发在核心元素上埋一个data-testid工作量很小却能让自动化测试流程的稳定性提升一个量级。这需要测试人员主动提需求并和开发协商好命名规范。4.3 等待机制不生效请求已经返回页面还在渲染这类问题在前后端分离的架构下特别常见。接口返回200不代表前端拿到了数据并渲染完毕。如果脚本在接口返回后就立刻断言页面文本通常会失败然后在重试后才通过导致用例“时好时坏”。正确做法是永远以页面上的关键UI状态为等待目标而不是以网络请求为判断标准。比如等待某个加载提示的出现再消失或者等待目标文本可见。Selenium里用WebDriverWait加visibility_of_element_locatedPlaywright则直接用自动等待。这一点看上去很简单但确实是自动化测试流程中最常被人忽略的稳定性杀手。4.4 数据污染跑多了之后数据越来越脏接口自动化有一个非常典型的现象第一次全量回归全绿第二次跑开始冒出一堆“重复下单”“唯一索引冲突”“库存不足”根源都是测试数据没有清理或隔离。我的经验是给测试账号或测试用户留一个特征前缀。比如测试用户统一叫automation_xxx每次造数时先执行一个清理脚本把前缀匹配的历史数据清理掉再生成新数据。这样既避免数据冲突又能保证每次执行环境的干净。还有一个进阶做法是给每条用例每次执行都用时间戳生成独立数据用完即弃。从流程角度来讲数据策略要提前定好写在规范文档里不能等执行出错了再去救火。4.5 脚本维护成本过高业务一变脚本就崩一片这是流程必须持续优化的信号。如果每次业务变更自动化测试代码都要改动三分之一以上那就说明用例设计和业务场景结合得不够好。你要做的是把频繁变动的业务规则从脚本里抽取到“外部数据”或“配置中心”做到“变数据不变代码”。同时要定期开“用例健康度评审会”。每周看一次自动化测试报告把连续失败超过三次的用例单独拉出来排查清楚是业务演进导致的用例不合时宜还是脚本本身有问题。不管是哪种都要及时更新否则坏用例就会越积越多最后整个自动化包作废。这个动作看起来繁琐但恰恰是所有自动化流程能活下来的真正原因。4.6 报告与通知无效跑完了没人看等于白跑自动化测试结果如果只停留在CI页面的一个日志链接里那它的价值就大打折扣。流程里必须包含通知机制把结果主动推送到团队的核心沟通群。我的做法是接入企业微信群机器人或钉钉机器人针对失败用例自动生成包含模块归属、失败原因和截图链接的消息。这样不用任何人去CI页面里翻负责人第一时间就能收到通知。推送的策略也有讲究全量用例通过时只推送一条“通过率耗时”的精简消息有失败时推送详细列表并对应模块负责人。让消息成为大家每天都会主动看一眼的有效信息而不是刷屏的垃圾。我个人做自动化测试这么多年最深的体会是流程的本质不是约束是让团队的每个成员都能清楚地知道“现在我该做什么、为什么这样做、出了问题找谁”。自动化测试工程化落地最大的阻力永远不是工具而是流程设计里有没有把人的协作、环境的稳定、数据的干净这些“非代码问题”考虑进去。如果你正在搭建自动化测试流程建议先从最核心的一条主流程打通端到端的闭环再谈规模化和平台化。一上来就追求大而全大概率会事倍功半。
返回列表