1. 从“小猪软件测试”这个名字聊起:测试到底在做什么
测试圈里有个有趣的现象,很多个人IP、学习小分队都喜欢用动物或昵称来命名,比如“小猪软件测试”这种风格。名字很萌,但做的活儿其实相当硬核——软件测试。
我第一次看到“小猪软件测试”这五个字时,第一反应是:这应该是个面向入门者和一线执行者的测试知识分享账号。事实证明,这种判断基本靠谱。软件测试这个岗位,入门门槛看着不高,但天花板可以很高。一个“会点点点”的手工测试,和一个能搭建自动化框架、能做性能分析、能从需求阶段就介入的测试工程师,薪资和话语权完全是两回事。“小猪软件测试”这类栏目真正想做的,大概率不是教人怎么机械地执行用例,而是帮人建立一套系统化的测试思维,从“不知道测什么”到“知道怎么测、为什么这么测”。
这篇文章我不想写成教科书。我更想以从业者的视角,把这几年做测试积累的东西,结合“小猪软件测试”这个主题,拆开揉碎了聊一聊:测试用例怎么设计才不遗漏、测试执行有哪些容易被忽视的细节、接口测试和自动化到底怎么落地、出了问题怎么排查。不管你是刚入行的新人,还是在功能测试里憋了很久想往上走的人,只要按着这条线往下读,应该都能找到一些可以直接拿过去用的东西。
2. 测试的核心思路:先搞明白“测什么”比“怎么测”更重要
2.1 测试的本质是信息差管理
很多人对测试的理解是“找bug”。这句话没错,但太肤浅了。找bug只是测试的显性产出,测试的隐性价值在于减少信息差——开发以为系统是这样工作的,产品以为用户会这么操作,用户实际却那么操作,测试就是那个把“以为”和“实际”之间的缝隙填上的人。
明白这个,你再看“小猪软件测试”这类内容,就不会只盯着用例模板、bug模板这些表面功夫。真正的核心在于:你能不能比开发更早地发现需求里的歧义,能不能在产品上线前预判到某个极端输入会导致线上事故。这考验的不是手速,而是你对业务的理解深度和信息敏感度。
举个例子,一个简单的登录功能。如果你只测“输入正确账号密码能登录、输入错误账号密码提示失败”这两条,那你的测试覆盖基本等于没有。你至少要问自己几个问题:账号区分大小写吗?密码有没有长度限制?连续输错5次会锁账号吗?锁了之后多久解锁?登录成功之后跳转到哪个页面?退出登录之后按浏览器返回键会不会回到登录前的状态?这些问题不是拍脑袋想出来的,它们来自你对用户习惯的观察、对历史bug的复盘、对同类产品交互的积累。
2.2 被测系统的边界:先画一张功能地图
拿到一个被测系统,第一件事不是急着写用例,而是先画一张功能地图。哪怕就用一张白纸,把系统有哪些模块、模块之间怎么流转、数据从哪里来到哪里去,大致画出来。这个动作看起来原始,但它能帮你避免最常见的低级失误——漏测。
我之前带过一个新人,接到一个电商后台的订单管理模块,上来就对着界面点。点了一下午,提了七八个bug,自我感觉挺好。结果我让他把订单从创建、支付、发货、确认收货、售后的完整链路走一遍,他傻眼了,因为他压根没测过退款流程和库存回滚。这就是典型的没有功能地图导致的漏测。功能地图不需要画得多精美,但一定要标清楚:核心主流程是什么、分支流程有哪些、异常路径有哪些、涉及哪些上下游系统。
在这个阶段,“小猪软件测试”这类分享里反复强调的一个概念特别好——测试覆盖率不是看用例数量,而是看路径覆盖。一段代码可能有几十条执行路径,你只测了最顺的happy path,剩下那些if分支、异常分支全是盲区。画出功能地图,再对照着地图设计用例,覆盖率和你的工作量不一定成正比,但一定和你的思维完整性成正比。
3. 测试用例设计:从需求到用例表的完整链路
3.1 需求拆解:一行需求背后藏着十个测试点
用例设计的起点是需求文档,但大多数需求文档写得都挺“虚”。比如“支持用户修改昵称,昵称不能包含敏感词”,就这么一句话,你要能拆出这些测试点:昵称长度边界是多少、能不能为空、能不能重复、包含数字和字母吗、特殊字符允许吗、敏感词是精确匹配还是模糊匹配、修改后其他端(App端、小程序端、后台管理端)能不能同步生效、修改频率有没有限制。这不是吹毛求疵,这些点每一项的背后都可能是一次线上投诉。
我见过比较靠谱的做法是“需求三问法”。拿到需求先问三遍:这个功能给谁用?用户在这个场景下会遇到什么障碍?这个功能挂了影响什么?第一问帮你界定用户群,第二问帮你设计真实场景用例,第三问帮你确定测试优先级。比如一个“忘记密码”的功能,给谁用——肯定是记不住密码的粗心用户;会遇到什么障碍——验证码收不到、邮箱链接过期;挂了影响什么——用户无法登录,大概率会流失。这样拆下来,测试重点自然就清楚了。
3.2 经典设计方法:等价类、边界值、场景法怎么配合用
设计用例时最常用、也最好用的三件套是等价类划分、边界值分析和场景法。理论上大家都知道,实操时容易出现的问题是:要么光用等价类,测了一堆正常值,边界全漏了;要么光钻边界值,主流程都没测通就开始抠细节。
我的建议是组合拳。先画功能地图和业务流程,用场景法把主流程、备选流程、异常流程用例搭出来。然后对每个输入项做等价类划分,区分有效等价类和无效等价类。最后对每个等价类的边界值单独设计用例,因为经验告诉我们,bug最喜欢藏在边界上。
举一个实际例子。一个商品优惠券的有效期设置,需求写“有效期最长365天”。等价类划分:有效等价类是1到365天,无效等价类是0天、负数、超过365天。边界值分析:0、1、2、364、365、366这六个值你都要点一遍。0天能不能保存?保存之后优惠券是不是立即失效?365天跨年了还正常吗?366天是不是被拦截,拦截提示是什么?这六个用例执行下来,比随机输365个天数管用得多。
3.3 用例评审与维护:用例不是写给自己看的
很多人写完用例就闷头执行,从不做评审。这是个大坑。用例文档的价值在于它是团队沟通的载体,不是你的私人笔记。一次正式用例评审至少能给你带来三样东西:产品经理会告诉你某些“异常”其实是业务常态,开发会告诉你某个场景技术上根本不会出现,老测试会告诉你这个模块历史上出过什么幺蛾子。
评审时最常见的争论是“这个用例实际发生的概率太低,要不要测”。我的原则是:如果这个场景发生后的影响面是大事(比如资金损失、数据不可恢复、核心功能不可用),哪怕概率再低也要测,而且还要纳入回归用例;如果影响面很小(比如某个非核心页面的文案显示错了一个字),可以降级处理,记录在案但不阻塞发版。
用例维护这块,很多团队做得也不够。用例和代码一样会腐化。产品改版了、需求变更了、历史bug修复了,用例如果不同步更新,过两个迭代就会变得没人敢信。我习惯每次迭代结束后花半小时清理一次用例库,标记废弃用例、更新失效的预期结果、补充漏掉的新场景。别小看这半小时,它能让你的回归测试效率提升一倍。
4. 测试执行与缺陷管理:跑起来才是真章
4.1 环境搭建与数据准备:测试执行的隐形地下工程
用例写得再漂亮,环境起不来、数据造不出来,一切都白搭。测试环境搭建这件事,看起来是运维或者开发的活儿,但测试工程师如果不懂,执行效率会被拖垮一大截。至少你要搞清楚:被测系统的前端、后端、数据库各部署在哪台机器上、版本是不是最新的、依赖的第三方服务(支付、短信、地图)是连的mock还是真实服务。
数据准备更考验内功。很多测试新手喜欢用“现成的数据”——开发库里的脏数据、生产环境脱敏数据、自己随手瞎填的数据。现成数据的问题在于你根本不知道它经过了哪些状态的变迁,用它测出来的结果不具备可解释性。正确的做法是:针对测试场景有目的地造数。测登录就造不同状态的账号,测订单就造不同状态的订单,测报表就造不同时间跨度、不同维度组合的数据。
我给大家一个非常实用的建议:把常用测试数据整理成一套“数据字典”。比如“用户数据”这个大类下,准备一个未激活用户、一个正常用户、一个禁用用户、一个注销用户、一个vip用户;“订单数据”下准备一个待支付订单、一个已支付待发货订单、一个已发货订单、一个已完成订单、一个已退款订单。把这套数据字典挂在测试环境的公共文档里,团队所有人都能复用。以后谁要是接到相关模块的测试任务,直接按字典取数,省去每次临时造数的时间。
4.2 功能测试与回归测试的节奏:执行序也是一门学问
进到功能测试执行阶段,最容易犯的错误是“想到哪测到哪”。用例执行顺序不合理,往往会让你做很多无用功。我常用的执行策略是“由主到次、由正到反、由浅到深”。
先把主流程用例跑通,确保这个版本的基本功能是可用的。如果主流程都不通,后面的分支用例、异常用例跑得再多,大概率也要推翻重测。主流程通过后,再执行功能分支用例和异常场景用例。最后再针对本次改动的代码范围做深挖,也就是“定向测试”。这里要特别注意,开发修复了一个bug之后,不仅要测修复点本身,还要测和修复点相关的上下游功能。
回归测试是很多测试人员头疼的事。全量回归耗时太长,不做又怕漏。我的策略是分层回归:第一层,主流程全量回归,这是底线,哪个版本都必须保证主流程不挂;第二层,新增功能模块加与之关联的旧功能模块做全量;第三层,其余模块只做冒烟,也就是每个功能点快速点一遍,确认没有重大链路断裂。这样分层的逻辑很简单,核心链路永远优先,关联链路重点保障,边缘链路快速扫雷。
4.3 缺陷生命周期:从提交到关闭的全程管理
提bug是测试的基本功,但很多人提了念没修炼好。一个合格的bug描述至少要包含:前置条件、复现步骤、实际结果、预期结果、优先级和严重程度、环境信息、必备的日志和截图。这里面最容易缺的是“前置条件”,很多bug复现不出来,就是因为前置条件没写清楚。比如“用户从购物车结算页进入支付页,选择微信支付,支付成功后返回订单列表页,发现订单状态仍为待付款”,前置条件里必须写明白“购物车里有多少件商品、商品是否有库存、微信支付是否开通”,否则开发复现时长会大大拉长。
缺陷的生命周期管理,本质上是和开发协作的过程。bug提了之后不是扔出去就不管了,你要跟踪它的流转状态:是待确认、还是已修复待验证、还是被拒绝了。我已经记不清有多少线上事故,起因是开发改了代码但没提测,测试这边都不知道,版本就上线了。所以强烈建议测试同学养成“版本发布前必须人工确认最后一次代码提交记录”的习惯。这个动作花不了两分钟,但能挡住至少80%的线上低级事故。
5. 接口测试与自动化测试:走向进阶的必修课
5.1 接口测试为什么比界面测试更值钱
做了几年功能测试之后,你一定会触碰到一个瓶颈:界面层能发现的bug越来越少,系统的稳定性问题、联调问题、异常数据问题,单靠点界面根本看不见。这时候就需要往测试栈的下层走,去做接口测试,也叫API测试。
接口测试的价值,首先是成本优势。一次接口测试用例的执行时间是毫秒级的,而一次界面测试用例要在页面上操作好几步,至少得几十秒。其次是定位能力,接口测试失败时你直接能看到请求参数和响应结果,哪个字段不对一目了然;界面测试失败了还得一层层剥洋葱,从前端找到后端。
接口测试用例的设计,核心是围绕参数来做文章。比如一个查询用户信息的接口,你要测:必填参数缺失、参数类型错误、参数长度超限、参数取值不在枚举范围内、鉴权token缺失或过期、请求体格式错误、响应报文的字段是否完整、异常时的HTTP状态码是否正确。这里同样可以用等价类和边界值的思路,只不过对象从界面元素换成了接口参数。
5.2 自动化测试工具选型与框架搭建思路
聊到自动化测试,很多新手一上来就追问“用什么工具”,好像选对了工具就成功了一半。其实工具只是载体,框架思维才是关键。目前主流的自动化测试方向分两大块:接口自动化主流的方案是Python或者Java写脚本,配合成熟的测试框架;界面自动化主流的是Selenium、Playwright这一类的浏览器自动化工具。
对于接口自动化,建议从最简单的脚本模式起步,不要一步到位就搭平台。先把高频的核心接口用脚本跑通,断言方式先简单粗暴一点,比如响应结果的返回状态码对不对、关键字段值对不对。脚本积累到一定数量,再考虑抽象出公共函数库、统一管理环境配置、引入数据驱动、把测试报告接入CI流水线。一步到位搭平台这种事,我的态度很明确——除非团队已经有三到五条成熟的接口测试脚本在稳定运行,否则搭出来的平台极有可能是空中楼阁。
界面自动化的难度比接口自动化高一个量级,因为它受环境因素影响太大:浏览器版本、网络延迟、页面渲染速度、元素定位稳定性,任何一个环节波动都会导致脚本不稳定。我的建议是,界面自动化不要追求覆盖所有功能,重点覆盖两类场景:超高频回归的主流程;容易出错且修复反复的模块。宁可只写二十个稳定的脚本每天跑,也不要写两百个三天两头失败的脚本放在那里污染测试报告。
5.3 测试数据管理与稳定性:自动化脚本的隐形地雷
自动化脚本跑多了就会发现,写脚本本身不难,难的是让脚本稳定地反复跑。稳定性最大的敌人是测试数据。很多脚本第一次跑是绿的,第二次跑就红了,原因往往不是代码出问题了,而是造的数据被上一次跑给消耗掉了。
比如你写了个“创建订单”的脚本,用例设计里用了唯一的商品编号,第一次创建成功,第二次再用同一个编号就提示“商品已存在”,脚本就挂了。这种问题有三个常规解法:一是在用例执行前动态生成数据,比如用时间戳拼订单号;二是在用例执行后清理测试数据,恢复到执行前的状态;三是为自动化测试准备独立的测试账号和独立的测试数据池,避免跟手工测试抢数据。
这看起来是技术问题,但本质上是测试思维问题。写自动化脚本时你就得想清楚:这个脚本会被反复执行,它执行完之后数据环境是变“脏”了还是恢复原样了。每次脚本跑完顺手把环境恢复干净,这个习惯救过我无数次,也推荐你们养起来。
6. 常见问题与排查技巧实录
6.1 问题速查表:动手排查前的第一份清单
测试过程中遇到问题不要急着提bug,先自己排查一轮,很多问题压根不用惊动开发。我整理了一份自己在用的排查清单,分享给大家参考:
| 现象 | 首先排查项 | 常见根因 |
|---|---|---|
| 页面白屏/打不开 | 浏览器控制台Network面板看请求状态 | 接口返回500/404、静态资源加载失败、本地缓存异常 |
| 功能点没反应 | 看接口是否发出、参数是否正确 | 前端未调用接口、参数拼错、后端逻辑抛异常 |
| 数据不对 | 对比接口返回与数据库记录 | 查询条件错误、数据同步延迟、缓存未更新 |
| 偶现报错 | 排查是否特定账号、特定IP、特定时间 | 并发问题、权限问题、定时任务影响 |
| 某个用户报错其他用户正常 | 对比用户角色、权限、绑定的数据 | 权限配置差异、脏数据影响 |
| 测试环境正常线上异常 | 对比测试库与生产库的数据结构 | 生产库表结构与代码不匹配、配置项遗漏 |
这张表的价值不在于它多全面,而在于它能帮你快速压缩问题范围。测试不是只负责发现问题,还要精准地描述问题。精准描述本身就是给排查铺路。
6.2 从“复现不了”到“稳定复现”的三个思路
测试工作中最磨人的事情之一就是bug你看到了,但让开发复现时它不出现了。这种“幽灵bug”,大部分人第一反应是加日志重新触发,但往往收效甚微。我个人的经验是,复现不了的问题先别硬碰硬,试着从这几个方向切入。
先看操作路径。你从A页面跳到B页面再跳到C页面,和直接从C页面进入,执行同一个操作,底层的数据状态可能是不同的。很多bug只在特定页面跳转路径下才触发。所以一旦遇到复现不了的问题,先回顾一下自己刚才的完整操作路径,尝试按原路径一步步重走。
再看数据状态。你刚才用的测试数据,金额是100元,现在换成1000元可能就不一样了。订单状态是“待支付”和“已支付”,走同一个流程也可能不一样。所以有用的做法是:把触发bug那一刻的数据状态记录下来,包括账号类型、数据量、状态字段,然后用相同的数据状态去构造复现环境。
最后看时序问题。连续快速点击某个按钮,或者同时打开多个页面进行操作,会触发一些在正常操作速度下永远不会出现的问题。这类问题用脚本去模拟高频操作往往更容易复现。实在复现不了的,就老老实实录屏加抓包,把第一现场的现场证据拿到手,再找开发一起分析。硬碰硬的操作往往是在消耗自己的耐心,也会消耗开发对你的信任。
6.3 时间不够时的测试策略:砍场景不砍质量
测试计划永远赶不上需求变化,尤其是那种周五下午告诉你“下周一出版本”的项目。时间不够用了怎么办?我的答案是:砍场景,但不砍核心质量。
具体做法是把所有用例按优先级排成P0、P1、P2三档:P0是主流程和核心链路,挂了就不能上线;P1是重要功能的分支场景,挂了影响用户体验但影响面有限;P2是边缘场景和低概率异常场景。时间不够时,P2用例顺延到下个版本,P1挑选和本次改动强相关的执行,P0必须全部跑完且全部通过。这样做的逻辑很简单:宁可少测一些场景,也要保证测过的场景是可靠的。最怕的就是那种“每个模块都点了一遍但每个模块都没测透”的假安心。
时间紧张时还有一个容易被忽略的点:和开发同步节奏。你要主动找到这次改动涉及的前端开发、后端开发、产品经理,快速对齐一下“这次改动影响哪些模块、有没有隐藏的风险域”。往往一次十分钟的沟通,顶得上你自己埋头测一小时的收获。
7. 聊聊我个人在做“小猪软件测试”这类内容时的一些体会
写了这么多,最后说点掏心窝的话。经常有人问我,做软件测试有没有前途、会不会被AI替代。我的看法是:点鼠标的测试一定会被替代,但懂业务的测试会越来越值钱。系统越复杂,越需要有人能站在全局视角判断风险的优先级,越需要有人能把业务语言翻译成测试语言、再翻译回bug描述。这种能力,AI短期内替代不了。
做“小猪软件测试”这类账号或栏目的过程,让我深刻体会到一件事:教别人做事,其实是逼自己把经验体系化的过程。你觉得自己会了,真到了要讲给别人听的时候,就会发现很多环节是模糊的、没有验证过的。所以如果你也想在测试这条路上走得更远,不妨试着把自己的测试心得定期沉淀成文档、分享文章或者小课程,哪怕只是写在个人笔记里,都有助于你跳出“会做但说不清”的困境。
最后分享一个小技巧:遇到难搞的业务需求,试着把自己想象成这个产品的用户,关掉需求文档,用一个普通用户的心态去操作。你会发现很多”离谱“的设计正在折磨真实用户,也会发现很多测试用例压根没覆盖到的真实痛点。这比任何测试方法论都管用,也是我这几年坚持下来的习惯。