“测试用的懂”——第一次看到这个说法,估计很多人会愣一下。我第一反应是“测试用的小白?”,再读一遍才明白,说的应该是两件事:一是测试这个岗位、测试用的方法和工具,你得真懂;二是“测试用的,懂?”——很多开发、产品跟你对接时,总觉得测试就是走个过场。但真正干过测试的人都知道,测试最缺的从来不是手,是“懂”。懂业务才能测出该测的,懂技术才能把Bug定位到根上,懂用户才能提前拦住那些会让用户摔手机的隐藏问题。
这篇文章我就围绕这个“懂”字,把测试工作拆开聊一聊:测试到底在测什么、测试用例怎么设计才有效、一次完整的测试流程怎么跑通、以及我这些年踩过的坑和排查套路。无论你是刚入行的测试新手,还是被老板赶鸭子上架兼职做测试的开发,又或者想系统理解测试思维的产品经理,这篇都适用。我不讲虚的,全是实际干活时用得上的东西。
1. 先搞明白:测试到底在测什么
很多人觉得测试就是“把软件点一遍,看会不会报错”,这话对了一半,但完全不是测试的核心。测试的本质不是找茬,是在有限的时间和资源下,收集足够的产品质量信息,帮团队做出“能不能上线”的风险判断。你要是不懂这个底层逻辑,很容易把测试做成“体力活”,每天点点点,点完了自己心里也没底。
1.1 测试不是点点点,是围绕“质量”做信息收集
我刚入行那会儿,带我的前辈问了我一个问题:“你觉得测试报告是写给谁看的?”我脱口而出“写给领导看的”。他摇摇头说:“是写给决策用的。你报告里写‘测了100条用例全部通过’,领导完全没法判断能不能上线。你要写的是‘覆盖了哪些核心场景、发现了什么风险、这些问题不修会有什么后果’。”
这句话我一直记到现在。测试的价值,在于把“未知”变成“已知”。开发说“这个模块我测过了没问题”,你信吗?不该全信。你自己跑一遍,发现某个极端操作下数据会错乱,这就是你给团队提供的新信息。测试做得越深,团队掌握的确定性信息就越多,上线决策就越稳。这也解释了为什么同样一个需求,资深测试和新手测出来的东西完全不一样——不是手速差异,是“懂”的程度差异。
1.2 “懂”的第一层:懂需求、懂业务
测试用例的第一来源,永远是需求,而不是代码。你要测试一个“用户用优惠券下单”的功能,光知道“能用券”是不够的,你得搞清楚这些:
- 优惠券的适用范围是什么?全品类还是指定商品?
- 有没有使用门槛?满多少才能用?
- 能不能和店铺券、平台券叠加?
- 用了券之后发生退款,券退不退?怎么退?
- 优惠券过期时间精确到秒还是到天?
这些细节,开发可能没仔细想过,产品经理的需求文档里可能也只写了半句话。但用户会碰到,而且只要碰到了就是投诉。我曾经因为一个订单金额计算的问题,漏掉了“优惠券分摊到退款金额”的场景,结果用户发起部分退款后,系统算出来的金额怎么都对不上。这个Bug不算难修,但排查起来很费劲,因为数据已经落库了。从那以后我就养成了习惯:测试之前先把自己当成用户,把整个业务流程在心里完整走一遍,需求文档没写明白的地方,第一时间找产品确认。
1.3 “懂”的第二层:懂技术、懂实现
光懂业务还不够,技术层面的“懂”能让你从“发现问题”进阶到“定位问题”。我见过不少测试同行,Bug一提就是“这里点了没反应”,开发问“哪个页面?什么环境?复现步骤呢?”回答不上来。但你要是懂一点网络请求、数据库和日志排查,情况就完全不一样了。
比如你测一个列表加载失败的问题,可以顺手打开浏览器的开发者工具看Network面板:如果接口返回了500,那是服务端的问题;如果接口返回200但页面渲染不出来,那是前端解析的问题;如果接口都没发出去,那是前端逻辑的问题。就这一个动作,你已经帮开发把Bug范围缩小了一大半。再进一步,如果你能看懂SQL、能查一下数据库里的数据状态,很多“玄学Bug”你一查就知道是脏数据导致的还是逻辑缺陷导致的。
所以我的建议是,测试人员就算不写代码,也至少要掌握三样东西:HTTP抓包工具的基础用法、数据库的增删改查、日志的查看与筛选。这三样是测试排查问题的基本功,掌握之后你会发现测试工作的深度完全不一样。
2. 测试用例设计:把“懂”变成可执行的清单
“懂”是一种抽象的能力,怎么变成具体产出?答案是测试用例。测试用例就是你把对业务和技术的理解,翻译成一条条“输入—操作—预期结果”的可执行清单。用例设计的好坏,直接决定测试的覆盖度和效率。我常用的方法就四个:等价类、边界值、场景法、判定表。
2.1 等价类划分:用最少的用例覆盖最多的场景
等价类说白了就是“一群测试效果相同的数据里,挑一个有代表性的就行”。比如测一个手机号输入框,合法手机号是11位数字,非法情况包括:位数不对、含字母、含特殊字符、空值。你要是想把所有可能的非法字符串都试一遍,一辈子都试不完。而等价类划分会告诉你,这些非法输入在系统处理逻辑上大概率是同一条分支,挑几个代表测一下就行了。
这种方法的厉害之处,在于把无穷的测试输入,压缩成有限的几组。我做用例评审的时候,经常发现有人写了几十条用例,但全是等价类里的重复项,比如“输入11111111111”“输入22222222222”——这俩在等价类上就是同一个测试点,纯属浪费回归时间。
2.2 边界值分析:Bug最喜欢藏在边界
有经验的程序员都知道,最容易出Bug的地方不是正常路径,而是边界。比如一个优惠券满100可用,那用户结算金额正好99.9和正好100就是两条边界。再比如一个商品库存只剩下1件,你买1件成功、买2件呢?并发下两个人同时买最后1件呢?
边界值分析就是专门盯这些“临界点”的招:取“正好等于边界”“比边界小一点”“比边界大一点”三组数据去测。我自己的习惯是,遇到任何有数字范围的规则,先把边界值列出来再补充等价类。这不是什么高深理论,就是朴素的“越界的路最容易被代码忽略”。
2.3 场景法:用户不会按用例走,但用例要按用户走
单条用例验证的是“单个功能点对不对”,但现实中用户从来不是只点一个按钮。真实的使用是连续的:注册、登录、搜索、下单、支付、查看订单、申请退款——这中间任何一环出错,用户感知到的就是一个“破软件”。场景法就是把这些连贯操作串成一个完整的故事去测。
我写场景用例,一般会分两个维度:正向主流程和异常分支。主流程是“用户最常用、最核心的路径”,比如下单成功;异常分支是“用户半路不按套路走”,比如支付超时、断网、重复提交订单。很多线上事故,就是因为只测了主流程,异常分支的代码逻辑压根没人碰过。记住一句话:主流程保证产品能用,异常分支保证产品不会把用户逼疯。
3. 实操过程:一次完整测试的来龙去脉
有了用例设计的基础,我们来走一遍完整流程。这里我用一个真实的模拟项目来演示:一个电商系统的“订单改价”功能。背景是客服人员可以修改订单金额,但修改后需要风控审核,审核通过才生效。整个测试过程分四步走。
3.1 测试计划:先想清楚测什么、怎么测、什么时候停
很多测试新手拿到需求就开始测,这是大忌。我自己的习惯是先花半天做测试计划,搞清楚三件事:
- 测什么:这次改动涉及的核心功能是什么?影响范围多大?比如“订单改价”牵扯到订单状态、金额计算、审核记录、消息通知,还可能牵连到对账报表。
- 怎么测:用什么环境测?要不要造数据?需不需要自动化辅助?比如并发改价就需要用脚本模拟多人同时操作。
- 什么时候停:测试不可能无穷无尽,明确“质量标准”——核心流程全通过、无严重和致命Bug、遗留的中等问题有规避方案,就可以出测试报告了。
这个环节还会顺手梳理测试资源:接口文档有没有、测试环境数据库的访问权限有没有、依赖的第三方服务(比如支付系统)是不是联调通了。任何一项缺失都要提前暴露,而不是等执行到一半卡住再去补。
具体到订单改价这个项目,测试计划里我最关注的是金额精度问题。改价涉及单位换算(元转分),如果开发用浮点数处理,就很容易出现0.1+0.2不等于0.3的经典问题。所以我在计划里专门列了一条“金额精度专项验证”,这就体现了“懂技术”的价值。
3.2 测试环境与数据构造
环境问题永远是测试的第一大坑。我们当时的测试环境和生产环境基本同构,但数据库里只有零星几条假数据,完全不够用。为了测订单改价,我花了一个下午构造数据,现在总结出来大概要准备这几类:
- 不同状态的订单:待支付、已支付、已发货、已完成。改价在不同状态下规则不同,比如已发货订单能不能改?改了要不要重新走支付?
- 不同金额区间:32.10元、100.00元、0.01元、超大金额(比如9999999.99)。这些数值在界面显示、数据库存储、对账报表里分别是什么效果?
- 不同商品组合:单个商品、多个商品、含运费、含优惠券。因为改价后需要重新分摊金额到商品明细,组合不同分摊算法不同。
数据构造特别考验“懂业务”的程度。你只有真正理解改价后系统要做哪些事,才能把数据场景列全。我见过不少人构造数据就是瞎造,满库都是同一类订单,最后测了半天,核心场景根本没覆盖到。
3.3 用例执行与缺陷提报
执行用例听起来机械,但里面有很多经验技巧。我的执行原则是“先跑核心流程,再跑异常场景,最后做探索性测试”。核心流程保证主链路是通的,异常场景验证保护机制,探索性测试则是靠你的“懂”去发现那些没写在用例里的问题。
在探索性测试环节,我当时发现了一个有意思的问题:客服对一笔已完成支付的订单改价后,系统弹出了“需要重新支付”的提示,但用户端的订单详情页,金额已经直接显示成了新金额——也就是说,改价还没审核通过,用户已经看到修改后的价格了。这就是一个典型的状态不同步问题,如果不处理,用户会以为要按新价格支付,或者对订单金额产生困惑。
这个Bug如果只按着用例一步步走,其实是很难发现的,因为用例里对“审核中状态”的界面展示没有做严格预期。是我出于对业务的“懂”,下意识觉得“审核还没过,前端不该先变价”,才检查出来的。所以说,测试执行不只是“跑跑而已”,心里要一直有一根弦:这个操作在真实业务里合理吗?用户会怎么理解?
缺陷提报也有讲究。我提Bug的基本格式是:标题写明功能点和异常现象,正文包含前置条件、复现步骤、实际结果、预期结果、环境信息、截图或录屏。这里多说一句,复现步骤一定要精简到最小操作集合。能三步复现的,绝不要写十步。原因很简单,开发排查的时间也是时间,你的复现步骤越清晰,Bug被修复的速度就越快。
3.4 测试报告:用数据说话
测试报告是测试工作的收官产出。我不建议写那种“本次测试共执行用例50条,通过48条,失败2条”的流水账。好的测试报告要做到“别人看完能直接做决策”。
我的报告结构一般是:
- 测试结论:开头第一句就写结论,比如“本次测试未通过,不建议上线”或“有条件通过,中等问题修复后可以上线”。领导没有时间看你长篇大论。
- 测试范围:这次测了什么、没测什么、为什么没测(比如某些场景依赖第三方环境,无法覆盖)。
- 风险清单:当前已知的有哪些问题,各自的影响范围和触发概率。比如前面提到的改价金额同步问题,评估下来影响所有改价订单,属于必须修复才允许上线的级别。
- 数据统计:用例数、通过率、Bug数、按严重级分布,用来支撑上面的结论。
我一直强调,测试报告不是测试工作的结束,而是质量风险的交接。你把一个真实的风险描述清楚,比写一百条“通过”都有价值。
4. 常见问题与排查技巧实录
前面聊的是标准流程,但实际工作里,你总会碰到各种“流程之外”的情况。这一节我把自己这些年踩过的坑整理成四个典型问题,每个都附带我的解决思路。
4.1 需求文档一句话,测试怎么做?
“订单改价功能,客服可修改订单金额。”——就这一句,没有字段规则、没有边界说明、没有异常预期。这种情况我遇到太多次了。我的应对方式分三步:
第一步,直接找产品经理当面问,用具体场景去触发对方的思考。比如问“订单已经发货了还能改吗?”“改价后要不要重新支付?”“改价的金额有没有上限?”你问得越具体,产品越容易给出明确答复。
第二步,参考历史逻辑。同一个系统里,往往有类似功能可以类比。比如之前做过“地址修改限制”,规则是“已发货订单不可修改地址”,那改价功能大概率也有“已发货订单不可改价”的限制。
第三步,在设计用例时把不明确的点标出来,主动暴露风险。不要假装需求是明确的,你测试时发现了“和预期不符”,但你的预期本身就可能是错的。所以遇到模糊需求,我倾向于在用例评审会上明确说:这几个场景需求没定义,如果上线后用户操作了会发生什么?让团队所有人都知道这个风险的存在。
4.2 回归测试时间不够,怎么取舍
项目延期是常态,到了发版前一夜,开发说“这次只改了两行代码”,但你知道这两行改动牵连甚广。这时候全量回归不现实,我的取舍策略是“三层回归”:
- 第一层:改动点直接功能。我默认开发改什么你测什么,这个没得逃。
- 第二层:改动点相邻功能。比如改了订单金额计算,那订单列表、订单详情、对账导出都要过一遍。
- 第三层:核心主流程冒烟。登录、下单、支付、查询这些主链路必须快速跑通,避免出现“修复了旧Bug,炸了新功能”的翻车情况。
真的来不及的话,我会在测试报告里如实写“未覆盖哪些范围”,而不是硬着头皮说“全部通过”。在质量问题上,诚实永远是最安全的策略。
4.3 开发说“不可能”,但Bug就摆在那里
我遇到过一个非常经典的“不可能”事件:测试环境里连续三次修改同一个订单的备注,第三次修改后页面上显示的却是第一次的备注内容,数据像被“回滚”了一样。开发看了半天说“这不可能,接口逻辑没问题”。
后来我排查发现,问题出在浏览器缓存上。前端在修改备注后,展示用的接口被浏览器缓存了,第三次请求返回的其实是缓存数据。我之所以能定位到这一步,是因为我用抓包工具对比了几次接口的真实响应,发现接口返回的数据是对的,是页面渲染用了旧数据。
这个经历告诉我,面对开发说“不可能”,不要争辩,用证据说话。抓包看请求是否发出、接口返回什么、数据库数据是什么状态,一步步把问题边界画清楚。你的“懂技术”在这里就是最有说服力的武器。
4.4 用例很多但测不出Bug,问题出在哪
有段时间我很困惑,用例写了一堆,执行也毫无遗漏,但线上还是出了事故。复盘之后我发现,问题出在“用例全是功能点验证,没有业务场景串联”。我写的是“修改订单金额成功”,却没有写“修改金额后触发审核,审核拒绝后金额是否还原”。真实用户不会按你的用例顺序操作,他们可能边看商品边下单,下单中途切出去聊天,回来再继续操作。这些“不连续”的操作恰恰最容易触发状态错乱。
从那以后,我设计用例的一个大原则变成了:每个核心功能用例里,至少加一两条跨功能串联的链路用例。用例数量可以适当减少,但链路覆盖不能少。我宁可少写10条零散的功能点用例,也要多写一条完整的业务场景用例,因为后者才更接近真实世界的使用方式。
最后再分享一个小技巧
回到标题,“测试用的懂”这个“懂”字,我越来越觉得它的意思是:测试要带着理解和判断去做,而不是带着手去执行。你有多懂这个业务、多懂这个系统、多懂用户,你的测试产出就有多深。
如果只让我给一条最实用的建议,那就是:每次拿到测试任务,先别急着动手,花五分钟回答自己三个问题——这个功能的核心价值是什么?用户最常走的那条路径是什么?哪些地方出错会让用户根本无法接受?想清楚这三件事,你的测试重点自然就浮出水面了。
测试这条路,做到后面拼的不是技能有多花哨,而是你愿不愿意多问自己一句“为什么”。你以为测的是软件,其实测的是对业务的理解和对用户的体谅。这个认知想通了,测试用的那些工具、方法和用例,才真正能被你所用。共勉。