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

资讯详情

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

测试工程师必备技能全景:从测试思维到自动化落地

测试工程师必备技能全景:从测试思维到自动化落地 1. 从“点点点”到“测试思维”测试必备技能的核心构成做了这么多年测试经常有人问我“测试到底需要会什么是不是会用鼠标点点点就行了”每次听到这个问题我都不太知道怎么接。点鼠标确实是测试工作的一部分但只把测试理解成“点点点”就跟把厨师理解成“会切菜”一样方向对了深度完全不够。这些年我面试过不少人也带过不少新人慢慢总结出一个规律真正能在这个行业里站稳脚跟的测试工程师靠的从来不是某一门技术或者某一个工具而是一套完整的技能组合。这套组合里最底下是测试思维中间是具体的技术手段最上层才是工具的使用。很多人一上来就去学工具、学框架反而把最重要的测试思维给落下了。所以这篇我打算把测试必备技能好好拆一拆从思维到实操从用例设计到问题定位尽量讲清楚也方便你对照自己缺哪块补哪块。1.1 测试思维到底是什么测试思维听起来有点玄但说穿了就一句话把“它应该是好的”换成“它哪里可能坏”。开发写代码的时候默认自己的逻辑是对的眼睛会不自觉地往“正确路径”上走而测试恰恰相反你的价值就在于往“错误路径”上走提前把那些会导致线上事故的场景暴露出来。我举个例子你感受一下。一个登录功能刚入行的测试拿到手第一反应是拿正确的账号密码登录一次看到登录成功就完事了。但一个有测试思维的人会这么想正确账号密码能登录那错误密码呢提示是否友好账号不存在、密码为空、账号被锁定这些分支各自走什么逻辑密码输错5次之后系统会不会锁定账号锁定多久同一个账号在多个端同时登录会话怎么处理接口直接提交登录请求绕过前端校验后端能不能挡住你看同一个功能两种出发点覆盖的深度完全不一样。所谓测试思维本质上就是一套穷举“可能性”的习惯把每一个正常路径之外的分支都变成一条需要验证的用例。这个习惯不是天生的全靠后天的刻意训练练多了就会形成肌肉记忆。还有一个容易被忽视的点测试思维也包含**“成本意识”**。不是所有功能都值得穷尽测试你要能判断哪些是核心链路、哪些是边缘场景。比如一个秒杀系统库存扣减和支付回调是核心文案展示是次要的测试资源也应该按这个优先级来分配。这个判断力需要积累需要在业务中去反复校验。1.2 技能栈全景硬技能与软技能我把测试必备技能梳理成下面这张表你可以对照看看自己现在的状态类别具体技能熟练程度参考测试设计等价类、边界值、判定表、场景法、错误推测能独立完成任意模块的用例设计用例管理用例编写规范、评审、归档、追溯能输出可读性好、可执行性强的用例接口测试协议基础、抓包、接口调试、接口自动化能手工测接口也能写自动化脚本数据库SQL增删改查、多表关联、数据构造能通过SQL辅助定位问题Linux基础日志查看、文件操作、服务启停能在服务器上完成基本排查自动化测试框架搭建、脚本编写、持续集成能独立搭建一套可运行的自动化工程性能测试脚本录制、压测执行、指标分析能完成基础压测和报告输出沟通协作缺陷描述、开发沟通、需求评审能清晰表达问题减少无效沟通这张表看着项目很多但你不必焦虑。这些技能是分层的刚入行的时候前四行能扎实掌握就已经超过很多同龄人了。后四行是随着经验增长逐步深入的我见过不少工作了五六年的人接口测试能力也很一般但这并不妨碍他在某个领域做得很好——关键在于你得知道自己的定位然后朝一个方向深挖。软技能这块我要单独拎出来说两句。测试这个岗位的特殊性在于你每天都要和各方角色打交道开发、产品、运维、业务方哪一个协调不好你的工作都推不动。表达问题要条理清晰描述缺陷要能让开发一秒看懂提需求要在理的层面讲清楚价值——这些能力说难不难但说简单也真不简单。我在带人的时候经常发现一个新人技术能力不错但缺陷单写得云里雾里开发和产品来回问好几轮效率极低。这种时候技术反而成了次要矛盾沟通才是主要矛盾。2. 测试用例设计方法论与实操细节测试用例设计是整个测试工作的地基。地基不牢后面什么都白搭。用例少了漏测风险高用例冗长执行起来浪费人力用例表达不清执行人看得一头雾水。所以用例设计这件事看起来简单实操起来全是门道。2.1 等价类与边界值最基础也最实用等价类划分和边界值分析是测试用例设计里最经典、也最实用的两个方法几乎适用于所有输入类的功能。等价类的核心思路是把一个无限大的输入空间划分成若干个有限集合从每个集合里取一个代表值来测试。比如一个年龄输入框限制范围是18到60岁那输入空间可以划分成三个有效等价类18到60之间和两个无效等价类小于18、大于60。每个类取一个代表值比如20、17、61就能覆盖大部分情况。这样做的好处是你不需要把所有可能的输入都穷举一遍效率高覆盖也不会遗漏太多。边界值分析则是对等价类的补充。大量的实际故障都发生在边界附近因为开发在写判断条件的时候容易把和、和搞混。还是刚才那个年龄输入框边界值是18和60你至少要测4个值17、18、60、61。在这四个值上代码容易出问题的概率远远大于中间值。实操的时候有个小技巧把等价类和边界值放在一起用先划分等价类再在每个类的边界和临界值附近补充用例。这样才能既保证覆盖面又不会漏掉最容易出Bug的边界。我见过很多测试新人只做等价类不做边界值结果线上的Bug往往就出在临界点上比如“满100减20”的优惠券99.9能用100.1不能用这种边界条件一旦处理错用户立马炸锅。2.2 场景法与判定表处理复杂业务逻辑等价类和边界值解决的是“单个输入”的问题但真实业务里的复杂逻辑往往是多个条件组合出来的。比如一个电商下单流程涉及用户身份、商品库存、优惠券类型、支付方式等多个条件每个条件还有多个取值全组合下来可能就是几十上百条用例。这时候就需要场景法和判定表来帮忙。场景法建立在事件流的基础上核心是梳理出两类路径基本流和备选流。基本流就是用户最常用、最顺畅的那条路径比如“登录-浏览商品-加入购物车-下单-支付-完成”备选流则是各种异常和分叉路径比如“库存不足”“优惠券过期”“支付超时”“地址无效”等等。用例设计的核心就是把这些备选流尽可能地覆盖到因为线上出问题的地方通常都不在基本流上。判定表则更适合条件组合明确的场景。它的做法是列出所有条件和动作然后建立一张表格穷举条件组合并给出每个组合对应的动作。举个例子一个优惠券是否可用条件有两个“是否在有效期内”和“订单金额是否达到门槛”动作是“可用”或“不可用”。做成判定表就是四行是否在有效期内订单金额达到门槛是否可用是是可用是否不可用否是不可用否否不可用如果条件更多比如三个条件每个两个取值那就是8种组合判定表依然是清晰的。它最大的价值在于防止漏测因为所有组合都被显式列出来了不像凭感觉设计用例那样容易遗漏某一个冷门组合。我第一次用判定表把一个订单系统的组合逻辑全部列出来的时候惊讶地发现有几条组合我之前的测试从来没覆盖过——而那几条恰恰是线上最容易触发的问题。3. 接口测试与自动化从能用到会用的进阶路径界面测试是表象接口测试才是里子。很多问题在界面上看是正常的但接口层面已经出了岔子比如响应时间过长、返回了错误码、字段值和数据库对不上。真正深入的测试一定要下沉到接口层面去验证。这一节我会重点讲接口测试的核心检查点和自动化落地时最容易被忽视的细节。3.1 接口测试的核心检查点初学者做接口测试通常只会看一个东西状态码是不是200。接口调通了就觉得没问题了。但200只代表“请求被处理了”根本不能说明业务逻辑是对的。我做接口测试时至少会检查以下四个方面状态码与业务码HTTP状态码200不代表业务成功。大多数系统的响应体里会带一个业务码比如0表示成功10001表示参数错误。很多开发在异常分支处理上不够仔细接口返回的HTTP状态码是200业务码却是失败——这种设计很常见所以务必两个都看。响应字段的完整性字段有没有缺失、类型对不对、是不是null。尤其要注意那些“正常情况下有值、异常情况下可能为空”的字段比如退款接口的退款单号这笔订单一旦退款成功单号就不能为空。数据落库的正确性接口返回正确的数据还不够还要去数据库核对确认数据真的写进去了。举个例子一个更新用户昵称的接口接口返回“更新成功”但数据库里的昵称根本没变这种现象我遇到过不止一次。异常入参与容错传一个非法的参数、一个不存在的ID、一个超长的字符串接口能否正确返回错误码而不是直接抛500。这一条是很多开发忽略的地方但恰恰是测试价值最大的地方。我自己的习惯是每测一个接口必定会把请求报文和响应报文完整地看一遍而不是只看测试工具里自动生成的“测试通过”标记。接口层面的细节问题只有仔细看报文才能发现。3.2 自动化框架的选型与落地接口自动化和UI自动化不同它稳定、快速、成本低是自动化测试里投入产出比最高的方向。但是选型是个容易让人纠结的事尤其是刚接触自动化的团队。我的建议是先把需求想清楚再选工具。如果只是做简单的接口回归Postman Newman就够了不需要引入复杂的框架如果是要做体系化的接口测试平台那可以考虑用Python写一套基于pytest或unittest的工程把请求封装、数据驱动、断言、报告生成都做进去。拿我自己常用的方案举个例子Python pytest requests allure。requests负责发请求pytest负责用例组织和断言allure负责报告展示。整个工程的目录结构一般是这样的test_interface/ ├── common/ # 公共方法比如请求封装、日志处理 ├── config/ # 配置文件环境地址、数据库连接等 ├── data/ # 测试数据通常是yaml或json文件 ├── testcases/ # 测试用例 ├── report/ # 测试报告 └── conftest.py # pytest的钩子配置写用例的时候我建议做好数据驱动把测试数据从代码中拆分出去。比如测试一个查询接口不同入参对应不同期望值数据放在yaml文件里代码负责读取并执行# data/test_query_user.yaml - case_name: 查询用户-正常场景 params: user_id: 1001 expect: code: 0 name: 张三 - case_name: 查询用户-ID不存在 params: user_id: 9999 expect: code: 10002 message: 用户不存在这样做的好处是业务人员也能维护测试数据用例的增减不需要改代码回归起来非常高效。我经历过一个项目接口用例两百多条全部用数据驱动管理每次版本迭代只需要改yaml里的预期值半小时就能跑完整个回归这个效率是手工测试完全比不了的。但我要泼一盆冷水自动化不是万能的。写自动化用例的成本通常是手工用例的3到5倍。如果一个接口的核心逻辑还很不稳定接口的变动频率特别高那自动化用例会成为一个持续的维护负担。我自己的判断标准是接口稳定跑过三轮版本才有自动化的价值。过早地投入自动化往往竹篮打水一场空。4. 问题定位与Bug管理测试价值的关键体现测试的价值不只是“发现问题”更重要的是“把问题说清楚”。一个模糊不清的Bug描述会让开发花费大量时间去复现和排查效率极低。反过来一个信息完整、步骤清晰、证据充分的缺陷单能让开发在几分钟内定位到问题。这一块是我觉得测试工程师从“初级”走向“中级”的一个重要分水岭。4.1 一套可复制的问题排查流程当测试过程中发现一个异常很多新人的第一反应是直接截图提Bug截图里的报错信息还只有一行“系统繁忙”这种信息基本没什么用。我自己的排查流程是这样的一套固定动作记录环境与前置条件什么环境、什么账号、什么数据、执行了什么操作。这一步是为了保证“可复现”没有前置条件描述的问题等于没提。重现问题并保留现场至少复现一到两次确认不是偶发同时打开开发者工具或抓包工具把完整的请求和响应报文保存下来。缩小问题范围同样是这个功能换个账号是否会出现换个浏览器是否会出现换条数据链路是否会出现通过这种“变量控制”的做法快速定位问题发生的边界条件。检查服务端日志与数据库如果后端是自己的系统去服务器上看日志搜索报错的关键字把堆栈信息贴到Bug描述里。数据库层面查一下相关记录的数据看有没有脏数据或者字段错乱。这套流程跑下来Bug描述里能提供的信息就非常丰富了。开发收到的时候基本不用再问“怎么复现”直接按你给的线索看代码就行了。我印象最深的一次是测试一个支付回调功能时发现偶发地出现重复入账的情况。第一次遇到我只简单提了Bug说“支付成功后账户余额偶发多了一笔”。开发完全摸不着头脑。后来我静下来把这个偶发问题当重大事故去排查换了三个设备、两种支付方式、五组账号前后复现了7次最每次的记录都详细列出来最后发现是支付回调的幂等判断没有锁网络抖动导致回调请求重复触发了。那次之后我彻底明白了一个道理测试的产出不仅仅是Bug更是问题背后的规律。4.2 缺陷报告怎么写才有效缺陷报告的写法直接决定了开发修复问题的效率。我总结了一个“好缺陷报告四要素”新手可以直接套用标题要直击核心不要写“XX功能不好用”要写“XX功能在XX条件下报XX错误预期结果与实际不符”。比如“登录接口在密码错误5次后未锁定账号仍然可以继续尝试登录”。前置条件要完整环境、账号、数据、操作路径缺一不可。每一步都要写清楚不能省略“你觉得理所当然”的步骤。操作步骤要两步一段一个步骤一个操作结果比如“步骤1输入正确账号和错误密码结果提示密码错误步骤2再次输入正确账号密码结果登录成功”——每一步都有对应结果开发就能直接沿着路径走。实际结果与预期结果要分开写很多人习惯只写现象不写预期开发不知道哪个是正确行为、哪个是错误行为。要明确写“预期账号在5次错误后锁定实际第6次仍可登录”对比鲜明开发一眼看懂。另外能附图的都要附图截图、录屏、日志文件都算证据。没有证据的Bug就像没有病历的病诉医生还得从头给你做检查浪费的是大家的时间。我处理过一个线上事故一个数据同步的Bug我当时把接口日志、数据库前后比对截图、操作录屏全部打包提交开发看完直接改代码前后只用了不到半天。这就是信息完整度带来的效率价值。5. 测试环境与数据准备大家最容易忽视的硬功夫测试环境是很多人忽略却又绕不开的话题。我见过太多项目组前后端开发已经开发完了测试环境却连依赖服务都启动不起来各种环境问题能把人磨到心态爆炸。所以我要把环境搭建和数据准备单独拿出来说说。5.1 环境搭建的常见坑环境搭建这件事测试工程师不一定天天做但至少要懂、要能做。因为你要求开发把问题在测试环境复现开发经常会回你一句“我本地没问题啊”这时候你能自己上手排查环境差异比扯皮要高效得多。常见的坑主要集中在这几个地方依赖服务不齐一个微服务系统可能有十几个下游依赖比如登录服务、消息服务、配置中心、数据库、缓存。任何一个依赖没起来功能就会报错。排查的时候先看依赖清单逐个检查健康状态。配置项不一致测试环境连的数据库地址、配置文件里的开关和预期不一致导致的功能偏差是重灾区。比如一个支付系统测试环境误连了银行的沙箱环境结果交易一直失败查了半天才发现是配置问题。数据版本过期数据库里的数据是上个月的很多业务状态已经不符合当前版本逻辑导致功能表现异常。这种问题最容易让人误判成代码缺陷我先让测试查了数据确认数据没问题才去怀疑代码。我自己的习惯是在环境搭建完成后写一份环境自检清单把所有核心接口的健康检查接口都跑一遍确认基础功能可用后才开始测试。这份清单看着简单实际上能省掉后面大量的查环境时间。环境不稳定的时候不要急着测功能先把环境查透再说这是我踩过无数次坑才悟出来的道理。5.2 测试数据的准备策略测试数据的准备聪明人几十秒搞定不聪明的能折腾半天。比如要测一个“用户余额不足”的场景你得先在数据库里把用户的余额改成0或负数有时候还要考虑订单数据、流水数据等多个数据库表的一致性。直接手写SQL去改效率不仅低还容易弄脏数据。我的经验是构建一个测试数据准备的工具集把常用场景的数据构造写成脚本一键执行。比如一个prepare_data.py可以传入参数生成不同类型的测试用户、不同金额的订单、不同状态的优惠券。这样做一次后面所有测试都能复用。另外测试数据要注意隔离不要直接拿生产数据来用。生产数据里往往有无法脱敏的隐私信息也会因为数据量庞大导致测试效率低下。专门的测试数据能让你放心地改、放心地造、放心地删。我见过有团队直接连生产库做测试一个update语句没写where条件差点把线上的数据改没了——这种事一次都不能有。6. 测试必备技能的高频问题与排坑记录最后我整理了这十几年测试工作中大家问得最多、也最容易踩坑的几类问题做成一个速查表。这些问题不管你是新手还是工作了几年大概率都会遇到。问题常见原因处理建议用例写了很多但上线还是漏测覆盖的是“功能”不是“业务链路”用例设计改用场景法主流程加备选流偶发Bug复现不了前置条件或依赖服务信息不足每次记录完整的请求响应和日志多试几组数据自动化脚本经常跑挂用例之间相互依赖或等待时间设置不合理用例独立运行动态等待替代固定sleep接口在测试工具里能通项目里报错环境配置或请求头不一致对比两边请求报文重点检查headers和鉴权环境问题占用了大量测试时间环境搭建没有清单、没有健康检查写环境自检清单核心接口先过一遍开发说本地没问题拒绝接收Bug复现条件不完整开发复现不了补充完整前置条件和抓包证据必要时录屏6.1 执行顺序与回归策略回归测试怎么排优先级是很多团队的痛点。功能全部回归人力不够只测改动点又怕影响周边模块。我自己的做法是先跑一遍“核心主流程”冒烟测试确保基本功能没挂再把改动点相关的模块作为重点回归对象最后再跑一份全量回归用例集按优先级从高到低执行。这里有个容易踩坑的地方回归用例集一定要维护好不能只增不减。随着版本迭代很多用例已经过时或者被新的业务逻辑取代不及时清理回归执行时间会越来越长最后每个版本都跑不完用例集反而成了一种负担。我建议每两个大版本就做一次用例集评审把过时的、重复的用例清掉始终保持用例集的精简和有效。6.2 经典Bug案例从定位到复盘我再分享一个我自己处理过的经典Bug案例。那是一个电商平台的优惠券模块用户在下单时选择某类优惠券系统提示“优惠券不可用”但用户实际满足所有使用条件。当时线上的客诉信息很模糊开发初步怀疑是优惠券状态问题排查了好几个小时没有头绪。我介入后先按自己的排查流程走了一遍先看接口请求确认优惠券ID、订单金额、券的状态码再查数据库里这张券的记录发现券的状态是“未生效”但用户领券时间明明已经过了生效时间。进一步查日志定位到是优惠券的生效时间在写入数据库时时区转换错误导致时间比实际晚了一个小时。那一小时内领的券都会出现“未生效”的假象。问题定位之后修复逻辑很简单但排查过程整整花了半天。如果当时没有完整的请求日志、没有前后端的数据对照这个问题很可能会拖到第二天。事后我在复盘的时候最大的感触就是排查问题靠的不是运气而是一套可复用的方法。你掌握了方法再偶发的Bug也能一步步缩小范围直到找到根因。这也是我想送给每个测试从业者的一句话测试必备技能不是某一个工具、某一门语言而是一整套从发现问题到定位问题、从设计用例到管理缺陷、从手工执行到自动化落地的体系化能力。掌握这套体系你在任何项目里都不会慌。
返回列表