简介:这是一份面向软件测试工程师的系统化《测试用例编写指南》文档,针对测试用例编写长期依赖个人经验、划分颗粒度不一、可读性差等痛点,给出从需求分析、业务流程分析、系统设计分析,到用例编写、评审完善与维护更新的完整流程;同时详细说明用例标题、前置条件、操作步骤、预期结果等要素,并介绍测试需求划分、用例划分原则,以及等价类划分、边界值分析、状态迁移等常用测试设计方法。资源包共1个docx文件,大小约494KB,正文按目的、适用范围、编写步骤、要素模板、划分原则、编写要求、测试类型、设计方法、维护与风险建议等章节组织,结构清晰,可直接作为团队测试规范或新人培训材料使用。目前已有551人学习,适合需要统一用例编写规范、提升测试设计水平的测试人员参考。
1. 测试用例编写指南:一份 docx 想解决的三个真问题
写了六七年测试用例,帮团队搭过几套用例规范,我最深的感受是:测试用例编写指南最难的部分从来不是「写」,而是让一个新同事照着你的步骤执行,最后得出的结论和你一致。它真正要解决三个问题:需求怎么拆成测试点、字段和写法按什么口径、写完怎么保证别人敢直接拿去执行。
别把它当成一份 docx 模板,下载下来填完就交差。模板只是壳,字段口径、优先级定义、预期结果写法才是肉。大多数团队不是没有用例,而是用例「有量无质」:数量几百上千条,评审没人细看,执行全靠猜。
它适合三类人:刚入行需要建立写作习惯的测试工程师、要搭团队用例规范的质量负责人、给老项目补用例资产的人。没有高深理论,但每一条都能立刻改到你自己的文档里,属于写一次、用很久的东西。
2. 需求拆解先行:用例写不好,九成是需求没拆透
以前带过一个模拟项目X,需求文档写得很细,用例也照着写了,一评审却被开发反问「这条需求你们理解偏了」。后来复盘发现根子不在用例格式,而在需求到测试点这一步。用例是需求的镜像,需求拆成什么样,用例就是什么样。这一章讲清楚怎么把一段需求文本拆成一张可勾选的测试点清单,这是后续所有字段、步骤、优先级的地基。
2.1 从需求文档到测试点的四步拆解
拿到需求先别开写,我一般做四步人工拆解。
第一步,通读全文,把动词短语全部划出来。新增、修改、删除、查询、导入、导出、审批、驳回,每个动词都对应一批功能点。漏了动词就等于漏了功能,这是新手最容易在第一条沟里翻车的地方。第二步,把所有规则词圈出来。「必须」「不得」「如果……则」「当……时」「超过……」,这些词后面的内容全是判断逻辑,是后续边界值和异常用例的来源。第三步,把边界和异常场景单独列出来,数值上限、时间范围、批量条数、文件大小、空值,需求里往往只有一句话,到用例阶段通常要拆出一整组。第四步,把非功能要求转成可验证的描述,「页面要流畅」不能写进用例,要转成「登录请求在普通网络下响应时间不超过 3 秒」。
拆解结果落到一张测试点清单里,我习惯的格式是这样:
| 需求原文 | 拆出的测试点 | 用例方向 |
|---|---|---|
| 用户可修改本人昵称,长度 2-20 个字符 | 昵称正常修改;长度 2 / 20;长度 1 / 21;为空;含空格 | 功能 + 边界 |
| 导入明细时,单次最多 5000 行 | 导入 5000 行成功;5001 行被拦截;0 行提示无数据 | 功能 + 边界 + 异常 |
| 超过 30 天未登录的账号需重新验证 | 29 天可正常登录;30 天触发验证;31 天同样触发 | 边界 + 场景 |
这张表就是后面用例的目录。写用例前先核对一遍测试点是否全部落了地,能避免最常见的问题:需求提了 20 个功能点,用例只写了 15 个,剩下 5 个没人发现,直到上线前才被用户试出来。
提示:测试点清单直接放在用例文档最前面,评审时第一屏就看它,比从头念用例高效得多。
2.2 等价类与边界值:边界不是只有一个值
等价类划分和边界值分析是最基础的设计方法,但大多数实际用例里用得不够细。等价类是把输入空间分成若干集合,每个集合取一个代表值;边界值是在分界点附近取 min、min-1、max、max+1 各测一遍。真正容易漏的是「第二边界」和「特殊值」。
什么叫第二边界?需求写「昵称长度 2-20 字符」,常规思路是测 2、1、20、21 四个值。但如果底层字段是 varchar(50),还要补 50 个字符这条用例,防止长度校验和字段容量打架。再比如金额字段,不光测边界金额,还要测小数点后两位、超大金额、负数。所以我在测试点清单里单开一列「边界值」,不靠测试人员临场发挥。
常见输入项的边界表可以做成这样:
| 输入项 | 有效等价类 | 无效等价类 | 必测边界值 | 补充特殊值 |
|---|---|---|---|---|
| 昵称长度 | 2-20 字符 | 1 字符、21 字符 | 2 / 20 / 1 / 21 | 空值、全空格、含 emoji |
| 转账金额 | 0.01-50000.00 元 | 0、50000.01 元 | 0.01 / 50000.00 / 0 / 50000.01 | 50000.005 元(精度边界) |
| 批量导入行数 | 1-5000 行 | 0 行、5001 行 | 1 / 5000 / 0 / 5001 | 含重复主键、含空行 |
写边界用例有个血泪经验:预期结果不要只写「成功」或「失败」,要写系统具体表现。同样是长度超限,有的系统提示「昵称长度不能超过 20 个字符」,有的直接截断保存,两种实现的预期结果完全不同。这个判断标准一旦写错,执行者就会开始猜。
2.3 场景法:把用户路径变成可执行步骤
单条用例能覆盖规则,覆盖不了用户的真实操作路径,要用场景法补。场景法核心是基本流加备选流:基本流是用户最顺利走完的路径,备选流是每个可能分叉的地方,异常流是走到一半出错的情况。以登录功能为例:
| 场景编号 | 场景描述 | 涉及流程 | 是否异常 |
|---|---|---|---|
| SC-01 | 输入正确账号和验证码,登录成功进入首页 | 基本流 | 否 |
| SC-02 | 账号正确、验证码错误,提示后可重新输入 | 备选流 | 否 |
| SC-03 | 连续 5 次验证码错误,账号被锁定 | 异常流 | 是 |
| SC-04 | 登录成功后刷新页面,会话仍保持 | 备选流 | 否 |
| SC-05 | 登录页停留超时,提交时报会话过期 | 异常流 | 是 |
场景表出来后,每个场景再展开成步骤化的用例。新手容易把场景和用例混为一谈,一个场景写成一条巨长的用例,塞了七八个步骤。正确做法是一个场景对应一条用例,复杂的备选流拆成多条,保证每条用例的执行步骤控制在 3 到 8 步之间。场景法最有价值的地方,是逼你用「用户会怎么操作」而不是「系统有什么功能」的视角来编号用例,这个视角在评审时开发最容易买账。
3. 用例字段与模板:一份能落地的测试用例文档长什么样
指南的核心资产是字段口径。同样的功能,字段定义清晰与否,决定这份 docx 是一本能直接执行的操作手册,还是一份躺在共享盘里的死文档。这一章从字段规范、写法规范、文档结构三层往下拆。
3.1 用例编号、优先级、前置条件的规范
先给一份我惯用的字段表,每个字段都有明确口径,模板里逐列说清:
| 字段 | 填写规范 | 示例 |
|---|---|---|
| 模块 | 按功能模块分类,跨模块公共功能单列 | login / order / common |
| 用例编号 | 模块码-功能码-三位流水号,全文档唯一 | LOGIN-AUTH-001 |
| 用例标题 | 一句话说清「做什么操作、验证什么结果」 | 验证码错误时登录失败并提示 |
| 优先级 | P0-P3,口径见下文 | P1 |
| 前置条件 | 数据和状态描述,必须能被后来者复现 | 账号 admin 存在且未锁定;验证码接口可用 |
| 测试数据 | 与步骤分离,单独成列 | 账号 admin / 错误验证码 123456 |
| 测试步骤 | 有序步骤,每步一个操作 | 1. 打开登录页 2. 输入错误验证码并提交 |
| 预期结果 | 可判断的具体描述 | 提示「验证码错误」,页面停留在登录页 |
| 实际结果 | 执行时填写,失败附截图 | 待执行 |
编号规则最容易被随意对待。我见过「用例1、用例2」的流水号,也见过编号里带创建人名字的,换人维护直接乱掉。推荐格式是模块码-功能码-三位序号,功能码来自测试点清单,看到编号就知道用例归属,LOGIN-AUTH-001 一眼就能看出是登录模块验证码功能的第 1 条用例。
优先级口径不定,最后一定是全员 P1。经过多轮验证,我给团队用的定义是这样的:
| 优先级 | 定义 | 使用场景 |
|---|---|---|
| P0 | 主流程必经路径,出问题直接阻断发布 | 每次发布后冒烟必跑 |
| P1 | 核心功能规则,非阻断但影响关键体验 | 功能测试必跑,回归主集合 |
| P2 | 一般功能、次要分支、兼容性 | 全量测试或迭代测试 |
| P3 | 边界、异常、易用性建议 | 有改动时按需抽查 |
前置条件的常见误区是写「系统正常」「用户已登录」这种无法复现的描述。合格的前置条件要做到:另一个人按这句话操作,能把环境还原到用例要求的初始状态。环境级的数据放前置条件,用例级的数据放测试数据列,坚决不写死在步骤文本里,这个区别后面避坑章节还会细讲。
3.2 测试步骤与预期结果:一句话讲清楚一件事
步骤质量直接决定执行效率,也最值得抠细节。三条硬规则:
第一,一个步骤只做一件事。「输入账号密码并点击登录,等待页面跳转」要拆成两步:先输入并断言输入框回显,再提交并断言跳转。这样失败时能精确定位到哪一步挂掉。第二,操作必须带具体输入值。不写「输入错误密码」,要写「输入密码 123456(正确密码为 abc123)」,执行者不用猜,也不用翻需求。第三,预期结果写能被判定对错的描述。这是整个文档最核心的一条,看一组对比:
| 写法 | 是否合格 | 问题 |
|---|---|---|
| 页面正常显示 | 不合格 | 什么算正常?任何人无法判定 |
| 登录成功后进入首页,右上角显示账号名 | 合格 | 有具体位置和具体内容 |
| 数据保存成功 | 不合格 | 保存成功体现在哪里 |
| 点击保存后按钮变为「已保存」,列表刷新出现新记录 | 合格 | 状态加数据双断言 |
| 系统无报错 | 不合格 | 无报错不是预期,是结果描述 |
| 接口返回 code=0,页面提示「提交成功」 | 合格 | 接口与界面两层校验 |
写预期结果有个自查技巧:写完问自己一句,这句话让一个从没看过需求文档的人来判,能不能一眼定对错。如果答案是「得问我」,这条预期结果就得重写,没有商量余地。
3.3 docx 模板落地:文档结构、修订记录与结构化导出
字段口径定完,落到 docx 里要有稳定结构。我常用的模板分五个章节:
| 文档章节 | 内容 | 作用 |
|---|---|---|
| 1. 适用范围 | 适用项目、适用阶段、读者对象 | 避免文档被乱用 |
| 2. 修订记录 | 日期、作者、变更内容、评审人 | 变更可追溯 |
| 3. 测试点清单 | 需求原文与测试点的映射表 | 评审时对覆盖率 |
| 4. 用例正文 | 按模块分章,每章一张用例表 | 执行和检索 |
| 5. 评审记录 | 评审日期、结论、遗留问题 | 质量门禁留痕 |
修订记录是多数团队忽略的部分,但它是用例可追溯的根。任何一次增删改都要记一条,没有修订记录的用例文档,三个月后没人敢动它。
docx 表格本身不适合做复杂内容校验,所以我在文档之外通常会维护一份结构化的版本,方便后续导入测试管理平台或做自动化体检。结构化格式长这样:
# 单条用例的结构化描述,与 docx 表格字段一一对应 - module: "login" case_id: "LOGIN-AUTH-001" title: "验证码错误时登录失败并提示" priority: P1 preconditions: "账号 admin 存在且未锁定;验证码接口可用" data: username: "admin" code: "123456" # 与实际验证码不一致 steps: - step: 1 operation: "打开登录页,输入账号 admin" expected: "输入框正常回显" - step: 2 operation: "输入验证码 123456,点击登录" expected: "提示「验证码错误」,页面停留在登录页" actual: ""这段 YAML 里 priority、preconditions、data、steps 和 docx 字段一一对应,说明无论载体是 word 还是测试管理平台,字段口径是一致的。导出成这种结构后,后面做用例体检脚本、生成测试报告都会省很多事,能直接省掉一次人工誊抄。
4. 测试用例避坑指南:5 个写完才发现的高频问题
用例规范能不能推行下去,不看写得有多全,看踩坑之后大家愿不愿意改。这一章是几个团队反复磨合后沉淀下来的 5 个翻车点,每条都按「现象、原因、解决」写,可以直接拿去对照自己的用例文档。
4.1 用例重叠:同一个功能被三个模块各写一遍
现象:登录、账号、权限三个模块的用例表里都有一条「密码错误提示」,回归时同一场景来回跑三四遍;某次改了登录逻辑,发现要同步改四份文档,漏改的那份让新逻辑没被回归覆盖到。原因:用例按页面而不是按功能点组织,需求拆解阶段没有做测试点去重。页面会出现在多个模块入口里,但功能点只有一个归属。解决:测试点清单阶段先做去重,一个功能点只归一个模块;登录、导入导出这类跨模块公共能力单独建 common 用例集,其他模块通过用例编号引用而不是复制内容,执行时按功能点组合挑用例,不按模块全量跑。
4.2 预期结果太粗:同一个用例,三个人三种判断
现象:预期结果写着「页面正常」「数据正确」「系统无报错」,执行时三个人对同一用例给出三个结论,缺陷单来回打回。原因:写的时候默认执行者和自己共享同一套理解,省略了判断标准。越熟悉业务的人越容易犯这个错,在他眼里「正常」不言自明。解决:强制预期结果包含具体文案、具体数值或状态流转,把「无报错」改成「接口返回 code=0 且页面提示提交成功」。执行前我还会随机抽一条用例,拿给一个没参与过需求的人试读,读不懂就说明写法不合格。
4.3 优先级全是 P1:等于没有优先级
现象:用例文档里八成是 P1,冒烟集选不出来,回归只能全量跑,发布前时间不够就开始砍用例,砍得没有依据。原因:优先级没有定义,或者定义了但没在评审时核。写的人怕漏测,宁可都标重要,结果就是都不重要。解决:模板里固定优先级口径,评审时重点看 P0 和 P1 的占比。参考比例是 P0 占 10%-15%,P1 占 40%-50%,剩下给 P2 和 P3。占比明显偏离时,不用问,口径没贯彻。
4.4 用例与数据强耦合:改一次数据,动一片用例
现象:用例步骤里写死「账号 test001 转账金额 100.00 元」,某天测试环境数据被清理,几十条用例集体失效,只能加班逐条改。原因:环境数据和业务数据混在步骤文本里,数据一变,用例文本跟着变。解决:测试数据从步骤里拆出来放独立字段,步骤里用「测试数据:账号 / 金额」这类占位引用;环境级数据由初始化脚本统一准备,用例里只写「使用前置条件中已创建的账号」。数据刷新时只需要维护数据准备脚本,用例文本基本不动。
4.5 评审走过场:写完没人看,执行时才发现缺步骤
现象:评审会约在下午,提前十分钟把 docx 发出来,会上从头到尾念用例,念完没人提意见。结果执行时发现前置条件缺失、异常分支没覆盖,一遍遍补充,用例一直在改。原因:评审前没有给阅读时间,也没有评审清单,开放式提问在评审会上永远得不到有效回答。解决:用例文档提前 24 小时发出,评审时长控制在 30 到 45 分钟;按清单逐项核对。评审时盯「测试点清单」和用例的对应关系,比逐条念用例效率高一个数量级。
5. 可执行性与复用:让用例从「写了」变成「跑了能信」
用例文档写得好不好,最终要靠执行结果验证。这一章讲三件事:用例怎么分层组织应对日常迭代、怎么用脚本给用例文档做体检、以及需求变更时怎么快速定位受影响用例。
5.1 把用例分成三层:冒烟集、回归集、全量集
一份用例文档不应该是平的,执行时要按场景取用。我习惯在文档里维护三层集合:
| 集合 | 用例范围 | 使用时机 | 失败处理 |
|---|---|---|---|
| 冒烟集 | 每条主流程的 P0 主路径,30-50 条 | 新版本发布后第一轮 | 失败立即阻断,先定位再回归 |
| 回归集 | P0 + P1,覆盖核心规则 | 功能测试、发布前回归 | 失败记录并评估影响面 |
| 全量集 | 所有用例,含 P2/P3 | 大版本或长期未维护的系统 | 分批执行,按风险排序 |
冒烟集的关键是「少而稳」,宁可 40 条每条都有价值,不要 100 条里一半是重复场景。我见过最多的情况是冒烟集选了一堆 P1 页面级用例,真正的主流程反而没覆盖。回归集要跟着每次变更调整,变更影响到的模块用例提到执行队列前面。
5.2 用脚本给用例文档体检:字段完整性、编号唯一、优先级分布
用例数量过了两三百条,人工检查字段就不可靠了。我一般会把 docx 里用例表导成 CSV 或电子表格格式,然后用一段小脚本做基础体检。脚本做的事情不多,但能挡住大部分低级问题:
# 用例文档体检脚本:检查必填字段、编号唯一性和优先级分布 import pandas as pd # 参数说明:path 为从 docx 导出的用例表文件 # required 列表按实际模板字段调整 df = pd.read_csv("cases.csv") required = ["case_id", "module", "priority", "preconditions", "steps", "expected"] # 1) 必填字段空值检查:空值统计会列出哪些字段有缺失 empty = df[required].isna().sum() print(empty[empty > 0]) # 2) 编号唯一性:重复编号会导致两次执行结果互相覆盖 duplicated = df[df.duplicated("case_id", keep=False)] print("重复编号用例数:", len(duplicated)) # 3) 优先级分布:normalize=True 输出占比,P1 超过 50% 要警惕口径失效 print(df["priority"].value_counts(normalize=True)) # 4) 步骤数量:步骤过少的用例往往是预期结果写得不够细 df["step_count"] = df["steps"].astype(str).str.count(";") + 1 print("步骤数不超过 2 的用例数:", len(df[df["step_count"] <= 2]))这段脚本的逻辑是把「人工评审凭感觉」变成「数据说话」:必填字段空值说明模板没被执行,编号重复说明文档维护已经失控,优先级分布异常说明口径没贯彻。第 4 个检查对应「步骤拆分」这条规范,步骤写成一个长句的用例,按分号拆开一数就能发现。参数上,required 列表要和 docx 模板的字段一致;步骤分隔符如果用换行而不是分号,把 str.count(";") 换成按换行拆分即可。
注意:脚本只能查形式问题,查不出「预期结果写得对不对」这类语义问题。形式体检过了,语义还要靠评审和试执行。
5.3 用例与需求的双向追溯:一张映射表管住变更
用例文档最大的敌人是需求变更。我的做法是在测试点清单基础上维护一张追溯矩阵,把需求条目、测试点、用例编号串起来:
| 需求条目 | 测试点 | 用例编号 | 状态 |
|---|---|---|---|
| REQ-LOGIN-02 验证码校验 | 验证码错误提示 | LOGIN-AUTH-001 / 002 | 已实现 |
| REQ-IMPORT-05 行数上限 | 导入 5000 行边界 | IMPORT-LIMIT-001/002/003 | 需求变更中 |
| REQ-IMPORT-05 行数上限 | 导入 5001 行拦截 | IMPORT-LIMIT-004 | 待更新 |
需求变更时,先查矩阵里这条需求对应哪些用例,把状态标成「待更新」,改完用例再更新矩阵状态。以前没有矩阵的时候,改一条需求要在整个 docx 里翻半天,还经常漏;现在变更影响范围十分钟内能圈出来。这个矩阵也是评审时对覆盖率的正式依据,测试点清单里每一项都要能在矩阵里找到对应用例编号。
6. 三分钟自检清单:把用例规范变成团队习惯
规范能不能活下来,取决于它是否被内化成习惯。我现在写完一批用例,不急着发评审,先花三分钟按一张清单自检一遍,这比任何评审都管用。建议把这个清单也放进团队的测试用例编写指南里,作为交付前的质量门禁:
| 自检项 | 通过标准 |
|---|---|
| 编号唯一 | 全文档无重复编号,格式统一 |
| 前置条件可复现 | 别人照做能还原初始状态 |
| 步骤单一 | 每步一个操作、一个输入值 |
| 预期可判断 | 无「正常 / 正确 / 无报错」字样 |
| 数据已分离 | 步骤中没有写死环境数据 |
| 追溯完整 | 每个测试点都有对应用例编号 |
| 优先级有梯度 | P0 占 10%-15%,P1 不过半 |
这个习惯是我从一次失败里捡回来的。有一回发版前评审,用例文档表面很整洁,执行时却连续发现三条用例前置条件互相矛盾,整个回归被顶住半天,那个版本的用例基本是重写的。从那以后我给自己定了一条硬规矩:用例不先过自检清单,就不允许提交评审。说白了,这份指南的核心不是说教,是把「写用例」从个人经验变成团队口径,让每个新同事拿到的是一套能直接上手的标准,而不是到处打听老人「平时怎么写的」。希望帮到你。
本文还有配套的精品资源,点击获取