ARTICLE DETAIL

资讯详情

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

测试用例设计实战:从等价类到场景法,方法与AI辅助落地

测试用例设计实战:从等价类到场景法,方法与AI辅助落地 测试用例设计这件事我做了十几年面试过几百个测试工程师发现一个挺扎心的规律很多人写了几年用例本质还是在凭感觉。问他用了什么方法能说出等价类、边界值但一到真实项目里用例设计得七零八碎漏测了还不知道漏在哪。软件测试的核心价值就是发现缺陷而测试用例就是发现缺陷的作战地图。地图画得稀烂仗怎么打都是输。这篇文章我想把测试用例设计这件事从头到尾捋一遍——不是教科书式地罗列方法而是结合我这些年踩过的坑、总结的经验讲清楚每个方法背后的为什么以及在真实项目里到底怎么落地。内容会比较长但每一段都有实操价值。无论你是刚入行的测试新人还是带团队的测试负责人应该都能从中找到自己用得上的东西。1. 测试用例设计的底层逻辑不是在写步骤是在拆解风险1.1 先搞清楚测试用例到底在解决什么问题很多测试新人有一个误区觉得测试用例就是把操作步骤写清楚照着执行就行。如果只是这样那测试用例的价值就大打折扣了——照着步骤点一遍那叫操作记录不叫测试设计。测试用例的本质是对被测系统的风险进行结构化的拆解和覆盖。你写每条用例的时候脑子里真正该想的问题是这个功能点什么情况下会出错什么样的输入、什么样的操作顺序、什么样的环境状态最容易引爆这个错把这些可能性系统地列出来再转成可执行的验证步骤这才是测试用例设计的核心。我给你打个比方。测试用例设计就像装修前的水电布线图——水电工不会一边凿墙一边想线怎么走而是提前根据房子的户型、家电位置、使用习惯把所有点位画得清清楚楚。你照着图施工后期才不会出现插座被挡住、线路交叉干扰这些问题。用例设计也是一样前期把系统所有可能的通电点位摸清楚后面执行才不会手忙脚乱、东漏西漏。所以设计用例之前第一件事不是打开Excel表格开始写而是先想清楚我要测的这个东西它的风险面到底在哪里。1.2 需求理解不到位用例设计就是空中楼阁我见过太多用例设计翻车的项目根子都不在设计方法上而在需求理解上。需求文档写得模棱两可、需求评审走过场、测试人员不看产品原型就直接动手写用例——这种前置环节偷的懒后面要用十倍的工作量来还。举个真实例子。之前做一个电商系统的优惠券模块需求文档上写了一句优惠券可与满减活动叠加使用。看起来挺明确对吧但如果较真这一句话里至少包含六七个需要澄清的问题叠加顺序是什么先算满减还是先抵用券优惠券抵扣后的金额还参与不参与满减门槛的计算叠加后如果订单金额变成0运费怎么算退款的时候优惠券金额和满减金额按什么比例退回虚拟商品、预售商品能不能叠加如果用户同时有多张券系统自动选最优还是用户自己选这些问题你不在设计用例之前搞清楚写出来的用例大概率只能覆盖优惠券能和满减一起用这个最表面的场景。真正容易出问题的边界——比如优惠后金额为负、退款比例异常——全漏了。所以我一直强调一个动作每个需求在动手设计用例之前先做一次测试角度的需求拆解。把需求文档里的每个功能点拆成输入、处理、输出、状态变化、数据影响、异常分支六要素然后针对每个要素列出疑问清单找产品经理逐条确认。这不是在抬杠是在帮整个项目排雷。1.3 测试用例的颗粒度怎么定不是越细越好很多团队喜欢追求用例数量觉得用例写得越多越专业。一套系统下来几千条用例看起来覆盖率很高实际上执行起来痛苦不堪——每条用例都在重复登录、重复打开页面、重复准备数据真正有区分度的验证点淹没在一堆机械操作里。用例的颗粒度应该取决于两个因素测试的层级和团队的自动化成熟度。功能测试阶段用例要细到可执行——别人拿着你的用例不需要动脑就能一步步操作。但这里的细指的是验证点的清晰不是步骤的冗余。比如验证登录功能输入正确用户名和密码点击登录验证跳转首页这就够了不需要把打开浏览器-输入网址-等待页面加载-移动到用户名输入框-点击输入框-输入内容这种操作级步骤也写进去。后者是自动化脚本干的事不是人肉功能测试用例干的事。自动化成熟度高的团队用例的颗粒度可以适当放粗因为脚本会帮忙处理重复的前置步骤纯手工执行的团队颗粒度要适中既要保证新人能直接上手又要避免每条用例都冗长得没法看。我的习惯是一条功能测试用例验证点不超过3个。超过3个验证点就拆开否则一旦中间某步失败后面的验证点全部作废排查问题时根本分不清是哪一步导致的结果异常。2. 核心用例设计方法每一种方法背后的真实意图2.1 等价类划分把无穷的输入域切分成有限的风险域等价类划分是测试设计的第一课也是日常项目里用得最频繁的方法。它的核心思想是把输入域的无穷多种可能划分成若干个效果等价的集合每个集合里只要测一个代表值就等同于测了整个集合。为什么有效因为绝大多数系统的输入处理逻辑不是针对具体值而是针对值的类型和值的范围。比如一个手机号输入框它只关心你是不是11位、是不是1开头、是不是纯数字它不关心你的号码具体是138还是139。所以你在有效的11位手机号这个等价类里随便挑一个数字测测出来的结果和换其他数字是一样的。等价类划分的关键是划分的完整性和准确性。完整性是说你要能覆盖所有的有效等价类和无效等价类。这里新手特别容易犯的错是只关注有效等价类把无效等价类忽略了。比如手机号输入框有效等价类是11位纯数字无效等价类至少有三个长度不足11位、包含非数字字符、超过11位。很多用例设计只测了正确输入能通过完全不测错误输入怎么拦截结果上线后用户随便输个字母后端直接报500。那怎么保证划分的完整性我的建议是站在数据处理流程的角度去划分而不是站在界面显示的角度。一个输入框的数据从前端到后端大概经历四个关卡格式校验、业务逻辑校验、存储校验、下游系统校验。你对着这四个关卡分别想每一关会拒绝什么样的数据把这些被拒绝的类型列出来就是完整的无效等价类。2.2 边界值分析八二法则在测试领域的最佳应用如果等价类划分是解决面的覆盖那边界值分析就是解决线的突破。大量的缺陷集中在边界附近这已经是行业共识——因为开发人员在写判断逻辑的时候最容易写错的就是等于、大于、小于这些边界条件尤其是边界值应该用还是差了这一个符号就是两种完全不同的行为。边界值分析有三个关键点第一边界值要和等价类配合使用不是独立存在。划分完等价类之后要把每个等价类的边界值单独拎出来测。比如一个输入框要求1到100之间的整数等价类是1-100有效值和小于1/大于100的无效值边界值至少覆盖0、1、2、99、100、101这六个点。0和101验证无效边界1和100验证有效边界2和99验证边界内部的正常值。第二别忘了边界两侧的语义差异。很多系统的边界不是简单的数值大小而是状态切换点。比如积分等级的划分——铜牌会员是0到1000分银牌会员是1001到5000分。这时候1000分和1001分虽然数值上只差1分但用户的等级显示、权益内容完全不同。这种业务状态的边界比纯输入值的边界更容易出bug也更值得重点设计用例。第三边界值要关注入参的组合场景。常见的问题是多个参数各自都在边界内但组合在一起就超界了。比如下单功能单价是边界内的最大值数量也是边界内的最大值两者相乘的总金额就超上限了。这种组合边界的问题单参数边界分析是发现不了的需要配合场景法或者正交试验来做。2.3 场景法从用户视角出发覆盖真实的业务流程等价类和边界值本质上是单点思维——它们关注的是某个输入框、某个参数、某个字段的处理。但真实用户不会只操作一个点他们是在完整流程里完成一个业务目标。场景法补的正是这个维度。场景法的核心是梳理系统的业务流和备选流。主业务流就是用户完成核心任务的最短路径比如电商下单搜索商品-加入购物车-提交订单-支付-收货。备选流则是这个路径上每一步可能出现的分支和异常商品库存不足怎么办支付超时怎么办优惠券过期怎么办收货地址不完整怎么办设计场景用例的时候我的习惯是画业务流程图——不画特别复杂的时序图就是最基础的主流程箭头分支框。把主流程的每个节点列出来然后逐个节点问三个问题这个节点有哪几种成功路径这个节点有哪几种失败情况失败之后系统给用户的反馈路径是什么这三个问题问下来一个业务模块的场景基本就覆盖得七七八八了。这里我特别想强调的是第三种——失败后的反馈路径。很多用例设计把重点放在失败时系统报错提示就停住了但真实用户关心的是报错之后我还能不能继续完成我的事。比如支付失败系统提示支付失败之后用户能不能重新发起支付重新发起的会话状态还正不正常订单状态有没有被错误地标记为已支付这些失败后的下一步才是场景法最有价值的地方。2.4 判定表法多条件组合逻辑的克星当系统的业务规则涉及多个条件、每个条件又有多个取值的时候判定表法是最好的工具。它的本质是穷举所有条件组合并且把每个组合对应的动作明确列出来确保没有任何一种组合被遗漏。判定表法的操作步骤其实很机械列出条件桩、列出动作桩、填充条件组合、为每个组合指定动作。机械是机械但正是这种机械性避免了靠脑子硬想容易漏掉的组合。举一个真实的例子。某支付系统的退款规则有三个条件订单是否已支付、退款金额是否等于订单金额、退款发起时间是否在支付后24小时内。三个条件各自只有两个取值看起来很简单对不对但三个条件的组合共2的3次方等于8种情况。如果全靠脑子想你很可能只想到已支付-全额-24小时内和未支付这两三种常见情况其他五种组合全漏了。用判定表一拉八种组合摆在那里你逐个填动作哪些该支持哪些该拒绝一目了然。判定表法的升级玩法是处理条件之间有约束的场景。有些条件组合本身不合法比如未支付和全额退款成功本来就矛盾。遇到这种情况你可以把这些组合标记为不可能发生并跳过但要注意——你觉得不可能发生的组合不代表系统的异常输入不会触发。比如系统消息重试、定时任务调用、接口被直接请求这些场景可能会绕过界面逻辑直接到后端。所以不可能发生的组合建议还是随便设一个代表用例去测一下往往能测出意想不到的惊喜。2.5 错误推测法测试敏感度的终极体现错误推测法不算是严格的方法它更像是测试经验的价值体现——基于对系统历史缺陷的了解、对同类系统常见问题的了解直接猜哪里可能会出问题然后有的放矢地设计用例。这个方法听起来玄但实操上是有迹可循的。我从这几个维度去做错误推测历史缺陷库这个模块以前出过什么bug修过什么线上问题修复的方式是不是补丁式、容易引发回归常见的开发失误模式时间字段用错时区、金额计算用浮点数、删除操作没做软删除、批量操作没做事务控制、权限校验只做了前端没做后端——这些都是开发里高频出错的点逐个排查过去就能找到一堆值得测的场景。用户的操作习惯用户在界面上不会老老实实按你的设计思路操作双击提交按钮、狂点刷新、频繁切换页面、复制粘贴带格式的文本、输入框里输入表情符号这些非预期操作最容易触发并发和状态类问题。错误推测法最好用的场景是回归测试设计——系统即将发版你不需要完整地跑一遍全量用例时间也不允许。用错误推测法挑出最有风险的点针对性补几条用例往往比平均用力地跑全量更能抓住致命bug。3. 用例表达的艺术写得好不如写得让人看得懂、执行得对3.1 一个合格的测试用例必须有这几个要素很多人觉得用例格式是走过场几个字段而已写什么都行。实际上用例要素的完整性直接决定了执行质量和后续的维护成本。一个真正合格的测试用例至少要包含这些要素用例编号要有明确的命名规则建议用模块-功能-序号的格式前置条件这条用例执行前系统需要处于什么状态、需要准备什么数据测试数据执行这条用例需要用到的具体输入值要写清楚操作步骤清晰的、有编号的执行步骤每一步只做一件事预期结果每个步骤或最终步骤后系统应该呈现什么状态、输出什么内容优先级标明这条用例的重要性等级决定它在回归测试里的执行顺序用例类型功能、接口、性能、兼容性、安全等方便测试统计分析这里我最想强调的是前置条件和测试数据这两项。它们恰恰是最多人忽略的。很多用例写着输入有效用户名和密码登录成功但完全不写有效用户名和密码到底是多少。执行人要么到处找人问测试账号要么随便造一个数据然后发现压根没权限。一条用例的执行效率往往就卡在这种小细节上。另外前置条件里还应该包含数据清理说明。比如这条用例执行前需要保证数据库里不存在指定编码的数据否则用例可能因为脏数据干扰而误报失败——这条信息你不写执行人根本不知道要去清理。3.2 预期结果怎么写才不会被挑战预期结果是测试用例里最容易被写糊弄的部分也是测试用例评审时被挑战最多的部分。常见的写法问题是页面提示成功——这是AI生成的典型写法问题在哪没说清楚是弹窗提示还是页面内提示还是接口返回提示成功的具体表现是什么页面跳转到哪里数据库的状态字段变成什么——全都没有。真正的预期结果要写到外部可观察、可验证的程度。我给你一个标准模板所有预期结果都往这个模板上靠界面表现页面上哪个区域出现了什么内容数据表现数据库哪些表哪些字段变成了什么值交互反馈用户操作后系统给出了什么形式的响应关联影响这个操作对同系统的其他功能产生了什么影响举个例子同样是修改密码成功好的预期结果是修改密码后系统提示密码修改成功页面自动跳转到登录页用户使用新密码能正常登录旧密码提示用户名或密码错误数据库中user表password字段已更新为新值。这样写任何人都能清晰判断用例是通过还是失败。3.3 用例评审的重点安全问题要从业务逻辑角度提用例评审是测试用例设计中非常关键的一环但很多团队的评审流于形式——测试人员把用例念一遍其他人听听就过了。我做了这么多年发现用例评审最容易出问题的地方反而是评审视角的单一。常规的评审重点是功能覆盖是否完整、预期结果是否准确但真正有经验的评审者会从用户逻辑和利益相关方的角度去审视用例。什么叫从用户逻辑角度审视就是你把自己当成一个普通用户不带任何技术背景顺着用例走一遍看会不会遇到说不通的地方。比如电商系统的优惠券用例——我们测试的时候往往会约束一张订单只能用一张券但真实用户会想我两张券都想用你系统凭什么不让我用如果产品没明确说过只允许用一张这个case就是需求和实现的错位评审时应该被揪出来。我建议评审前准备一个评审安全区清单从以下几类问题去审视每一组用例业务覆盖主流程、分支流程、异常流程是否全覆盖外部依赖涉及第三方接口、消息队列、定时任务时用例是否考虑了依赖方的超时、重试、异常返回数据权限用户A能不能看到用户B的数据低权限用户能不能执行高权限操作兼容性不同浏览器、分辨率、操作系统的表现是否一致安全边界输入框有没有考虑SQL注入、XSS攻击、越权访问4. 用例的复用、维护与管理让用例资产增值而不是变成负担4.1 不同项目组的复杂迭代中用例怎么复用才能不失控多项目并行、版本迭代快的团队里用例管理最大的问题是失控——每个人都在自己负责的项目里写自己的用例格式不统一、编号混乱、同一功能点被多套用例反复覆盖存量用例无人维护逐渐变成一堆僵尸文档。要让用例资产真正发挥作用我从实践中总结了一套做法建立三层用例库结构。第一层是公共用例层。它包含各个项目通用性很强的用例比如登录、注册、个人信息修改、文件上传下载这类几乎每个系统都有的基础功能。公共用例由专人维护任何项目需要时直接引用不允许各项目组自行重写。第二层是项目用例层。它包含当前项目特有的业务功能用例比如电商项目的优惠券、库存、订单支付项目的清结算、对账、风控。项目用例由项目组维护版本迭代时随项目变更而调整。第三层是临时用例层。它存放探索性测试、专项测试、一次性验证的用例验证完就归档不进入资产库。三层用例库的好处是既保证了跨项目的复用效率又避免了对项目特殊性的忽视。各项目组在写用例前先查公共层有没有能直接复用的再决定新增哪些项目层用例——这样可以省下大量重复劳动尤其适合多个业务线并行、人员频繁调动的团队。4.2 用例的版本管理和代码一样认真对待很多团队把用例当文档管理只关心当前版本长什么样不关心历史版本为什么长那样。但真实项目里用例的版本变化往往能反映需求的变化脉络这在追溯线上问题时非常有用。我的建议是用例一定要做版本管理关键字段是变更原因和变更人。每次变更用例不是简单地把预期结果改掉就行而是要记录为什么改——是需求变了还是发现原来设计错了这两个原因对后续决策的影响完全不同。如果是需求变了那这次变更可能影响关联模块需要额外补充关联用例如果是原来设计错了那需要考虑是不是有其他用例也犯了一样的错。另外每个版本发布前的回归测试应该明确记录本次回归跑的是哪个版本的用例集。这样线上出了问题你可以回溯当时回归的覆盖范围是什么、有没有跑这个场景、跑的时候结果是什么。没有这个记录排查问题就只能靠猜。4.3 存量用例的定期清理敢于删才配得上叫资产用例库最怕的事情不是没有用例而是垃圾用例太多。随着系统迭代很多用例对应的功能已经改了甚至整个模块都下线了但用例还是静静躺在库里面。每次全量回归都要跑一遍浪费时间不跑吧又怕漏了什么——这种鸡肋用例就是负资产。我每年都会安排一次用例库的大扫除。筛选标准很简单三个月内有没有被执行过是否匹配当前系统的功能和需求执行结果是否稳定可预期如果一条用例三个月以上没被执行它大概率已经失联于当前系统了——对这种用例先标记为废弃候选确认后删除或归档。清理的目的不只是省执行时间更重要的是提升用例集的信噪比。回归测试时跑完一套用例每一条都有实际验证价值测试人员对结果越有信心。如果用例集里一半是僵尸用例执行人员跑完也不知道到底是系统正常还是用例失效测试结论就不可信了。5. AI辅助测试用例设计工具能做什么、做不了什么这两年AI辅助测试的热度很高像基于AIGC的测试用例自动生成、用大模型读需求文档直接生成用例脚本这类技术已经有不少团队在尝试。我自己也深度试用过几款工具说点真实感受。AI在测试用例生成上的优势是明显的速度极快、覆盖面广。给它一份需求文档它能在几秒钟内列出几十上百条用例涵盖了正常流、异常流、边界值而且格式非常规范。这些用例作为初稿或者查漏补缺的参考价值很高——尤其是时间紧、需求量大、人手不足的迭代期AI生成的用例能帮测试人员快速建立起覆盖骨架。但AI生成的用例有比较明显的短板体现在三个方面第一对业务语义的理解不到位。AI能识别出输入框对应等价类划分但它理解不了你这个输入框背后的业务规则和行业约束。比如银行系统的转账金额限制不是单纯的数值边界而是涉及反洗钱、合规、风控的多层规则——这种深层次的业务约束AI很难生成真正有效的验证场景。第二容易生成正确的废话。AI生成的很多用例预期结果是系统提示成功数据保存成功逻辑上没错但跟没说一样完全没有可验证性。第三无法理解需求之外的真实用户行为。错误推测法依赖的恰恰是对用户操作习惯、历史缺陷、业务痛点的理解这些东西不在需求文档里而在测试人员的经验里。AI读不到经验。所以我对AI辅助测试的态度很明确工具可以当副驾驶但方向盘必须把握在测试人员手里。AI生成用例之后你需要做的是给它做一次人肉质量过滤——把语境化、业务化的预期结果补进去把不符合真实业务流程的用例删掉或改掉把遗漏的、需要业务经验才能想到的场景补上去。用得好AI是你的效率翻倍器用不好直接照搬它会成为你线上漏测的背锅侠。6. 常见问题速查这些坑我都替你踩过了我整理了测试用例设计和执行中高频出现的问题做成了一个速查表方便你对照自查。问题类型典型表现根本原因解决方案需求盲猜用例覆盖了功能但覆盖的是以为的需求没有做需求拆解和逐条澄清写用例前先列出疑问清单逐条找产品确认无效用例占坑用例数量庞大但重复验证同一逻辑没有做好等价类划分抽样意识不强每类等价物只保留代表性用例其他标注可复用但不必重复执行路径覆盖缺失用例全部是主流程分支流程和异常流空白缺少场景法应用对备选流梳理不足用主流程分支框的方式逐个节点推演预期结果模糊提示成功式写法无法有效判断对错没有把预期结果落到外部可观察的粒度按界面数据交互关联影响四层结构补全预期结果用例与代码脱节用例设计的场景和真实实现逻辑不匹配测试人员不了解系统内部实现增加代码走读、接口文档阅读让用例反映真实逻辑回归测试执行不动用例库膨胀到执行时间远超迭代周期缺少用例清理和优先级管理建立优先级机制明确哪些必跑、哪些选跑定期清理僵尸用例用例资产不沉淀项目结束用例就丢新项目从零开始三层用例库机制没有建立起来按公共、项目、临时三层分库管理公共层专人维护AI生成照搬直接使用AI生成的用例做测试漏测后无从排查过度依赖工具缺少人工过滤将AI输出当初稿逐条做业务化改造和真实性校验关于优先级管理我想再单独说几点。优先级不等于重要程度它应该是出问题的影响范围和出问题的概率的综合得分。我的评分思路是影响范围看故障发生后的严重等级概率看这个功能的历史缺陷密度和最近改动频度。两者相乘分数高的排高优先级。回归测试时P0用例是必须全跑的P1用例根据时间情况尽量全跑P2用例可以被抽取跑或者依赖自动化覆盖——这样有限的测试时间会花在最值得的地方。最后说几句真心话做了这么多年测试我自己在用例设计上最大的转折点是从学会方法到理解为什么用这个方法。等价类划分不是为了凑用例数量而是为了理解系统的数据处理逻辑边界值分析不是为了测那几个数字而是为了理解开发人员最容易犯错的位置场景法不是为了画流程图好看而是为了理解用户真正的使用路径。当你带着理解去设计用例而不是带着模板去套方法用例质量会有质的提升。还有一点经验值得分享测试用例设计不是一次性的工作它应该贯穿整个项目生命周期。需求变更了用例要跟着改开发实现调整了用例要跟着优化线上出了bug用例要补回归场景版本迭代几轮之后用例库应该是越变越有价值而不是越变越臃肿。最后一个小技巧如果你不知道怎么提升自己的用例设计能力可以从复盘开始——每次你测出了bug不要急着提缺陷单走人花十分钟想一想这条用例之前为什么没覆盖到这个场景是设计方法没用对还是需求理解有偏差还是纯粹就是漏了想明白之后把这条场景补进用例库。久而久之你自己的用例设计敏感度就在这些复盘中逐步成长起来了。这才是测试用例设计能力的真正增长路径——不在于读过多少方法论而在于从每一次失败中沉淀了多少理解。
返回列表