测试用例设计
概述
用工程化方法把需求转化为完整、可执行、可追溯的测试用例,目标是用最少的用例覆盖最多的有效输入空间,不凭感觉"想到哪测到哪"。核心产出物是结构化用例表格与覆盖率结论。
何时使用
- 用户要求编写/补全/评审测试用例,或问"这个功能怎么测、测哪些点"
- 手上只有需求描述、PRD、接口文档,要转换成用例
- 需要向上汇报覆盖情况的测试工作
不使用:自动化脚本执行框架(那是编码任务)、纯探索式冒烟测试。
标准用例要素
| 字段 | 说明 |
|---|---|
| 用例编号 | 模块-场景-序号,如 LOGIN-VALID-001 |
| 标题 | 一句话"当……时,应……" |
| 前置条件 | 进入该用例前必须成立的状态/数据 |
| 操作步骤 | 有序、可执行、不含多义 |
| 测试数据 | 具体输入值(不要写"随便一个数") |
| 预期结果 | 与需求一一对应的可判定断言 |
| 优先级 | P0 阻塞/P1 高/P2 中/P3 低 |
| 关联需求 | 需求/PRD 编号,保证可追溯 |
一条用例 = 一个明确输入+一个明确预期。一条用例验证一件事,混合断言无法定位失败。
六种核心技术(按场景选用)
1. 等价类划分 —— 永远先用它
把输入空间划分为有效等价类(系统接受)与无效等价类(系统拒绝)。
每条规则必须覆盖:1 个有效等价类正例 + 每个无效等价类各 1 个反例。
字段实例(注册年龄,范围 18–60 且为整数,必填):
- 有效等价类:18–60 之间的整数、刚好合法边界的两端
- 无效等价类:<18、>60、非整数(17.5)、非数字("abc")、空(未填)、超长字符串
2. 边界值分析 —— 紧跟在等价类之后
对每个边界,覆盖上点、下点、离点:
- 上点:边界上的值本身(18,60)
- 下点:紧邻边界内侧的值(17,61 这类)
- 离点:紧邻边界外侧的值(16,62)
再补一个粗制乱造的中间值(30)与一个比规定更长的值(10001)验证容错。
3. 判定表 —— 多条件互斥/组合业务规则
条件多、结果依赖组合时优先。列 = 条件组合,行 = 规则结果,保证每一种组合都被覆盖(电商运费:地区×重量×会员等级 → 运费结果)。
4. 场景法 —— 业务流程(主路径+备选路径)
按业务剧本走:主成功路径(Happy Path)+ 分支备选(订单取消中途)× 异常路径(库存不足、超时、支付失败)。一个流程至少 3 条:主流程、分支、异常。
5. 正交实验设计 —— 条件很多时的降维
条件多到组合爆炸时,用两两组合(pairwise)抽样,覆盖任意两两条件的交互即可,避免全排列。工具可查"pairwise 用例生成"。
6. 错误推测 —— 经验补充
基于常见历史缺陷补点:敏感词/注入/XSS 字符、空值、超长、并发重复提交、权限越权访问、时区分/时区边界、断网/重连、文件为 0 字节、编码混乱(GBK/UTF-8)等。
建议流程
- 解析需求:列出被测对象的输入域、约束条件、业务规则、异常分支
- 建立需求清单:编号每个"可测试的需求点",作为追溯来源
- 选型:
- 输入类 → 等价类 + 边界值
- 规则类 → 判定表
- 流程类 → 场景法
- 大量参数 → 正交实验
- 每条规则最后用错误推测补漏 - 产出用例表(Markdown 表格即可)
- 评审:每个需求点是否有 P0/P1 用例兜底;反例是否覆盖所有无效等价类
- 输出覆盖结论:覆盖了哪些需求点、缺口在哪里、遗漏风险
一个完整示例(登录框,用户名+密码)
| 编号 | 前置 | 步骤 | 数据 | 预期 | 优先级 |
|---|---|---|---|---|---|
| LOGIN-VALID | 用户已注册 | 输入用户名密码点登录 | 正确账号/正确密码 | 登录成功,跳首页 | P0 |
| LOGIN-EMPTY-USER | 无 | 用户名为空 | "" | 提示"请输入用户名",不提交 | P1 |
| LOGIN-EMPTY-PWD | 无 | 密码为空 | "" | 提示"请输入密码" | P1 |
| LOGIN-WRONG-PWD | 无 | 密码错误 | 正确账号/错的密码 | 提示"用户名或密码错误",不清空输入(若产品如此设计) | P0 |
| LOGIN-BOUND-MIN | 无 | 用户名长度下边界 | 6 位 | 正常通过 | P2 |
| LOGIN-BOUND-MIN-1 | 无 | 用户名 5 位 | 5 位 | 提示"至少 6 位" | P2 |
| LOGIN-INJECT | 无 | 用户名输注入串 | ' OR '1'='1 |
按普通字符处理,不产生 SQL 注入 | P0 |
| LOGIN-LOCK | 连续错误 5 次 | 继续输对 | —— | 锁定/需验证码 | P1 |
| LOGIN-DBL-CLICK | 已提交中 | 连点登录 | —— | 只发起一次请求,不重复提交 | P1 |
常见错误
| 错误 | 修正 |
|---|---|
| 只有正例没有反例 | 每个无效等价类必须有反例覆盖 |
| 只测边界内侧忘测外侧 | 边界三条线:上点/下点/离点 |
| 用例数据写"随便""任意" | 必须给出具体值,保证可复现 |
| 一条用例断言多个结果 | 拆成多条,一条一断言 |
| 需求点没有编号,无法追溯 | 先建需求清单并编号 |
| 高优缺漏但补大量低优用例 | 先保证每个需求点有 P0/P1 用例 |
检查清单(交件前)
- [ ] 每个可测试需求点都有至少一条 P0/P1 用例
- [ ] 每个输入域的无效等价类都有反例
- [ ] 每个数值/长度边界覆盖上点/下点/离点
- [ ] 规则类需求用了判定表,无未覆盖组合
- [ ] 主流程、分支、异常路径均已覆盖
- [ ] 补齐了经验性风险点(注入/重复提交/空值/越权)
- [ ] 用例编号、前置、步骤、数据、预期、优先级、关联需求齐全
- [ ] 无"随便"等模糊数据;预期结果可判定