简介:这是一份面向测试人员及技术管理团队的《测试用例编写指南》文档,旨在解决用例编写凭经验、颗粒度不一、可读性差等问题,使测试设计有章可循。内容覆盖需求分析、业务流程分析、系统设计分析、用例编写与完善等完整步骤,并详解标题、前置条件、操作步骤、预期结果等编写要素,以及等价类划分、边界值分析、状态迁移等常用设计方法,同时给出需求与用例划分原则、维护时机和风险建议,适合初学者建立规范,也适合团队统一用例标准。资源为单个docx文档,约494KB,便于直接查阅和按需修改。已有551人学习下载,对希望提升用例质量、保障系统投产质量的测试人员具有实用参考价值。
1. 测试用例编写指南到底是什么:一份能让团队少熬夜的文档
某个版本上线前,测试群里一片安静,因为所有人都觉得这次改动小、影响面窄,用例库里随便挑几条跑一遍就够了。结果上线两小时后,一个只在特定权限组合下才会出现的分支逻辑把核心流程堵死,线上事故群的红色消息刷了一整夜。事后复盘时大家翻用例库,发现那条路径根本没人写过用例。这就是“测试用例编写指南”这类文档要解决的痛点:它不负责教你用某个工具,而是告诉你一份用例该怎么写、写多细、覆盖什么,才能让系统在变更时仍然安全。这份指南适合刚入行的测试工程师、需要自己补测试的开发者,以及想把用例库从“随手记录”升级成“工程资产”的团队。接下来我按自己多年落地的思路,把这份指南拆成骨架、流程、方法、坑和维护五个部分,每一步都能直接抄回去用。
2. 先搭骨架:一份测试用例必须包含哪些核心要素
很多新手拿到用例模板时,第一反应是“字段这么多,写起来好麻烦”。但如果你只在文档里写“输入手机号,点击登录,验证能登录成功”,评审的人会立刻问:用什么手机号?是已注册的还是未注册的?网络环境是什么?服务端返回什么算成功?这些信息一旦缺失,用例就只能靠执行人去猜,而猜测恰恰是漏测的起点。所以我在写指南时,第一步永远是先把用例的字段结构定死,让所有人共用同一套骨架。
2.1 用例基础字段清单与每个字段的常见错误
一份可评审、可复用的手工测试用例,至少需要包含以下十个字段。每个字段都不是摆设,背后对应一个评审时常见的追问。
| 字段 | 说明 | 常见错误 |
|---|---|---|
| 用例编号 | 唯一标识,一般用“模块-类型-序号” | 随手编一个,不分类,无法追踪 |
| 所属模块 | 功能模块名称,对应系统的菜单或业务域 | 写得太粗,比如“登录”而不是“登录-验证码模块” |
| 用例标题 | 一句话说清“在什么条件下做什么事,验证什么” | 写“登录测试”这种废话标题 |
| 前置条件 | 执行前环境、数据、账号状态必须满足的前提 | 写“登录后”,但不写用什么角色登录 |
| 测试数据 | 输入的具体值,包括合法、非法和边界值 | 写“输入用户名”,不写具体值 |
| 操作步骤 | 按顺序执行的用户操作,每一步是独立动作 | 步骤里混入“等待5秒”这类时序依赖 |
| 预期结果 | 操作后系统应做出的可观测反馈 | 写“成功”,不写具体跳转、弹窗、数据库变化 |
| 优先级 | 根据业务影响程度分 P0-P3 | 全部写成 P1,等于没有优先级 |
| 用例类型 | 功能、接口、界面、兼容、性能、安全 | 留空不填,后期统计困难 |
| 关联需求 | 对应的需求编号或需求标题 | 不写,需求变更时找不到受影响用例 |
为什么要把“前置条件”单独拿出来强调?因为大部分执行失败的用例,不是系统出了 bug,而是前置数据不满足。比如用例要求“已登录用户”,执行人却拿了一个未登录的会话去跑,结果是无效失败,浪费排查时间。我一般会要求编写者在前置条件里写清楚三件事:环境地址、数据状态、账号角色。宁可多写一句话,也不要让执行人自行理解。
2.2 用例粒度的三条原则:太大变小,太小变废
粒度是用例编写中最难拿捏的部分。同一个功能,有人一条用例覆盖十步操作,有人拆成二十条细到不能再细。这两种都不对。我常用的三条原则如下。
第一条:一个用例只验证一个独立场景。比如“登录成功后跳转到首页并显示用户名”是一个场景;如果把它和“登录失败三次后账号锁定”写在一起,一旦执行失败,你分不清是成功路径坏了还是锁定逻辑坏了。独立场景出问题时能精准定位,也能独立跳过。第二条:操作步骤控制在五到十步。超过十步说明用例里塞了多个环节,应该拆分成多个用例;少于三步则往往是验证点太少,比如只有“点击按钮”和“查看结果”,中间缺了参数组合。第三条:每条用例都必须能和需求条目建立映射。需求变更时,没有映射关系的用例就是孤儿,后期维护成本极高。
写用例不是写小说,不用铺垫背景;也不是写脚本,不用描述页面元素定位。粒度合适的判断标准是:任何一个没参与过该功能开发的人,拿到用例后能在五分钟内明白先做什么、后做什么、结果怎么算对。如果你拿一条用例去问别人“这条验证了什么”,对方答不上来,那就是粒度有问题。
3. 从需求到用例:把一句话需求拆成可执行用例的操作路径
拿到需求文档之后直接开始写用例,是我见过最高频的错误做法。需求里的一句话,在实现层面可能对应着多个条件分支、多个异常路径、多组数据校验。如果跳过分析直接写,你写出来的往往只是“最顺利的那条路”,而漏掉的恰恰是会让线上出问题的坏路径。正确的操作路径是:需求 → 测试点 → 用例 → 执行。下面两个小节讲清楚分析阶段和编写阶段的具体动作。
3.1 需求分析与测试点提取:先把需求拆成一张检查表
我在拿到需求后不会急着打开文档写用例,而是先做一次测试点提取。方法是把需求描述里所有表示约束的词圈出来,比如“必须”“不允许”“可以”“长度不超过”“支持”。这些词背后都是校验逻辑,也就是测试点。
举一个典型的例子。某需求描述:“用户登录后可以修改昵称,昵称长度为 1-20 个字符,支持中文、英文、数字和下划线,重复昵称时系统提示‘该昵称已被占用’。”这句话里能提取出至少八个测试点:
| 测试点编号 | 内容 | 类型 |
|---|---|---|
| TP1 | 正常修改昵称,长度 1-20,字符集合法 | 功能正常 |
| TP2 | 昵称长度为 1 和 20 | 边界 |
| TP3 | 昵称长度为 0 和 21 | 边界异常 |
| TP4 | 昵称包含中文、英文、数字、下划线 | 字符集 |
| TP5 | 昵称包含标点符号、空格、表情 | 非法字符 |
| TP6 | 昵称与已有用户重复 | 业务冲突 |
| TP7 | 未登录用户直接访问修改接口 | 权限控制 |
| TP8 | 修改成功后,个人资料页同步更新 | 数据一致性 |
把需求拆成测试点之后,还要画一张简单的脑图,从“输入-处理-输出”三个角度去补充遗漏。输入包括正常值、异常值、空值、超长值;处理包括服务端校验、存储、缓存刷新;输出包括响应结果、页面跳转、数据库记录变化、提示文案。这一步不需要工具,一张白纸或一个列表就够,关键是把隐藏的边界和异常点列出来。
3.2 用例编写的五个步骤与一条验证路径
测试点提取完,开始编写用例。我一般按五个顺序步骤来走。
第一步,确认前置条件。根据测试点思考该场景需要什么初始状态,比如“存在一个已注册且未修改昵称的用户”。第二步,准备测试数据。把测试点中的具体值写下来,比如昵称长度为 20 的字符串“abcdefghijabcdefghij”,不要写“20个字符”这种抽象表达。第三步,编写操作步骤。按用户真实操作顺序写,比如“登录系统 → 进入个人中心 → 点击编辑资料 → 在昵称输入框填入… → 点击保存”。第四步,写预期结果。预期结果必须可观测,包含页面提示、跳转地址、接口返回码或数据库中字段的变化。第五步,标注优先级和关联需求,方便回归时排序。
写完后,用一条验证路径自查:拿着写好的用例,假装自己是用户,从头到尾走一遍,看每一步能不能落地。如果在某个步骤需要“随便选一个值”,说明测试数据没写清楚;如果在预期结果里出现“正常”两个字,说明没有定义什么叫正常。这条验证路径不花时间,但能避免大量低质量用例进入执行阶段。
4. 用例设计三大方法:等价类、边界值与场景法的实际应用
用例设计方法不是理论课,它直接决定用例的覆盖能力。很多人觉得等价类、边界值是老生常谈,但实际工作中,用例漏测的高发区几乎都集中在无效等价类和边界外附近。这一章我会围绕最常见的三类方法,说明它们各自的适用场景和操作步骤。
4.1 用等价类把无穷输入切成有限集合
等价类分析的核心逻辑是:在一组输入中,如果一个输入能代表整组的行为,那就只需测试这一个输入。比如年龄输入框,业务规则是 18-60 岁可以注册。那么小于 18、大于 60、18 到 60 之间、非数字、空值,分别属于不同的等价类。每个等价类里选一个代表值测试即可,不需要把 18 到 60 之间的每个整数都跑一遍。
有效等价类验证的是系统“答应了要做什么”,无效等价类验证的是系统“面对不该接受的东西时会不会拒绝”。我见过最多的情况是,用例只写了有效等价类,比如“输入 25 岁注册成功”,但漏写了 17 岁、61 岁、负数、小数、字母、空值这些无效类。这些漏网之鱼正是后台上线后收到脏数据的主要来源。
操作上,先把输入条件的所有可能性列出来,然后画一张两列表:有效等价类和无效等价类。每个等价类至少对应一条用例。注意不要把一个无效类和一个有效类组合在同一条用例里,否则失败后无法判断是哪一侧出了问题。更细致一点的做法是,多个输入字段时先做单因素覆盖,再补充多因素组合,不要一开始就上全组合,那样用例数量会爆炸。
4.2 边界值分析:失效高发区就在临界点周围
边界值是等价类分析的补充,它基于一个经验事实:程序写判断条件时最容易在边界上出错。比如“长度 1-20 个字符”,代码里很可能写成了length > 1 && length < 20,把 1 和 20 排除在外。所以我要求编写者在处理任何带范围的数据时,必须取上点、离点各一组值。
上点就是边界上的值,离点是边界两侧紧邻的值。对于 [1,20] 这个整数区间,上点有 1 和 20,离点有 0、2、19、21。如果区间的开闭性质不清楚,就默认取闭合,并把超出边界的值也覆盖掉。对于字符串长度,空字符串也是一个特殊的离点,不能漏。对于时间范围,比如“有效期 2025-01-01 到 2025-12-31”,要分别测试 2024-12-31、2025-01-01、2025-12-31、2026-01-01 这四个点。
边界值的坑在于,很多需求描述不会明确写出开闭区间,比如“超过 60 岁不能注册”,那 60 岁到底能不能注册?遇到这种含糊描述,不要猜,去问产品或需求方,然后把结论写进用例的测试数据里。用例评审时,边界值用例是最容易被业务方确认的,因为他们自己也不一定清楚边界行为。
4.3 场景法覆盖业务流程与异常分支
等价类和边界值主要针对单个输入,但真实用户行为是一条操作链。比如下单支付,中间可能经历准备订单、确认收货地址、选择支付方式、支付回调、取消支付、超时未支付等分支。场景法用基本流加备选流的方式,把整个业务过程串起来。
我在设计场景法用例时,会先画一张事件流表。基本流是“用户顺利完成整个业务”的路径,备选流是各种中断、异常和替代路径。比如一个简化的订单流程:
| 流类型 | 场景描述 | 动作 |
|---|---|---|
| 基本流 | 正常下单并支付成功 | 加入购物车 → 结算 → 支付 → 收到支付成功通知 |
| 备选流1 | 库存不足 | 点击结算时提示库存不足,停留当前页 |
| 备选流2 | 余额不足 | 支付时提示余额不足,可更换支付方式 |
| 备选流3 | 支付超时 | 支付页面超时后,订单自动取消 |
| 备选流4 | 重复提交 | 支付成功后重复点击支付按钮,不生成第二笔订单 |
| 备选流5 | 取消支付 | 用户主动取消后,订单状态变为已取消 |
场景法的用例优先级这样定:基本流一定是 P0;备选流中涉及资金、状态流转、数据一致性的定 P0 或 P1;其余纯提示类的备选流可以是 P2。执行时先跑基本流,确保主干是通的,再逐个跑备选流。备选流用例里经常需要模拟异常条件,比如让支付回调延迟,这往往要在测试环境借助工具完成,手工用例要注明依赖的环境或工具,避免执行人不知道如何触发。
5. 测试用例编写避坑指南:5个让用例失效的典型问题
即使掌握了字段结构和设计方法,用例库在真实项目中还是会慢慢变质。下面这五个问题,是我在评审和复盘时反复遇到的,每一条都是血泪经验。按“现象 → 原因 → 解决”的方式写,方便你对照自己的用例库排查。
5.1 用例依赖执行顺序,导致回归无法独立运行
现象:用例库里有几条用例只有在前一条执行后才能跑。比如用例 A 是“创建订单”,用例 B 是“支付订单”,B 的前置条件直接写“执行完 A 之后”。一旦 A 失败或跳过,B 也跟着红,但实际上 B 对应的功能本身可能没有问题。原因是在编写时偷懒,没有给 B 准备独立的数据和状态,而是复用了 A 的结果。解决方法是要求每条用例自包含:B 的前置条件应该写成“存在一笔待支付的订单”,并在测试数据中准备好这笔订单,而不是依赖 A 的执行结果。用例执行应该像乐高积木,任意一块都能单独拉出来跑。
5.2 预期结果写得太笼统,失败后无法定位
现象:预期结果写着“系统处理成功”“页面显示正确”或“操作生效”。执行人看了之后无法判断到底什么算成功,只能凭感觉打勾。原因是为了省时间,把预期结果当成走流程,没有从用户视角去描述可观察的变化。解决方法是强制要求预期结果包含具体信息:页面上出现什么文案、跳转到哪个地址、接口返回什么状态码、数据库里的记录字段变成什么值。我建议编写完后自己扮演执行人,如果看到预期结果仍然内心发虚,就说明写得太模糊,需要补充。
5.3 用例与需求版本脱节,需求变更后用例库变成垃圾堆
现象:需求已经改成“昵称可以重复”,用例库里还写着“重复昵称时提示已被占用”;需求新增了一个字段,用例里完全没有出现。回归时大量红色失败,仔细一看是需求早就变了。原因是用例没有和需求建立追踪关系,变更管理流程没有追问“哪些用例受影响”。解决方法是每个用例必须填写关联需求编号,并在需求变更评审时同步走查用例库。我还会在用例文档里加一个“变更记录”区域,每次需求变更后,把受影响用例的更新日期和变更说明写上去。这样即使过了三个月,也能知道哪些用例是最近维护过的。
5.4 只为功能路径写用例,忽略数据与权限组合
现象:功能核心路径全部通过,但一到数据权限比较复杂的场景就接连出问题。比如普通用户可以修改自己的数据,管理员可以修改所有人的数据,未登录用户应该被拒绝,但用例里只测了普通用户。原因是为了快速补充用例,大家习惯照着功能菜单一条条写,没有从角色和数据范围维度去想。解决方法是每设计高风险模块时,额外补一张权限矩阵表:横轴是角色,纵轴是数据范围,交叉点写预期行为。至少覆盖三种角色:未登录用户、普通用户、管理员。对于数据范围,至少要覆盖“本人数据”和“非本人数据”两类。
5.5 用例中混入过多实现细节,导致用例维护成本爆炸
现象:手工测试用例里写着“点击页面上的保存按钮”,还能接受,但写着“调用 /api/user/save 接口,参数 xxx”,或者“等待 3 秒后点击 id=submit-btn”,一旦前端结构调整、接口路径变化,这些用例全部要改。原因是用例编写者混淆了“测试用例”和“自动化脚本”。解决方法是明确区分:手工用例面向行为,描述“做什么”,例如“提交昵称修改表单”;自动化脚本才面向实现,定位符和接口参数交给脚本维护。写完一条用例时,可以问自己:如果前端把按钮换个位置,这条用例需要改吗?如果只需要改自动化脚本,说明用例面向行为的程度是对的。
6. 用例评审与持续维护:让用例库越用越轻
用例写完不是终点,评审和维护才是让用例保持价值的核心动作。我习惯在迭代提测前做一次十分钟的用例评审,重点看五件事:需求覆盖是否完整、预期结果是否可验证、是否包含异常场景、是否存在重复用例、优先级是否合理。评审不是逐字朗读,而是让编写者自己讲“这条用例验证了什么”,讲不清楚的当场改。
维护方面,我坚持两条硬性习惯:第一,每次需求变更后,本周内必须走查关联需求编号的用例,把过期的数据值和预期结果更新掉,不把问题留到发布前一天;第二,每三个月清理一次用例库,用“最近三个月是否被执行过”作为标记,没有执行过的用例单独归档,不直接删除,避免误伤。归档列表里如果超过三分之一是死用例,就要反思是不是用例设计和维护流程出了问题。
最后说一个我自己的教训。我曾经非常追求用例数量,觉得覆盖越多越安全,结果半年后用例总数到了六千多条,真正在回归里反复执行的不到一半。大量用例写着无人能理解的旧需求,每次迭代改接口都要连带改上百条,耗费的时间比写新用例还多。从那之后,我给团队立了一个规矩:用例宁少勿滥,每条用例都必须有独立存在的理由。现在我的习惯是每次提测前用十分钟评审,每周花二十分钟清理失效用例,用例库反而越来越轻,回归时间更短,漏测率也没有上升。希望这些经验能帮你把测试用例从“文档负担”变成“团队的安全网”,也希望能真正帮到你。
本文还有配套的精品资源,点击获取