ARTICLE DETAIL

资讯详情

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

测试开发学习路线:功能测试转岗与接口自动化工程化指南

测试开发学习路线:功能测试转岗与接口自动化工程化指南 1. 先把“测试开发”这个岗位说清楚很多人搜“测试开发学习路线”其实心里想的是另一件事我不想只做点点点我想写代码但我不知道写到什么程度才算入门。这个问题如果一开始不掰开后面所有的学习计划都是白排的因为你连终点长什么样都不知道就只能照着别人的清单抄抄到一半发现方向不对又重来。我自己带过几个从功能测试转过来的同学也见过不少校招生一上来就冲框架源码结果三个月过去连一个能跑的接口用例都没落地。所以这篇东西我打算按“岗位认知—路线节奏—打底能力—核心技能—工程化进阶—环境踩坑”这个顺序来讲尽量把每一步为什么这么做、做到什么程度算过关都说清楚。不管你是刚入行的功能测试还是工作两三年想转方向的开发或者还在学校想提前准备的学生都能从里面挑到适合自己的部分。先给一个结论测试开发不是“测试 开发”的简单叠加它的核心是用工程手段解决质量效率问题。这句话听着有点抽象我换个说法——功能测试关心的是“这个功能对不对”测试开发关心的是“我们怎么用更少的人力、更短的时间持续地知道它对不对”。前者是在做验证后者是在造验证的工具和流程。这个定位上的差别决定了你学的东西完全不一样。1.1 测试开发和功能测试的分界线在哪分界线不在于你会不会写代码而在于你的产出物是什么。功能测试的产出是缺陷单、测试报告、用例文档测试开发的产出是脚本、框架、平台、流水线里的一个个质量卡点。你可以把它理解成装修功能测试是验收房子的测试开发是造检测仪器和自动化验收设备的。这个区别带来三个很实际的后果。第一测试开发要长期维护自己写的东西所以代码质量、可读性、扩展性比“能跑就行”重要得多你写的脚本三个月后还要给别人用。第二测试开发的工作对象是“变化”需求在变、接口在变、环境在变所以你的设计必须能扛住变化硬编码是最大的敌人。第三测试开发要跟开发和运维打交道得能看懂他们的语言知道构建、部署、日志、监控这套东西怎么运转。我见过不少同学写完一个 Selenium 脚本就觉得“我会测试开发了”但那个脚本换个环境就挂、加个用例就要复制粘贴一遍这其实还停留在“用代码做手工活”的阶段。真正跨过那条线是你能设计出一套别人可以往里加用例的结构而不是你自己一个人能跑通。1.2 市面上三类测试开发岗位的真实差别招聘网站上写着“测试开发”的岗位实际干的活差别很大我大致归成三类你投简历前最好先看清楚。第一类是业务测试开发常见于电商、金融、本地生活这类业务复杂的公司。工作重心是接口自动化、用例平台、测试数据构造、挡板服务偶尔写点小工具。这类岗位对业务理解要求高代码深度要求中等你写的代码主要是 Python 或 Java 的业务脚本。上手相对友好是绝大多数人转岗的第一站。第二类是基础架构测试开发常见于云厂商、中间件团队、基础平台部门。工作内容是测试框架、压测平台、流量回放、混沌工程工具。这类岗位对计算机基础、并发、网络、分布式的要求明显高一档基本是照研发的标准招人只是方向偏质量。想走这条路语言、算法、操作系统一样都不能落下。第三类是质量效能 / DevOps 方向偏 CI/CD、质量度量、研发流程改进。它更靠近工具链和流程代码量可能不如前两类但要求你懂整条流水线怎么串懂发布、灰度、回滚。这类岗位在规模大一点的公司比较常见。为什么一定要分清因为这三类岗位的学习重点差得远。你如果按第一类准备却去面第二类的岗位面试官问你线程池参数、GC 怎么调你直接懵。反过来你按第二类死磕算法去面第一类业务岗人家更关心你会不会造数据、会不会写挡板你那些准备又用不上。1.3 能力模型四个维度画一张自己的地图我习惯把测试开发的能力拆成四块你可以把这四个维度画成一张雷达图看看自己现在缺哪块。编码能力能不能独立写一个几百行的模块包括异常处理、日志、配置管理、单元测试。这是最基础的一块也是唯一一块没有捷径、必须靠写才能长出来的。测试专业能力等价类、边界值这些基础不说了更关键的是测试策略设计、分层测试、风险识别。这块是测试开发的“根”代码只是表达的载体。工程能力Linux、Git、数据库、网络协议、CI/CD、容器化。这些是让你写的东西能真正跑在团队环境里的支撑。沟通与推动能力怎么说服开发改代码来支持可测性怎么让团队接受你定的规范。这块最容易被忽略但它往往决定你能不能从执行者变成设计者。我在实际工作里发现卡住大多数人的不是编码而是第三块和第四块。代码能照着教程写但一放到真实项目里环境不通、依赖打架、没人配合事情就推不动了。所以学习路线里工程能力一定要早一点补别等到写平台的时候才发现自己连 Docker 都不会用。2. 学习路线的整体节奏怎么排路线这个东西最怕的就是“什么都学一点”。我看过太多人的学习计划表从 Python 到 Java 到 Go从接口自动化到性能测试到安全测试列了二十几项最后一项都没学完。问题的根源不是不够努力是没排优先级也没给每一步定一个“做到什么算完成”的标准。我的建议是先窄后宽先用一条主线把能力串起来等主线跑通了再往两边扩。对绝大多数人来说这条主线就是编程语言 接口自动化 持续集成把这三样做实你已经能胜任大部分业务测试开发岗。2.1 为什么我不建议一上来就啃框架源码刚入门就去读 Requests、Pytest、Selenium 的源码是很常见的误区。不是说读源码不好而是时机不对。源码里全是设计模式、抽象层、历史兼容逻辑你连它的使用场景都还没踩过读起来就是看天书读完也学不到什么。更有效的顺序是先用起来踩到坑再去读源码找答案。比如你先用 Pytest 写了三十个用例发现 fixture 的 scope 搞不明白、参数化写得一团乱这时候带着具体问题去读对应模块的源码收获会比空读大十倍。我自己读某个断言库源码就是因为二次封装的报错信息太难看想搞清楚它内部怎么组织的最后顺手改了个小功能提了 PR。这种带着目的的学习效率完全不一样。同样的道理也适用于设计模式。先写够一定量的代码自然会出现重复重复到第三次你就会想“能不能抽出来”这时候再去看工厂、策略这些模式你会觉得“哦原来它解决的是这个问题”。顺序反了就是死记硬背。2.2 三阶段路线图与时间预算下面这张表是我给转岗同学常用的节奏按每天能投入 2 到 3 小时算。如果你是全职学习可以压缩到一半时间如果你已经有开发基础打底阶段基本可以跳过。阶段核心目标主要内容参考周期通过标准打底期能用代码解决问题一门语言、Linux 基础、SQL、HTTP6 到 10 周能独立写脚本处理文件、调接口、操作数据库核心期能搭建可维护的自动化接口自动化、框架分层、断言与报告8 到 12 周能交付一套别人能接手扩展的接口用例集进阶层能参与工程化建设CI/CD、测试平台、性能测试、度量12 周以上能独立完成一个流水线质量卡点或平台模块这里我想强调“通过标准”这一列。很多人学东西没有验收标准学完一章就往下走结果基础全是窟窿。比如打底期什么叫“会用一门语言”我的判断标准是给你一个几百兆的日志文件要求统计里面各类错误出现的次数并输出 Top 10你能不看教程写出来。这个任务看着简单但涉及文件读写、字符串处理、字典统计、排序、异常处理全都能覆盖到。2.3 判断自己是否该进入下一阶段的三个信号不要完全按时间走按状态走更靠谱。下面这三个信号出现两个就说明可以往前推了。第一个信号是你能不看教程完成任务。不是能跑通是不看教程能设计出结构。比如写一个接口测试你知道要拆成请求封装、断言封装、数据管理三层而不是把所有代码堆在一个文件里。第二个信号是你开始能看懂别人的报错。以前报错就复制去搜现在能大致猜出是网络超时、参数类型不对还是依赖没装。这个能力很关键它意味着你对运行机制有了感觉不再是被动救火。第三个信号是你有想优化的冲动。比如发现每次都要改几处相同的配置你会想抽成配置文件发现用例执行顺序有依赖你会想改掉。有这种冲动说明你已经开始有工程思维了这是测试开发和写脚本的分水岭。3. 打底阶段语言、系统、数据这三件事打底阶段最忌讳的就是贪多。语言选一门系统知识够用就行数据库能写常用的增删改查就达标。这个阶段的目的是让你后面学框架的时候不被基础问题卡住而不是把你训练成全栈工程师。我见过有人在这里卡了半年一直在纠结学 Python 还是 Java今天看 Python 教程明天又觉得 Java 岗位多来回横跳。其实这两门语言在测试开发场景下都能干活选哪个更多取决于你所在团队的现状而不是哪个更“高级”。3.1 编程语言选哪个Python 与 Java 的取舍如果你们团队的自动化脚本、平台后端用的是某一门语言那就不用纠结直接跟团队走这样你写的代码能直接进项目、有人 review、有问题有人问学习效率最高。如果没有明确约束我给你一个偏保守的建议测试开发首选 Python 入门用工作机会反推长期语言。理由是这样的Python 的语法负担小你可以把精力放在测试逻辑和工程结构上而不是被类型声明、编译配置绊住它的生态在测试领域非常完整接口、UI、性能、造数据都有成熟库。但如果你发现目标岗位的招聘要求里 Java 出现频率明显更高比如金融、银行、大型后端团队那就在打底期直接上 Java别绕路因为这两门语言的生产力在这个阶段差距并不大真正的成本是时间。对比项PythonJava入门速度快一两周能写脚本慢要过语法和构建工具测试生态接口、UI、性能库都很全生态同样完整偏工程化岗位分布中小团队、业务测试开发多大厂、金融、后端团队多平台后端能写但大型项目略吃力更适合做平台服务学习曲线平缓容易产生成就感前期陡后期收益稳我自己的建议是先选一门扎下去写到能用它解决日常工作问题再看第二门。语言之间是互通的你搞懂了变量、流程、函数、对象、异常这套东西换语言主要是记语法和标准库迁移成本很低。真正难的是用语言解决问题的能力这个能力在任何语言上都通用。3.2 Linux 和网络基础要学到什么程度测试开发跑的东西绝大多数在 Linux 上。你至少要能熟练完成这些操作文件和目录管理、权限修改、进程查看和杀掉、日志查看和过滤、环境变量配置、常用压缩解压、ssh 登录和文件传输。这些不是要背命令而是要在没有图形界面的时候也能干活。再往上一点你需要能看懂和写简单的 shell 脚本比如批量启停服务、清理旧日志、跑一轮用例并收集结果。测试环境里这种小脚本特别多会写能省很多事。还有一个很实用的技能是看日志知道用 grep、tail -f、awk 组合起来从几万行日志里捞出你要的信息这个能力在排查自动化失败时天天用。网络这块重点是 HTTP 协议不是让你背国际标准文档而是搞清楚这么几个东西请求方法和状态码的含义、请求头和响应头的常见字段、cookie 和 session 的区别、HTTPS 里握手大致发生了什么。这些是接口测试的基础你不懂协议断言就只能瞎写。比如你看到 302得知道是重定向要去跟最终的那个接口而不是断言登录失败。实操心得把浏览器开发者工具当日常工具用。每次看到接口交互右键复制成 curl 命令再手动翻译成你语言的请求代码。这个动作做上百次协议和请求构造你就吃透了比看书快得多。3.3 数据库与 SQL测试同学的最低配要求数据库这块测试开发的刚需是“能自己造数据、能自己查数据、能自己校数据”。所以你至少要掌握常用的增删改查、where 条件组合、join、group by、子查询以及索引的基本概念。不用到 DBA 的程度但要能看懂表结构知道数据存在哪张表、哪个字段。真实工作里自动化用例最麻烦的部分往往就是数据准备。你要能写 SQL 造出符合前置条件的数据用例跑完还要能清理干净否则脏数据会污染下一轮。这里有个坑我踩过用 delete 清数据的时候忘了加 where直接把整张表清了虽然是在测试库但当时全组的人都等我恢复。从那以后我给所有删除操作定了个规矩——先写 select 验证条件再改成 delete改完再检查一遍条件。另外你要理解事务。很多业务操作是一整套数据库变更测试断言不能只看接口返回还要看最终落库的数据对不对、中间状态有没有残留。理解事务的提交和回滚能帮你设计更可靠的清理逻辑也能看懂开发说的“这个操作是原子的”到底什么意思。4. 核心阶段从会写脚本到会做自动化打底期过了就该进入真正决定你能不能转岗成功的阶段。这一阶段的目标不是“会写自动化脚本”而是“能交付一套可持续维护的自动化方案”。这两者之间的差距就体现在你有没有分层、有没有数据管理、有没有失败处理、有没有报告和告警。我评判一个人是不是过了这个阶段有个很土的办法把他的自动化项目交给另一个人接手看对方能不能在半天内跑起来并加一个新用例。如果能说明结构是合格的如果对方要问半天环境怎么配、参数改哪里那这套东西还只是个人脚本。4.1 接口测试是性价比最高的一块在整个测试开发技能里接口自动化的投入产出比是最高的。原因很实在接口比 UI 稳定维护成本低接口比手工测试快能覆盖大量组合场景接口测试还能嵌入到 CI 流水线里每次提交都跑一遍。所以如果你的时间有限优先把接口这块做扎实UI 自动化可以往后放。接口测试要掌握的技能链大致是这样的理解 HTTP 协议打底期已经解决→ 会用工具或代码发请求 → 会做参数化和数据驱动 → 会封装断言和公共逻辑 → 会接入报告和通知。每一步都有它的理由比如参数化是为了用一套逻辑覆盖多组数据封装断言是为了让失败信息可读接入通知是为了让问题第一时间被人看到。下面是一个最小可用的思路示例演示的是分层结构重点不在语法# api/user_api.py —— 只负责请求不关心断言 class UserApi: def __init__(self, client): self.client client def login(self, username, password): return self.client.post(/api/login, json{ username: username, password: password }) # test_login.py —— 只负责组织场景和断言 def test_login_success(user_api): resp user_api.login(normal_user, correct_pwd) assert resp.status_code 200 assert resp.json()[code] 0 assert resp.json()[data][token]这套结构的好处是接口地址变了只改一个地方断言规则变了只改测试层两边互不干扰。你写够几十个用例之后会发现这种分层的价值——改一个公共字段不用去二十个文件里全局替换。4.2 UI 自动化到底还要不要学这个问题我被问过很多次。结论是要懂但不要把它当主攻方向除非你所在的团队就是做客户端或者有大量 UI 回归需求。UI 自动化的核心问题是脆弱。页面结构一变、元素属性一改、加载时机一慢用例就挂而挂的原因往往不是功能坏了是定位失效。维护成本高到一定程度团队就会开始怀疑它的价值。所以正确用法是把它用在对的地方核心流程的冒烟测试、跨浏览器兼容性验证、回归成本特别高的场景。用少量稳定的用例守住关键路径而不是把所有手工用例都翻译成 UI 脚本。如果你要学重点掌握这几样元素定位策略优先用稳定的属性别依赖会变的文本和样式、显式等待不要用固定 sleep、页面对象模式把页面操作封装起来、失败截图和日志。工具选型反而是次要的同一个思路在哪个框架里都适用。我见过有人花大量时间比较各种 UI 框架的优劣其实真正决定成败的是定位策略和等待机制跟框架关系不大。4.3 自动化框架选型与分层设计框架选型没有标准答案但有几个判断维度可以参考。维度要考虑的问题团队技术栈是否已有成员熟悉能否互相维护用例规模上百个用例是否需要并行、分片执行报告需求是否要对接公司已有的质量平台维护成本依赖是否稳定升级是否频繁上手门槛新人多久能独立加用例选型的本质是权衡不是找最优解。一个大家都不会用但设计精美的框架还不如一个普通但团队能维护的框架。我自己的偏好是尽量用成熟的开源库打底自己只写业务相关的封装不要从零造轮子除非有非常明确的特殊需求。分层设计上我一般分四层数据层测试数据、配置→接口层 / 页面层请求或操作的封装→业务层把多个操作组合成业务场景→用例层组织和断言。层数不是越多越好但一定要有边界让每层只关心自己的事。最容易犯的错是把请求和断言写在一起时间一长就没法复用也没法单独调试。4.4 测试数据与环境管理这一节是我认为整个核心阶段最容易被低估的部分但它在真实项目里消耗的时间最多。自动化用例跑不稳十有八九是数据或环境的问题不是代码逻辑的问题。数据管理要解决三件事数据从哪来、用例之间怎么隔离、跑完怎么清理。常见做法有几种预置固定数据简单但容易冲突、用例内动态创建干净但慢、调用造数接口或直接写库快但要维护造数逻辑。我的经验是按场景选核心稳定数据用预置业务数据用动态创建大批量数据用造数工具。关键是给数据加唯一标识比如用户名带上时间戳或随机串避免并行执行时互相打架。环境管理要解决的是“同一套用例在开发、测试、预发都能跑”。做法是把环境相关的配置全部外置域名、账号、数据库连接都放进配置文件用环境变量或启动参数切换。绝对不能把测试环境的地址硬编码在用例里否则换一个环境就要改一遍代码。我见过一个项目接口地址在两百多个文件里各写了一遍后来换了域名全员改了两天这种坑完全可以避免。5. 进阶阶段测试平台与工程化能力到了这个阶段你已经能写自动化了但还停留在“自己的工具”层面。进阶的核心是把个人能力变成团队能力让测试跑在流水线里让结果被人看见让流程能自己转起来。这一阶段对综合能力要求更高但也是你从执行者往设计者走的必经之路。要提醒一句平台不是必须做的东西。很多公司根本没有平台需求硬做一个没人用的平台还不如把自动化用例覆盖率和稳定性做好。判断标准是如果有一件事团队每周要手工重复很多次且涉及多个角色协作那才值得工具化。纯粹为了简历好看去造平台方向就偏了。5.1 测试平台开发的常见模块与取舍测试平台一般包含这些模块用例管理、任务调度、环境管理、报告展示、告警通知。看着挺多但不是每个都要自己写。用例管理这块如果你的用例是代码形式那不需要在平台上再维护一份平台只做触发和展示就够了。任务调度可以直接用流水线或者定时任务工具不用自己写调度中心。报告展示可以对接现有的测试报告插件或者做一层简单聚合。真正值得自己投入的是跟公司业务强相关的部分比如特殊的环境管理逻辑、内部的告警路由、业务定制的数据构造。技术选型上后端用你团队熟悉的语言和框架前端找个成熟的组件库快速搭。千万不要在这里炫技把大量时间花在前端交互上。平台的价值在于它解决的实际问题不在于界面多漂亮。我见过一个内部平台界面很朴素但它把用例执行、结果对比、失败重试、消息推送一条龙打通了大家天天用这就是好平台。5.2 CI/CD 流水线里测试怎么挂进去把测试挂进流水线是测试开发最有含金量的产出之一。它的价值在于把质量卡点左移让问题在提交阶段就暴露而不是等到提测。一条典型的流水线里测试可以分几个层次挂提交时跑单元测试和静态检查秒级到分钟级合并请求时跑核心接口冒烟几分钟构建后跑完整回归十分钟到半小时发布前跑一轮端到端验证。不同层次对执行时间和稳定性的要求不同越靠前的必须越快越稳否则开发会等得不耐烦最后干脆绕过。# 一个简化示意在流水线脚本里执行接口测试并判断结果 pytest tests/api -m smoke --junitxmlreport.xml -q if [ $? -ne 0 ]; then echo 冒烟测试未通过终止后续部署 exit 1 fi这里有个经验流水线里的测试必须是可信的。如果它经常因为环境波动而失败大家很快就不看了卡点就成了摆设。所以挂上去之前先让用例在本地连续跑几十遍把不稳定因素固定等待、数据冲突、依赖外部服务清理干净。宁可先少挂几条稳定的也不要一次挂一堆天天红的。5.3 性能测试从哪里入手性能测试的门槛在于它需要你理解系统架构不然压出来的数据没法解释。入门可以从这几步走先搞懂几个核心指标——响应时间、吞吐量、并发数、错误率理解它们之间的关系再学一个压测工具用它对单个接口做基准测试然后学会分析结果知道瓶颈可能出现在应用、数据库、网络还是连接池。一个容易被忽略的点是压测环境。如果压测环境跟线上差距太大结果就没有参考价值。至少要保证机器配置、数据量、依赖服务这些关键因素尽量接近否则你压出来的数字只能证明“这个接口在测试环境能跑”。另外要控制变量一次只改一个因素否则出了问题你根本不知道是谁引起的。还有个实际的计算问题并发数不是拍脑袋定的。可以用“目标 TPS × 平均响应时间”来估算需要的并发线程数比如目标每秒处理 200 个请求平均响应时间 50 毫秒理论上需要 10 个并发。当然这只是起点实际还要考虑思考时间、连接建立开销需要逐步加压观察拐点。这个计算思路能帮你从“随便设个 100 并发”变成有依据的施压。5.4 质量度量怎么证明你的工作在产生价值做测试开发最怕的一件事是忙了一年说不清自己创造了什么价值。所以你需要有度量意识用数据说话。能用的指标不少比如自动化用例数和覆盖率、缺陷发现阶段分布、平均修复时长、回归执行时间、流水线拦截率。但指标要挑那些能反映真实变化的别为了好看去堆数字。用例数量多不代表质量好如果一半用例半年没跑过那数字没有意义。我更看重的两个指标是自动化回归替代了多少手工时间、线上问题有多少是被流水线提前拦住的。举个实际的收益算法一条手工回归用例平均执行 3 分钟一套回归 200 条全量手工跑一次是 10 小时自动化执行加上稳定等待平均 0.6 分钟一条一轮 2 小时而且可以晚上自动跑。一年按 50 轮算节省的时间是很可观的。不过要减掉维护成本自动化用例每轮可能有一小部分需要修这部分也要算进去算完的净收益才是真实价值。这种账算清楚你在汇报和争取资源的时候就很有底气。6. 本地环境调优与常见踩坑前面讲的都是“学什么”这一节讲“怎么不把自己坑死”。学习和实践过程中环境问题消耗的时间往往比学知识本身还多。尤其是跑自动化、开多个服务、用 IDE 做大型项目的时候本地机器很容易扛不住。我先说一个很典型的现象跑着测试IDE 突然卡死或者测试进程报内存溢出。很多人第一反应是“代码有内存泄漏”其实大部分时候只是运行内存给得太小。搞清楚怎么配比盲目改代码有效得多。6.1 IDE与JVM内存设置避免跑测试时OOM如果你用 IntelliJ IDEA 做 Java 项目默认的堆内存往往只有 1G 到 2G。项目一大、依赖一多、再开个测试进程很容易就 OOM 了。表现是 IDE 频繁卡顿、索引重建、或者运行测试时报java.lang.OutOfMemoryError。这不是你代码的问题是给它分的空间不够。调整方式有两种。一种是在 IDE 里直接改菜单里找到修改内存设置的入口把最大值调到 2048 或 4096单位 MB重启生效。另一种是改配置文件在 IDEA 的 vmoptions 文件里加参数-Xms512m -Xmx4096m -XX:ReservedCodeCacheSize512m -XX:MaxMetaspaceSize1024m这几个参数的含义值得说清楚不然你调了也不知道在调什么。-Xmx是最大堆内存决定了 Java 对象能占多少空间这是最关键的-Xms是初始堆设成和最大值接近可以减少扩容带来的抖动-XX:MaxMetaspaceSize是元空间上限加载大量类的时候会用到设太小也会 OOM-XX:ReservedCodeCacheSize是 JIT 编译代码的缓存项目大了经常不够。那具体设多少合适看你的机器内存。如果机器是 16G同时还要开浏览器、数据库、Docker我一般给 IDE 留 2G 到 4G别设成 8G否则其他程序就没空间了系统会开始用交换分区反而更卡。如果是 32G 的机器给 4G 到 6G 都很从容。这个不是越大越好要跟整体资源匹配。还有一个容易忽略的点测试进程自己的内存。IDE 的堆和被测程序的堆是两回事。如果你用 Maven 或 Gradle 跑测试测试 JVM 是另一个进程需要单独设参数。比如mvn test -DargLine-Xmx1024m -XX:HeapDumpOnOutOfMemoryErrorHeapDumpOnOutOfMemoryError这个参数很实用一旦真的 OOM会自动把堆转储文件落下来你就能用工具去分析到底是哪个对象把内存吃光了。排查内存问题时这个文件比日志有用得多。排查的时候还有两个命令要会jps能列出当前所有的 Java 进程和 PIDjstat -gcutil pid 1000能每秒打印一次垃圾回收情况。如果发现老年代占用一直往上涨、Full GC 之后也降不下来那基本可以确定有对象没被释放。这套排查思路不管是调 IDE 还是调被测服务都能用。顺带说一句如果你用 Python 做测试虽然没有 JVM 这些参数但也要注意内存。跑大数据量的用例时避免一次性把整个文件读进内存用逐行处理测试进程长时间运行要关注有没有对象一直被引用不释放。思路和 Java 是相通的只是工具不同。6.2 常见问题速查表下面这张表是我和身边同事踩过的坑里挑出来的高频问题遇到的时候可以对着查。现象可能原因处理方式测试进程报 OOM堆内存不足或存在大对象调大 -Xmx加 dump 参数定位用例本地过、流水线挂环境差异、数据不一致外置配置检查流水线环境变量用例偶发失败固定等待、数据冲突、依赖外部服务改显式等待数据加唯一标识加挡板IDE 卡顿、索引慢内存不足、插件太多、项目太大调大堆内存精简插件排除无关目录接口返回和预期不一致协议理解错误、重定向未跟随抓包确认实际请求检查最终响应数据库断言失败事务未提交、查询时机太早加等待或轮询确认事务边界依赖装不上版本冲突、网络源问题固定版本用虚拟环境隔离6.3 学习过程中最容易走偏的几件事最后说几个我观察到的普遍问题都是血泪教训。第一个是只收藏不实践。看到好的教程、好的项目就存起来硬盘里攒了几十个 G真正跑过的没几个。学习这件事动手一次胜过收藏一百次。我的建议是每个阶段只留一份主教材其余全部删掉或者归档逼自己把手上这份吃透。第二个是追求技术栈齐全。有人觉得测试开发必须会 Python、Java、Go、前端、运维结果每样都浅尝辄止。真实岗位要的是你在某一两个方向能解决问题不是你什么都会一点。先把一门语言和一个方向做到能独立交付再考虑扩展。第三个是忽视软技能。技术再好如果你写的脚本没人用、定的规范没人遵守价值就体现不出来。要学会写清楚文档、做简单的分享、主动跟开发沟通可测性设计。这些能力看着虚但它们决定了你的技术产出能不能落地。第四个是等准备好了再开始。很多人觉得要先把语法学完、把框架学透才敢去碰真实项目。其实最好的学习方式是一边做一边补。找一个公司里真实的、你熟悉业务的功能试着给它写自动化遇到不会的再回去查。这样学到的每一点都有落点不容易忘。我自己转测试开发那会儿最快的一次成长是接手了一个没人愿意维护的老自动化项目。代码写得很乱用例大半跑不过。我花了两周把它拆了重写一边改一边查资料对分层、配置、断言的理解就是那两周建立起来的。现在回头看如果当时只是看教程可能半年都到不了那个水平。顺着这个思路其实测试开发后面还能往几个方向延展。往深了走可以做质量平台的整体设计把数据、调度、报告、告警这些事情系统化往宽了走可以接触研发效能把构建、部署、监控这条链路也纳入视野。但不管往哪走前面打下的那几块基础——代码能力、测试思维、工程能力——都是绕不开的。基础不牢走哪条路都会遇到天花板。
返回列表