拓冰建站拓冰建站
首页 / 资讯中心 / 正文

软件测试用例设计实战:从等价类到场景法,打造高质量用例体系

1. 为什么测试用例设计常常做不好做软件测试这些年我面试过不少候选人也带过十几个新人。有一个现象特别有意思几乎所有简历上都写着“熟悉测试用例设计方法”但真到了实际项目里能把用例写到位的十个里面顶多两三个。大部分人写的用例要么是照着需求文档把功能点罗列一遍要么是拍脑袋想到哪儿写到哪儿。等到版本上线出了线上事故翻出用例一看——那条关键路径压根就没覆盖到。1.1 测试用例的本质不是“写文档”而是“定边界”很多人对测试用例有个误解觉得它就是一份给测试人员自己看的操作清单。这个理解太浅了。测试用例真正的作用是在需求、开发、测试三方之间建立一份可执行的验收契约。你写出来的每一条用例其实都是在回答一个问题这个功能做到什么程度才算“对”我举个生活化的例子。你去餐厅点了一份“微辣”的毛血旺后厨说“好的”端上来你吃了一口辣得直冒汗。这时候你找服务员理论服务员说“我们这儿微辣就是放两勺辣椒。”你看问题出在哪儿是“微辣”这个需求没有定义清楚边界。测试用例设计干的就是给“微辣”定标准这件事——一勺还是两勺辣度等级对应多少克辣椒必须写清楚。实际项目中绝大多数bug不是因为开发不会写代码而是因为“微辣”的定义只存在于产品经理的脑子里开发和测试拿到的需求文档里写的是“适量”。所以测试用例设计的第一课不是学方法而是建立起“边界思维”。1.2 新手最常掉的三个坑先说第一个坑用例设计变成了需求复述。需求文档里写“用户输入手机号点击获取验证码”用例里就写“输入手机号点击获取验证码”。这种用例写了等于没写——你没有验证手机号的格式规则没有验证点击按钮前后的状态变化没有验证网络异常时的表现。需求文档说的是“功能应该做什么”测试用例要说的是“功能做到什么程度才算合格”这是两码事。第二个坑只测正常路径不测异常路径。新人在设计用例时脑子里默认用户是个“完美使用者”永远按最理想的顺序操作。但真实用户是什么样的手滑输错账号、充值过程中退出App、连续点击提交按钮、手机没电自动关机。软件测试界有句话叫“用户永远比你想象的更懒、更粗心、更没耐心”异常路径测试就是用来兜住这些不可控行为的。第三个坑用例数量追求大而全不追求精准。我见过有人给一个登录功能写了200条用例里面光是密码框就写了50条——大小写、数字、特殊字符、长度、全角半角、空格……排列组合拉满。但真正有价值的用例是用最少的数量覆盖最多的逻辑分支。200条用例意味着200条维护成本每次需求微调用例都要跟着改最后大概率是改不过来用例变成一堆没人看的废纸。这三个坑本质上是同一个问题的三种表现没有抓住被测功能的核心逻辑。设计测试用例之前先花10分钟把功能背后的业务规则梳理清楚比闷头写用例有用得多。2. 测试用例设计的核心方法等价类、边界值、场景法说到测试用例设计方法所有教材都会列出一长串等价类划分、边界值分析、因果图、判定表、正交实验、场景法、错误推测法……名字听起来很唬人但真正在项目里每天用得上的其实就那几个。我把它们分成了两类一类是用来“拆输入”的一类是用来“串流程”的。2.1 等价类划分把无限输入变成有限集合等价类划分是测试用例设计的基础核心思想就一句话把输入条件按照“是否会导致相同的处理逻辑”分成若干类从每一类里取一个代表值来测试。为什么不用所有值都测一遍因为大多数输入域是无限的比如手机号可以是任意数字组合你不可能把所有组合都测完。但同一个逻辑分支内的输入测试结果是等价的——测了一个就等于测了一类。以手机号输入框为例。需求通常会规定11位数字、以1开头、第二位通常是3/5/7/8/9。那我们可以怎么划分等价类有效等价类11位、以1开头、第二位符合规则的数字无效等价类位数不足、位数超长、包含非数字字符、以非1开头、第二位不符合规则每个有效等价类和无效等价类里各取一个代表值就能把输入域的覆盖做到基本完整。这里有个容易被忽略的点有效等价类和无效等价类都要测。只测有效不测无效等于只验证了“功能能用”没验证“异常能被拦得住”。2.2 边界值分析80%的bug藏在边界上边界值分析是等价类划分的黄金搭档。为什么边界值这么重要因为开发写代码时最容易出错的恰恰是“临界点”附近——循环的边界、数组的下标、字符串的长度判断一不小心就写成了“大于”而不是“大于等于”。经典的例子还是登录密码。假设密码长度要求是6到20位那你需要测试的值是5位下边界-16位下边界7位下边界119位上边界-120位上边界21位上边界1一共6个值就能把边界问题全部覆盖。如果只测6位和20位这两个“合法值”你就漏掉了“差一位不合法”时的系统表现。这里分享一个实操心得拿到需求后先把所有和“数量、长度、范围、次数”相关的条件标出来。比如“金额不能超过5000”“最多上传3张图片”“优惠券有效期为30天”这些都是潜在的边界点。把这些点挑出来用边界值方法逐个设计用例比在中间区域反复测试效率高得多。2.3 场景法把用例从“点状”升级为“线状”等价类和边界值解决了“单个输入怎么测”的问题但真实用户的操作永远是一连串动作的组合——登录、搜索、加购物车、下单、支付、查订单每一步都依赖上一步的结果。这时候就要用场景法把用例串成一条完整的业务流程线。场景法的基础是软件测试里经典的“基本流备选流”模型。基本流是用户完成业务的最理想路径备选流是各种意外分支。拿“下单支付”这个流程来拆基本流用户登录 → 商品加入购物车 → 提交订单 → 跳转支付页面 → 支付成功 → 订单状态变为已支付备选流A购物车为空时直接提交订单 → 提示“购物车是空的”备选流B支付时余额不足 → 提示“余额不足请更换支付方式”备选流C支付过程中断网/退出App → 订单进入待支付状态重新进入后可继续支付备选流D重复提交同一笔订单 → 系统不允许重复支付但需要避免重复扣款场景法设计的用例能覆盖“用户完整操作路径”的正确性和健壮性。这是功能测试里最有含金量的一部分因为跨模块、跨系统的逻辑问题往往只有在这种串联场景下才能暴露出来。注意场景法不是把等价类和边界值替换掉而是在它们之上做叠加。先用等价类、边界值搞定每个环节的输入规则再用场景法把环节串起来两者是配合使用的。2.4 判定表与正交实验什么时候才用得上判定表和正交实验属于“高频面试、低频实战”的方法但特定场景下非常管用。判定表适用于“多个条件组合决定一个结果”的逻辑。比如优惠券系统用户是否登录、商品是否参与活动、优惠券是否过期、订单金额是否达到门槛这四个条件的组合决定了“这张券能不能用”。组合起来有2的4次方16种情况用判定表把条件和动作对应起来一目了然不容易漏。比在Excel里手动罗列要系统得多。正交实验法适用于条件多、组合爆炸的场景。比如装饰App的主题设置有背景色、字体、图标风格、首页布局四个维度每个维度3种选项全组合就是3的4次方81种。实际测试不可能全跑一遍用正交表选出有代表性的组合能用较少的用例覆盖大多数组合情况。这两个方法不需要每次都用但遇到“条件多、逻辑强”的需求时一定要想起来用——因为它们能帮你把“凭经验猜”变成“按规则算”。3. 从方法到落地如何写出一份可直接执行的测试用例方法学了再多最终都得落到“写”这个动作上。测试用例的书写有一套约定俗成的行业规范字段怎么设计、步骤怎么写、优先级怎么定都有讲究。很多用例写不好不是方法不会而是“表达”出了问题。3.1 测试用例的核心字段与设计逻辑一份标准的测试用例至少应包含这些字段用例编号唯一标识便于追溯和管理所属模块标明功能归属方便统计和缺陷定位用例标题一句话概括测试意图建议采用“条件动作预期”的格式前置条件执行本条用例前需要准备的环境、数据、状态测试步骤清晰、可执行的操作序列测试数据步骤中需要输入的具体值预期结果执行步骤后系统应表现出的行为优先级P0/P1/P2/P3表示用例的重要程度实际结果执行后留空由执行者填写这里重点说一下“用例标题”和“预期结果”。用例标题是给人看的必须一眼能看出在测什么。对比一下这两种写法“输入正确手机号和密码登录”和“验证手机号密码匹配时登录成功”——后者包含了条件和预期比前者信息量大得多。预期结果是最容易被写废的字段。“系统正常提示”这种写法等于没写。“正常”是个主观词不同的人对“正常”的理解可能完全不同。好的预期结果应该具体到可判断的程度比如“页面顶部弹出绿色提示条文案为‘保存成功’3秒后自动消失”或者“提交按钮置灰不可点击按钮下方显示红色提示文字‘金额不能为0’”。只有预期结果可验证用例执行的结果才可判定。3.2 用例的粒度写到什么程度才算合适新手写用例时最容易纠结的一个问题是步骤到底要写到多细写得太粗执行的人看不懂还得跑来问你写得太细用例变得又臭又长维护成本飙升。我的经验是以“一个步骤只完成一个动作”为原则。比如“输入账号”和“输入密码”要拆成两步不要合并成“输入账号密码”一步。但每一步不需要写到“把鼠标移到输入框点击左键”这种程度——除非点击位置有歧义否则这些基础操作默认执行者会。还有一类特殊情况要考虑涉及跨系统数据的步骤必须写明数据的来源和去向。比如“从外部Excel导入用户数据”这条用例要在步骤里写清楚Excel文件的路径、格式、字段映射规则否则执行者根本不知道拿什么数据去跑。3.3 一条“合格”的测试用例拆解示例拿“用户注册”功能中的一条用例来完整拆解一遍用例编号TC_REG_003 所属模块用户注册 用例标题验证手机号已注册时注册页面提示“该手机号已注册” 前置条件 1. 系统中已存在手机号13800138000的注册用户 2. 用户处于注册页面 测试步骤 1. 在手机号输入框中输入13800138000 2. 点击“获取验证码”按钮 3. 输入收到的6位验证码 4. 点击“注册”按钮 测试数据手机号13800138000验证码123456测试环境固定验证码 预期结果 1. 点击注册后页面停留在注册页 2. 手机号输入框下方以红色文字提示“该手机号已注册” 3. 提示文案完整可见不截断 优先级P1这条用例好在哪儿前置条件写清楚了系统里必须存在已注册用户步骤可执行每一步一个动作预期结果可判断明确提示位置、颜色、文案、页面状态。任何人拿到这条用例不需要再问你任何问题就能独立完成执行和结果判定。好的测试用例就应该是这个状态——不依赖“作者在场”。4. 场景驱动从功能点到业务流的用例设计实战单条用例写得好只是一个基础。真正体现测试设计功力的是面对一个完整需求时你能不能有条理地把用例“铺”出来形成一套覆盖完整的用例集。4.1 分析需求找出核心业务流程与分支拿到一个需求不要先急着打开Excel开始写用例。先做需求分析把业务规则梳理清楚。推荐一个我常用的方法先用一句话描述业务核心流程再画分支。拿“电商App的优惠券下单”来说核心流程是用户领券 → 商品加入购物车 → 结算时选择优惠券 → 系统校验优惠券可用 → 扣减优惠金额 → 生成订单。然后是各个分支优惠券不在使用范围内怎么办优惠券过期了怎么办订单金额小于优惠门槛怎么办优惠券和满减活动能不能叠加把这些分支列出来你会发现很多边界条件、异常场景都浮出水面了。然后再针对每个分支去设计用例思路会清晰很多。4.2 综合用例设计等价类边界值场景法错误推测实际工作中没有哪个功能是只用单一方法就能覆盖完善的。一份好的用例集一定是多种方法组合的结果。还是拿“优惠券下单”来说场景法覆盖核心流程——领券、加购、结算、选券、下单、支付等价类覆盖优惠券状态——未使用、已使用、已过期、已作废边界值覆盖使用门槛——订单金额刚好等于门槛、差1元、多1元错误推测覆盖异常操作——同一张优惠券在两个设备上同时使用、支付时取消订单再重新下单这个过程建议直接在用例管理工具或Excel里操作按模块分组、按优先级排序、按方法打标签。不要想着“一次写完美”第一遍先把想到的都写上第二遍再删冗余、补漏项。4.3 用例评审让需求和开发帮你补漏用例写完之后一定一定要做用例评审。这不是流程要求而是实实在在的补漏机会。评审会叫上产品经理和开发把用例集逐个过一遍。你会发现很多你以为理解正确的业务规则产品和开发的解释其实跟你不一样——这种分歧如果等到测试执行时才暴露返工成本就大了。评审时有一个技巧先讲规则再讲用例。不要上来一条条念用例而是先把你对业务规则的理解用三五句话讲清楚看看产品和开发认不认可。规则对了用例大概率不会有方向性错误规则不对你也不用在一堆用例上返工只需调整对应的用例即可。实操心得评审时让开发重点看“预期结果”这一列。开发对系统内部实现最熟悉他们能一眼看出哪些预期结果写得不对、哪些场景实际不可能发生。让开发挑用例的“错”比测试自己闷头检查效率高得多。5. 测试用例的维护用例不是一次写完了就结束进入测试执行阶段用例设计的工作其实还没完。测试用例是一个“活”的文档需要跟着版本的迭代不断更新。很多团队的用例库最后变成一个无人维护的“墓园”根本原因就是大家把用例设计当成了“一次性的交付动作”而不是“持续演进的过程”。5.1 版本更新时用例如何同步修改每次需求变更先别急着改代码、测功能第一步应该是评估用例需要怎么变更。需求变更的影响范围从用例层面来看有几种情况新增功能新增对应的用例原有功能逻辑调整修改受影响的用例预期结果功能删除/下线用例标记为“已废弃”不要直接删除保留历史记录可追溯措辞、文案调整只需要更新预期结果中的文案描述这里分享一个很多团队踩过的坑需求变了用例没跟着改测试执行时用旧用例去测新功能一批用例全挂。然后测试开始“修用例”去适配新功能但修之前没有先确认新逻辑的正确性——等于用“被测系统的行为”去定义“预期结果”本末倒置了。正确的顺序一定是先明确新需求下“正确的行为是什么”再调整用例的预期结果最后再执行验证。5.2 线上缺陷反哺用例库用例维护还有一个重要来源线上缺陷。每次线上出了问题都应该复盘一个问题为什么这条用例没在测试阶段发现原因无非两种要么是没设计对应的用例覆盖缺失要么是设计了用例但没执行执行遗漏。针对覆盖缺失的情况把线上缺陷对应的场景补充进用例库针对执行遗漏的情况要反思的是测试计划和执行流程的问题。我有一次复盘线上的一个严重缺陷用户在支付环节连续点击“确认支付”两次系统生成了两笔订单扣了两次款。查了一下用例库场景法用例覆盖了“重复提交订单”这个场景但预期结果写的是“提示订单已提交请勿重复操作”没有验证重复请求是否会真正创建两笔订单。这就是预设了系统会正确拦截但实际系统没有拦截。后来我在这类场景的用例里加了一条规则凡是涉及“防止重复操作”的功能用例必须验证系统不做防护时的表现用破坏性测试来确认防护真的有效。5.3 用例的优先级管理与回归策略用例优先级是很多测试团队容易忽略的点。没有优先级或者优先级全设成P0的用例集在版本迭代周期紧的时候根本没法做回归测试。回归测试的本质是“花最少的时间验证改动没有破坏原有功能”——没有优先级你只能全部执行时间和成本都扛不住。优先级划分的逻辑建议是P0核心业务流程的主路径。任何一个出问题都会线上事故必须每次回归都执行。比如登录、支付、数据保存。P1核心功能的常见分支和重要异常场景。出现问题时影响大部分用户但可能有临时规避方案。比如权限异常、数据边界。P2非核心功能的正常路径和一般异常场景。比如个人资料修改、设置项。P3界面样式、提示文案、不常用的边缘场景。每次版本测试P0全量执行P1选择性执行P2/P3结合改动范围抽查。这样既能控制回归成本又不会漏掉关键风险。很多时候用例设计得再全没有一个合理的执行策略价值也发挥不出来。6. 测试用例与自动化测试、面试的衔接思考测试用例设计这件事往深了说它不仅是手工测试的指导文档也是自动化测试的脚本蓝图更是软件测试面试中考察逻辑思维能力的核心考点。先说自动化测试。很多人学自动化时的第一个困惑是“我不知道脚本里该写什么断言。”这个问题的答案其实就藏在测试用例的“预期结果”字段里。用例里写了“页面弹出提示‘操作成功’”脚本里对应的就是断言这个元素存在、文本匹配用例里写了“接口返回code为0”脚本里对应的就是断言response body中的字段值。所以一份高质量的测试用例就是在为自动化脚本提供最直接的输入。再说面试。软件测试面试中测试用例设计是必考题考察的核心不是“你会不会背等价类边界值的定义”而是“你能不能有条理地拆解一个真实功能”。面试官抛出一道“请你设计一个电梯的测试用例”或“请你设计一个登录功能的测试用例”他其实想看到的是你的分析过程你有没有先问清楚电梯的使用场景有没有从功能、性能、安全性、易用性多个维度去思考有没有覆盖正常、异常、边界情况这些思维方式恰恰是日常工作中把测试用例设计方法用熟之后自然形成的。关于这个话题我还想分享一个夏令营时候的故事可能有点跑题但对我影响挺深。有一次带新人让一个刚入职的小朋友独立设计一个中小型项目的全量测试用例。他花了两天时间交了四百多条用例。我翻了一下第一反应是“这也太多了”但仔细看下来发现功能模块覆盖挺全边界条件和异常场景也都想到了。唯一的问题是很多用例和实际业务严重脱节——他完全站在“输入框”的视角设计用例却没有理解这个输入框在真实业务里到底承载了什么规则。后来我让他重新梳理业务需求花了一个晚上砍到两百条以内质量反而高了很多。那件事之后我给新人带教的时候永远都会强调一句话测试用例设计的核心不是方法而是理解业务。方法只是工具帮你把理解转化为结构化的表达。没有对业务规则的深入理解再多的方法也写不出高质量的用例。反过来如果你读懂了一条业务规则背后的真实逻辑哪怕只用等价类和边界值两个方法也能写出让开发和产品都点头的用例来。这也是为什么做了几年测试之后我觉得自己最大的成长不是多会几个工具而是越来越懂得怎么快速理解一个陌生业务的核心逻辑。最后再分享一个我坚持了很多年的小习惯每次拿到一个新项目的测试任务我不急着写用例而是先花半天时间把需求文档通读两遍然后拿一张A4纸把核心业务流程画出来把所有的分支全部列出来把自己能想到的异常场景全部标出来。这个过程看起来“没在干活”但它是我效率最高的时候。所有高质量测试用例的源头都不是那些现成的方法模板而是这份对业务逻辑的死磕。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门