测试用例设计在软件测试工作中被提及的频率很高,但真正能稳定交出高质量用例的人并不多。很多团队的习惯是“需求评审完,照着界面写一遍正常流程,再补几条异常数据”,执行之后才发现主要功能能用,但边界、组合、状态流转和旧的缺陷场景大量漏测。专业的测试用例设计不是把操作步骤填进表格,而是把需求翻译成一组可判定、可复现、可追溯的验证用例,让测试执行、缺陷定位、回归验证和需求变更都有据可依。这篇内容面向刚入行的功能测试、自动化测试工程师,也适合正在搭建测试规范和用例评审机制的同学。读完之后,可以用一套稳定的设计方法和评审清单,从需求出发拆出一份可评审、可执行、可维护的测试用例。
1. 测试用例设计要解决什么问题,专业用例长什么样
1.1 测试用例是可执行的验证契约,而不是操作记录
一段正常流程的操作记录对于一个不懂系统的执行者可能有用,但对于测试项目并没有太大价值。测试用例的最低目标是“验证”,而验证必须包含三件事:输入什么、做了什么、期望观察到什么。输入和操作是执行过程,期望观察到什么才是判断结果好坏的标准。
技术上说,测试用例是一组由前置条件、输入数据、执行步骤和预期结果组成的有限集合,它描述了一个可以重复执行、可以自动或人工判断通过或失败的验证场景。它解决的问题是:把“用户觉得能用”这类模糊表达,转成“在哪些前置条件下,输入什么数据,执行哪些操作,最终应该看到什么”的精确描述。
正是因为有这种可执行性和可判定性,测试用例才能被手工测试重复执行,被自动化脚本翻译成断言,被缺陷管理流程用来回归,被需求变更流程用来评估影响。没有可执行的用例,测试就只是“点点看有没有出问题”,出了问题也无法回答“哪些场景已经验证过、哪些场景漏了”。
1.2 专业用例的字段结构,不是随便填完就算写完
许多团队喜欢在 Excel 里画一个宽表格,字段很随意:编号、模块、名称、步骤、预期结果。执行一段时间后开始抱怨“用例没用”。真正的差异不是有没有 Excel,而是字段是否支撑追溯、复现、判定和统计。
一个相对完整的测试用例,建议包含以下字段:
| 字段 | 说明 | 示例 | 为什么需要 |
|---|---|---|---|
| 用例编号 | 唯一标识,建议模块加序号 | LOGIN_001 | 定位、追踪、去重 |
| 用例名称 | 一句话描述验证点 | 手机号密码正确,登录成功 | 快速识别测试意图 |
| 需求来源 | 对应需求 ID 或规格说明位置 | REQ-LOGIN-001 | 防漏测、变更影响分析 |
| 优先级 | P0 到 P3 或高、中、低 | P1 | 执行排序、回归策略 |
| 前置条件 | 执行前必须成立的环境、账号、数据状态 | 账号 13800138000 已注册且未锁定 | 保证可复现 |
| 测试数据 | 本次执行输入的具体数据 | 手机号 13800138000,密码 abc123 | 数据可追溯 |
| 测试步骤 | 可执行、无歧义的操作序列 | 打开登录页;输入手机号;输入密码;点击登录 | 执行标准化 |
| 预期结果 | 清晰、可判定为通过或失败的结果 | 跳转首页,展示昵称 tom,展示上次登录时间 | 判定依据 |
| 实际结果 | 执行时观察到的真实结果 | 跳转首页,昵称 tom 显示正确 | 执行记录 |
| 关联缺陷 | 失败后提交的缺陷 ID | BUG-2025-00123 | 缺陷追踪和回归 |
这十个字段不必每一份都全量保留。小型项目至少要有“前置条件、测试数据、测试步骤、预期结果”这四项,再加编号和需求来源,才谈得上可复现和可追溯。字段缺失的直接后果是:这条用例只有写它的人能执行,其他人执行时要么反复确认,要么执行结果不可信。
1.3 一份用例够不够专业,可以先对照这六个特征
看完字段之后,还需要一个快速判断标准。一条专业用例通常具备六个特征:
- 唯一性:一个用例只验证一个核心意图,避免“既测登录又测下单”这种合并写法。
- 可重复:不同时间、不同执行人,按相同前置条件和步骤,应得到相同结果。
- 可判定:预期结果是明确断言,而不是“系统正常”“页面能显示”。
- 可追溯:能对应到需求编号、测试执行记录和缺陷 ID。
- 独立性:用例之间尽量不依赖,前一条用例失败不导致后一条无法执行。
- 完整性:覆盖输入合法、输入非法、边界、异常、业务分支和状态变化。
六条特征里最容易做错的是“可判定”。“点击登录后,页面能正常跳转”是否算可判定?不能。因为“正常”是什么?跳转到首页算正常,还是有文案、有用户信息、响应时间在多少以内?“正常”是观察者自己脑补的。改成“跳转首页,浏览器地址栏变为 /home,顶部展示用户昵称 tom”,任何人都能判断。
注意:检查用例专业程度时,只问一句话:换一个人执行这条用例,不需要问需求,不需要问作者,能直接给出通过或失败?如果不能,这条用例还需要补前置条件或预期结果。
2. 编写用例之前,信息、数据、环境和追踪矩阵一个都不能少
2.1 先收集被测对象信息,缺文档时列假设清单
测试用例不是凭空想出来的,它来自对被测对象行为的理解。核心信息来源包括需求文档、产品原型、接口文档、数据库表结构说明、历史缺陷记录和同类产品行为。接口文档尤其重要,因为很多前端用例看到的校验,在接口层会再一次出现,如果只按前端页面来写,很容易漏掉接口层的参数校验、权限校验和状态码判断。
如果团队需求文档不完整,不要坐在电脑前硬编用例。正确做法是把已知信息整理成“需求假设清单”,例如“登录手机号格式按 11 位处理”“错误提示文案以接口返回为准”,然后找产品或开发逐条确认。确认过的假设才写进用例,没有确认的写在“待确认”列表里。这样做有两个好处:一是不会因为信息缺失导致用例错得离谱,二是把“需求不明确”这个风险在用例设计阶段就暴露出来,而不是等到测试执行时才爆雷。
还有一个常用技巧:不要只依赖最新文档,要同步翻历史缺陷。很多新版本重新出现的问题,往往在上一版本的缺陷库里已经记录过原因和解法。用例设计阶段对照历史缺陷,通常能很快补出几条高价值用例。
2.2 测试环境与测试数据准备,决定用例能不能复现
测试环境不稳定是执行阶段最常见的阻塞原因,但这个问题可以提前通过用例拆解来降低。设计用例时,要明确这条用例只在哪个层级的系统里执行,以及依赖哪些基础数据。
常见的环境与数据要求如下表:
| 环境 | 用途 | 数据要求 | 主要注意点 |
|---|---|---|---|
| 开发环境 | 开发自测、快速功能验证 | 造数方便,可随时重置 | 不稳定,不适宜做正式验收 |
| 测试环境 | 手工测试、自动化回归 | 尽量贴近生产结构,可构造数据 | 变更频繁,需要和服务版本对齐 |
| 预发布环境 | 上线前验收、配置和数据迁移验证 | 生产副本或脱敏数据 | 避免随意造数污染数据 |
| 生产环境 | 一般不做功能测试 | 真实业务数据 | 只能按规范和授权操作 |
测试数据本身也要分类准备。一份合格的数据集至少包含:正常输入数据、边界输入数据、非法输入数据、不存在的 ID、超长字符串、特殊字符、重复数据、并发场景下的脏数据。只准备正常数据是远远不够的,因为异常分支往往在数据异常时才出现。
这里要提醒一个常见误区:测试工程师为了执行方便,会把测试环境数据库改得面目全非,结果某天执行回归时,前置条件“账号已注册、状态正常”根本不成立,用例无法执行。推荐做法是每轮测试开始前,按照用例前置条件重建一套基础数据,并把造数脚本或 SQL 记录在测试环境说明文档中。这样用例可复现才不是空话。
2.3 用需求追踪矩阵把需求和用例串起来
需求追踪矩阵(Requirements Traceability Matrix,RTM)看起来像一张表格,实际上是防止漏测和评估变更影响的基础设施。它把需求、用例、执行结果、关联缺陷放在一起,结构大致如下:
| 需求 ID | 需求描述 | 关联用例 | 执行结果 | 关联缺陷 |
|---|---|---|---|---|
| REQ-LOGIN-001 | 手机号密码登录 | LOGIN_001 ~ LOGIN_010 | 通过 | - |
| REQ-LOGIN-002 | 密码连续错误锁定 15 分钟 | LOGIN_011 ~ LOGIN_014 | 失败 | BUG-2025-00123 |
| REQ-ORDER-001 | 下单生成订单 | ORDER_001 ~ ORDER_008 | 未执行 | - |
这张表在三个场景下特别有用。第一,需求验收时按表格逐条确认覆盖情况;第二,需求变更评审时,根据变更需求快速找到所有关联用例,评估回归范围,回答“这次改动会影响哪些用例”;第三,线上问题复盘时,可以直接看出“这个需求当时有没有用例、用例执行了没有、为什么漏测”。它不需要做得多精美,但必须持续维护,否则一旦用例数量超过几百条,靠记忆就无法回答上面这些问题。
3. 五种核心用例设计方法,以及如何组合使用
3.1 等价类划分:先按数据分组合并,再选代表值
等价类划分的核心思路是:把输入数据的集合按“程序面对不同数据时的处理结果是否一致”分成若干组,同一组里的数据认为等价,所以每组取一个代表值来测试即可。这样可以用最少的用例覆盖最广的数据范围。
等价类分为两类。有效等价类指程序按需求正确接收并处理的输入;无效等价类指程序应当拒绝或提示错误的输入。设计用例时两类都要覆盖,很多系统出问题恰恰是无效输入处理不完善。
以“手机号必须是 11 位数字且以 1 开头”为例:
| 等价类 | 说明 | 代表值 |
|---|---|---|
| 有效等价类 | 以 1 开头的 11 位数字 | 13800138000 |
| 无效等价类 - 首位错误 | 以非 1 开头的 11 位数字 | 23800138000 |
| 无效等价类 - 长度不足 | 不足 11 位数字 | 1380013 |
| 无效等价类 - 含非数字 | 含字母或特殊字符 | 1380013800a |
| 无效等价类 - 为空 | 不输入手机号 | 空 |
这条规则还可以继续拆:如果接收方是接口,还要考虑 JSON 字段缺失、字段类型为 null、数据类型为数字而非字符串等情况。等价类划分看起来简单,但常见错误是只取了有效等价类,或者把无效等价类全部合并成“随便填一个错的”。这样会漏掉不同错误分支的提示处理和状态码差异。
3.2 边界值分析:把验证重点放在临界点附近
很多缺陷不是出现在典型值上,而是出现在程序做大小比较、数量限制、分页偏移时。比如年龄必须满 18 岁,判断条件写成 age > 17 与 age > 18 在 17 和 18 这两个值上会产生完全不同的结果。边界值分析方法要求把注意力放到取值范围的临界处。
以登录密码长度 6 到 20 位为例,按边界值法要测的点如下:
| 取值 | 类型 | 预期 |
|---|---|---|
| 5 位 | 下边界外的离点 | 提示密码长度不足 |
| 6 位 | 下边界上的点 | 接受或进入下一步校验 |
| 10 位 | 有效范围内的内点 | 正常接受 |
| 20 位 | 上边界上的点 | 正常接受 |
| 21 位 | 上边界外的离点 | 提示密码长度超限 |
边界值分析经常会和等价类划分一起用:先用等价类确定数据分组,再对各组的边界做重点测试。这里最容易犯的错误是只挑“看起来合理”的边界,比如只测 6 和 20,漏掉 5 和 21。另一个容易错的地方是对“含不含端点”理解错误,需求写“6 到 20 位”通常含 6 和 20,但在具体产品里可能有例外,所以边界值用例要回到需求逐条确认。
3.3 判定表法:条件组合多时按规则覆盖,而不是靠脑子
当系统行为由多个条件共同决定时,靠口头罗列测试点很容易漏组合。判定表法把这些条件整理成“条件桩”和“动作桩”,然后按笛卡尔积展开成规则。例如注册页要求:验证码输入正确且勾选协议后才能点击注册。
条件桩有两项:验证码是否正确(是/否)、是否勾选协议(是/否)。动作桩:允许注册、提示验证码错误、提示勾选协议。判定表如下:
| 条件/规则 | 规则1 | 规则2 | 规则3 | 规则4 |
|---|---|---|---|---|
| 验证码正确 | 否 | 否 | 是 | 是 |
| 已勾选协议 | 否 | 是 | 否 | 是 |
| 动作:允许注册 | - | - | - | 是 |
| 动作:提示验证码错误 | 是 | 是 | - | - |
| 动作:提示勾选协议 | - | - | 是 | - |
这里的规则 2 显示一个常见产品问题:验证码错误时,即使勾选了协议,页面应该优先提示验证码错误还是同时提示两个问题?这样就把产品逻辑上的潜在争议暴露在用例评审阶段。
判定表法要限制条件数量。条件很多时组合会指数增长,比如 6 个条件就有 64 种组合。实际工作中可以先用自动化或决策表工具辅助生成,或者用正交实验法从全组合中抽取有代表性的组合,避免用例数量爆炸。判定表法最怕的是只写两三个正常组合,例如“都对”“都错”,把中间状态丢了。
3.4 场景法:从业务流程角度组织主路径和备选路径
场景法更适合业务流程明确、状态流转复杂的功能,比如电商下单、支付、退换货、审批流。它把一条业务链路拆成基本流和备选流:基本流是用户最顺畅、最完整的路径;备选流是异常退出、分支处理、反向操作等路径。
以在线支付为例:
- 基本流:选择商品-确认订单-支付-支付成功-生成订单-展示订单详情
- 备选流 A:选择商品后购物车为空,返回购物车页
- 备选流 B:确认订单时库存不足,提示修改数量
- 备选流 C:支付时余额不足,跳转充值页
- 备选流 D:支付超时,提示重新支付
- 备选流 E:支付成功后回调失败,服务端以支付平台对账结果为准
这些备选流每一条都要对应至少一条用例,而且要注意它们和主流程的转接点。场景法用例适合做端到端冒烟测试,也适合作为自动化 E2E 用例的蓝本。实际操作时,建议先画一张业务流转图,把基本流和每个分支标清楚,再逐个分支写用例。
3.5 错误推测:把历史缺陷和易错点变成用例来源
错误推测法听起来不如前面几种系统,但它其实是可以积累的。它的依据不是“我感觉这里有问题”,而是“根据同类系统经验、历史缺陷记录和用户投诉记录,这些位置容易出问题”。把容易出问题的位置列成清单,再针对每个位置写验证用例,这就是错误推测法。
常见易错点可以提前列一列:
| 易错点 | 推测可能出现的缺陷 | 示例用例 |
|---|---|---|
| 重复提交 | 用户连点按钮,产生多条重复订单 | 点击支付按钮后,快速点击两次,校验订单只有一条 |
| 空值和 null | 删除数据后页面报错或白屏 | 删除列表最后一条后刷新页面 |
| 超长字符串 | 页面布局错乱、接口 500 | 在用户名输入 200 个字符,提交后查看提示 |
| 幂等性 | 重复提交相同请求导致重复扣款 | 相同订单号连续支付两次,只成功一次 |
| 超时与重试 | 支付成功但页面仍显示失败 | 模拟支付接口超时后重试,校验状态一致 |
| 并发操作 | 同一账号在不同设备同时登录、同时编辑 | 同一订单两个用户同时修改地址 |
| 状态流转 | 已取消订单仍可支付 | 取消订单后继续支付,校验被拦截 |
建议团队把这些易错点维护成一个“错误推测库”,每遇到一个线上事故或严重缺陷就往里增加一条。新成员设计用例时先对照这个库,至少能避免最典型的历史问题重演。
3.6 方法选择速查表:先数据、再组合、后流程、最后补经验
五种方法不是每轮测试都要从头到尾用一遍,它们各有擅长场景:
| 方法 | 适用场景 | 核心关注 | 局限性 |
|---|---|---|---|
| 等价类划分 | 单个输入字段的合法性 | 有效与无效分组 | 不关注条件组合和业务流程 |
| 边界值分析 | 数值、长度、数量、时间上下限 | 临界值附近 | 只解决边界问题 |
| 判定表法 | 多个条件逻辑组合 | 所有条件组合及对应动作 | 条件多时组合爆炸 |
| 场景法 | 业务流程、状态流转 | 主流程与备选流 | 需要先完整梳理业务 |
| 错误推测 | 历史缺陷和易错场景补漏 | 非典型输入和异常操作 | 依赖经验积累,不系统 |
实际项目中的推荐顺序是:先用等价类划分和边界值分析法处理每个输入字段,再用判定表法处理条件组合,接着用场景法组织业务主流程和分支,最后用错误推测法补一轮历史缺陷场景。这样设计出来的用例,通常既能覆盖“正常业务”,也能覆盖“异常输入、边界和组合”,比单纯凭感觉写要系统得多。
4. 从一条需求开始,完整拆出一套最小可评审用例
4.1 先用一条登录需求演示需求拆分
登录功能是绝大多数测试工程师写用例时第一个接触的模块,用它来讲拆分逻辑最好理解。假设需求如下:
- 支持手机号和密码登录。
- 手机号必须是 11 位数字且以 1 开头。
- 密码长度为 6 到 20 位。
- 密码连续错误 5 次后锁定账号 15 分钟。
- 登录成功后展示用户昵称和上次登录时间。
拆分验证点时,不要按“登录成功”“登录失败”这种大棒式写法,而要按“一个可判定的结果为一行”来拆:
- 手机号格式校验:合法手机号。
- 手机号格式校验:非法手机号(首位错误、长度不足、含字母、为空)。
- 密码格式校验:合法密码。
- 密码格式校验:长度不足 6 位、超过 20 位、为空。
- 登录成功主流程:正确手机号和正确密码,进入首页并展示昵称和上次登录时间。
- 密码错误提示与计数:错误密码后提示错误,连续错误次数累计。
- 第 5 次错误后的锁定效果:锁定期间即使密码正确也不能登录。
- 锁定 15 分钟后自动解锁:再次使用正确密码登录成功。
- 登录成功后信息展示:昵称、上次登录时间与数据库一致。
这些验证点中,第 6 和第 7 其实还可以继续拆成多条用例,因为“连续错误”本身有 1、2、4、5 次的边界状态。第 5 次锁定、锁定期间、解锁后,都应该有独立的用例,而不是合并成一条“测试锁定功能”。拆得够细,执行结果和缺陷定位才够准。
4.2 按字段落盘一条完整用例,表格和 JSON 两种形式
按前面的字段结构,把“手机号密码正确,登录成功”写成一条完整用例。表格形式如下:
| 用例编号 | LOGIN_004 |
|---|---|
| 用例名称 | 手机号密码正确,登录成功 |
| 需求来源 | REQ-LOGIN-001 |
| 优先级 | P1 |
| 前置条件 | 账号 13800138000 已注册;账号未被锁定;登录服务可访问 |
| 测试数据 | 手机号 13800138000;密码 abc123 |
| 测试步骤 | 1. 打开登录页;2. 输入正确手机号;3. 输入正确密码;4. 点击登录按钮 |
| 预期结果 | 1. 点击登录后跳转首页,地址栏为 /home;2. 页面顶部展示昵称 tom;3. 用户菜单中显示上次登录时间 |
| 实际结果 | 待执行 |
| 用例状态 | 未执行 |
| 关联缺陷 | 无 |
如果团队用测试管理平台,或者要把用例同步成自动化脚本的数据源,也可以用 JSON 形式:
{ "caseId": "LOGIN_004", "title": "手机号密码正确,登录成功", "requirementId": "REQ-LOGIN-001", "priority": "P1", "precondition": "账号 13800138000 已注册;账号未被锁定;登录服务可访问", "testData": { "phone": "13800138000", "password": "abc123" }, "steps": [ { "action": "打开登录页", "expected": "页面加载完成,显示手机号和密码输入框" }, { "action": "输入手机号 13800138000", "expected": "输入框显示 13800138000" }, { "action": "输入密码 abc123", "expected": "密码框按掩码显示" }, { "action": "点击登录按钮", "expected": "跳转首页,展示昵称 tom,展示上次登录时间" } ], "status": "NOT_RUN", "relatedBugIds": [] }JSON 的好处是结构清晰、易于导入自动化框架或测试管理工具;表格的好处是评审和肉眼浏览方便。具体用哪种,取决于团队现有流程,但不管用哪种,字段背后的“前置条件、数据、步骤、预期结果”不能丢。
4.3 用例编号、优先级和资源分配要提前定好
用例数量一多,如果没有命名规则,回归时找一条用例要翻很久。建议采用“模块_需求_序号”的编号方式,例如 LOGIN_REQ001_004。如果团队习惯使用简单序号,也可以统一成 LOGIN_001,但一套规则要坚持到底。关键是需求编号稳定时可用来做关联,方便需求变更时搜索影响范围。
优先级直接决定执行顺序和回归范围,常见的定义如下:
| 优先级 | 含义 | 执行策略 |
|---|---|---|
| P0 | 核心流程,失败会阻断发版 | 冒烟测试必跑,自动化基线必覆盖 |
| P1 | 主要功能,失败影响主要使用路径 | 功能测试阶段必跑 |
| P2 | 次要功能,失败影响局部体验 | 按时间安排再执行 |
| P3 | 边缘异常、兼容性、体验细节 | 有剩余时间或临近发布前抽查 |
优先级不是概念拍脑袋,要结合业务风险。例如登录功能里,“手机号密码正确登录成功”和“第 5 次错误后锁定”属于 P1;支付功能里,“支付成功回调失败后对账一致”属于 P0。风险高、影响面大、用户最常走的路径,优先级就高。
4.4 用例评审:用“盲执行”检验用例可执行性
用例写完之后,一定要评审。评审不看字面通不通顺,而是看三件事:需求是否覆盖、预期是否可判定、别人能否执行。
最简单有效的评审办法是“盲执行”:找一个没有参与这条用例设计的人,让他只看用例,不看界面原型,不看需求文档,按步骤操作,看能否直接得出通过或失败的结论。执行到某一步停下来问“这里输入什么、应该看到什么”,就说明这条用例的可执行性不达标。
评审时可以对照这个清单:
- 每个需求验证点是否都有对应用例。
- 每个输入字段是否覆盖有效等价类、无效等价类和边界值。
- 每条预期的“正常”是否已经改写为可判定断言。
- 每条前置条件是否可以在不依赖其他用例的情况下构造。
- 测试数据是否具体,有没有写“输入一个正确的手机号”这类模糊描述。
- 用例编号、优先级、需求来源是否都已填写。
- 是否存在步骤互相依赖、无法单独执行的用例。
- 历史缺陷修复场景是否已经补入用例。
清单用途是评审时的快速过滤,不是设计完成后的补充动作。建议把清单打印出来或放在会议投屏上,一条条过,比“大家看看还有没有问题”有效得多。
5. 执行不是填表:用例状态、缺陷回填和覆盖度量
5.1 执行前先定顺序,执行中记录可回溯信息
用例设计完,接下来是执行。执行顺序不是把用例从上到下全部跑一遍,而应该根据优先级和依赖关系来排序。第一优先级永远是冒烟测试,冒烟测试只跑 P0 用例,用于快速判断当前版本是否值得继续深度测试。冒烟不通过,可以直接把版本打回,不必浪费人力跑完整用例。
冒烟通过后,再按模块、风险、需求变更点来执行功能和回归。此处给出执行状态的定义和记录要求:
| 状态 | 含义 | 使用时机 | 需要额外记录 |
|---|---|---|---|
| 未执行 | 还没轮到执行 | 用例创建后 | 无需 |
| 通过 | 实际结果与预期一致 | 验证通过 | 版本号、执行人、时间 |
| 失败 | 实际结果与预期不一致 | 发现缺陷 | 截图、日志、复现步骤 |
| 阻塞 | 环境、数据、依赖导致无法执行 | 环境异常 | 阻塞原因 |
| 跳过 | 本次范围外或已知限制 | 评估后决定 | 跳过原因 |
执行记录最怕只写一个“通过”或“失败”。专业测试人员在执行时会记录:被测版本号、测试环境、构造的测试数据、关键日志或截图、执行人和时间。这些信息在缺陷定位和线上复盘时非常有用,尤其是“当时用例状态看起来是通过,但线上还是出了问题”,如果没有执行记录,根本无法还原当时的验证范围。
5.2 用例失败时,先分清是需求变化、用例错误还是产品缺陷
用例执行失败时,第一反应不应该是直接提交一个 BUG。先按下面的链路判断:
- 重新查看需求描述。如果需求已经变更,而用例没有同步更新,这是用例过期,不是产品缺陷。
- 再次检查前置条件和测试数据。账号是否已注册、数据是否被其他用例污染、环境服务是否正常。前置条件不成立时,执行结果不可信。
- 按用例步骤重跑一次。如果结果不稳定,记录“偶现”,尽量补齐日志和网络抓包。
- 如果结果稳定,截图、保存日志、记录接口返回,再提交缺陷。
- 提交缺陷后,把缺陷 ID 回填到用例的“关联缺陷”字段,方便后续回归筛选。
- 开发修复并验证通过后,重跑这条用例,并在缺陷记录中填写回归结论。
缺陷报告模板可以固定下来:
标题:登录接口密码错误提示文案不统一 优先级:P1 环境:测试环境,服务版本 1.4.2 前置条件:账号 13800138000 复现步骤: 1. 打开登录页 2. 输入正确手机号 13800138000 3. 输入错误密码 12345 4. 点击登录 实际结果:提示“密码错误,请重新输入” 预期结果:按需求文案提示“用户名或密码错误” 附件:login-error.png、login-error.log 关联用例:LOGIN_005这样的缺陷记录能让开发直接定位,不用再问“怎么复现”。实际项目里,很多的缺陷来回拉锯,问题不止在产品代码,还在于缺陷报告缺少环境、数据和关联用例。
5.3 覆盖率指标要会算,更要会用
测试负责人常用覆盖率指标来衡量测试是否充分,但指标本身要结合上下文理解。可计算的基础指标如下:
需求覆盖率 = 已设计用例的需求数 / 总需求数 × 100% 用例执行率 = 已执行用例数 / 用例总数 × 100% 用例通过率 = 通过用例数 / 已执行用例数 × 100% 缺陷遗漏率 = 线上缺陷数 / (测试阶段缺陷数 + 线上缺陷数) × 100%指标使用时有一个关键判断:通过率高了不代表质量好,也可能说明用例覆盖不足或预期结果写得太宽松;通过率低了也不一定代表版本差,有可能是环境长期不可用、数据被污染。所以度量报告里必须同时给出用例数量、执行环境、未执行原因和失败原因分类,否则数字就是摆设。
注意:覆盖率指标的功能是“发现盲区”,不是制造虚假的安全感。一份用例执行率 100% 的报告,如果需求本身只覆盖了正常路径,依然不能说明版本可以发布。
6. 用例设计里最常见的四个坑:现象、原因和排查方式
6.1 预期结果不可判定,用例等于没写
现象:评审用例时,每条用例的预期结果都是“系统正常”“页面展示正确”“功能可用”。执行结果也不好判断,两个人执行同一条用例,一个人认为通过,另一个人认为有问题。
原因:作者把“预期结果”当成“需求摘要”来写,没有把结果落到可观察、可断言的层面。系统正常是主观感受,不是观察结论;页面展示正确没有说明看到什么内容才算正确。
排查方式:逐条检查预期结果,是否能包含“页面跳转到哪个地址”“哪个按钮显示什么文案”“接口返回什么状态码”“数据库中的哪个字段变成什么值”。
处理建议:把预期结果改成“登录成功,地址栏变为 /home,页面顶部展示用户昵称 tom”这类可直接判断的描述。如果用例量很大,可以先从 P0/P1 用例开始改。
6.2 只有正常路径,没有无效类和异常分支
现象:冒烟测试全部通过,等到边界场景或异常操作时连续发现多个问题,版本被迫返工。
原因:用例设计时只按正常使用流程罗列步骤,没有系统地覆盖无效等价类、边界值、异常分支和错误操作。
排查方式:统计用例中“成功场景”和“失败场景”的比例,检查是否包含空值、超长输入、非法字符、重复提交、业务状态冲突这些常见异常场景。
处理建议:先列出每个字段的无效等价类和边界值,再列出业务分支的备选流,最后用错误推测库补充历史缺陷场景。正常路径之外的用例,至少要和正常路径用例数量相当,才谈得上覆盖合理。
6.3 用例依赖环境状态,换了环境就没法执行
现象:用例在作者本地执行通过,换到测试环境后失败;或者第一次执行通过,第二天重新执行失败。
原因:用例没有明确前置条件和测试数据,执行依赖“界面上恰好存在一条数据”“数据库恰好有某个状态”“某个账号没有被别人用过”。
排查方式:逐条查看用例是否写明“预置数据”“初始化操作”“环境要求”。再检查是否有用例之间共用账号、修改全局配置的写法。
处理建议:每条用例都要独立构造前置条件。涉及数据的用例,在步骤里增加“先通过接口或 SQL 造数”或“先点击新增按钮创建一条数据”的初始化步骤。用例之间尽量使用独立的测试账号和独立数据,避免互相污染。
6.4 需求变更后,用例库没有同步更新
现象:开发按新需求实现,测试还在执行旧用例,造成大量用例失败;或者旧用例已经失效,测试仍把它们纳入回归基线,浪费时间。
原因:需求变更评审时没有把“用例是否受影响”纳入评审范围,测试用例没有版本管理,只能靠人工记忆去更新。
排查方式:通过需求追踪矩阵查询变更需求对应的用例;在用例库中搜索已删除模块、已调整交互的功能是否还保留旧用例。
处理建议:把用例变更纳入需求变更流程。每个需求变更都必须在评审记录中回答三个问题:影响哪些用例、需要新增哪些用例、哪些旧用例需要删除或调整。变更完成后,同步更新需求追踪矩阵。
这四个坑的对应关系可以汇总成一张表:
| 问题现象 | 常见原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| 预期结果不可判定 | 把预期当成了需求摘要 | 逐条检查断言粒度 | 改写为可判定断言 |
| 只测正常路径 | 缺少系统性方法 | 统计有效/无效用例比 | 补等价类、边界、备选流 |
| 用例无法跨环境执行 | 前置条件与测试数据不明确 | 检查用例可复现性 | 独立造数、明确预置步骤 |
| 需求变更后用例过期 | 变更评审未关联用例 | 用需求追踪矩阵查询 | 把用例更新纳入变更流程 |
7. 专业进阶:维护机制、自动化分层和团队规范
7.1 用例要持续维护,触发更新的时机要明确
用例不是写完就进入“只读状态”的文档,它是与系统同步演化的资产。至少在以下时机要发起用例更新:
- 需求变更:功能、文案、规则发生变化时,先改用例再测新版本。
- 严重缺陷修复:修复后除了回归旧用例,还要新增一条覆盖该缺陷场景的用例。
- 线上事故复盘:复盘结论中的风险点必须进入用例库。
- 自动化脚本执行失败:如果脚本断言与界面实际不符,要判断是用例过时还是代码缺陷,过时就改用例。
- 周期性评审:建议每个迭代或每个版本结束后,用评审清单过一遍用例,删除无效、合并重复。
维护用例时要注意版本记录。推荐在有版本管理能力的测试平台中维护,或者把用例文件纳入代码仓库,跟随发布版本打 tag。没有版本管理,就无法回答“这个版本执行的是哪一版用例”。
7.2 自动化不是搬运手工用例,而是分层筛选
自动化测试看似解决“人力不够”的问题,但自动化用例的来源仍然是测试用例设计。如果把所有手工用例一股脑搬进自动化脚本,结果往往是维护成本高、失败频繁、投入产出比失衡。更合理的方式是把自动化用例分层看待:
| 层级 | 主要对象 | 谁来写 | 验证重点 |
|---|---|---|---|
| 单元测试层 | 函数、类、算法 | 开发 | 逻辑分支、边界、异常 |
| 接口测试层 | API 请求、参数、状态码、规则 | 测试和开发协同 | 参数校验、业务规则、幂等 |
| UI 测试层 | 页面交互、核心流程 | 测试 | 主流程、关键文案、跳转 |
| 端到端测试层 | 跨系统主流程 | 测试 | 业务链路的完整闭环 |
自动化用例仍然要从等价类、边界值和场景法中挑选输入。自动化脚本的价值在于快速回归,而不是弥补用例设计的漏洞。如果手工用例本身覆盖不足,脚本跑得再快也只是更快地证明“覆盖不足”。所以先把手作用例设计到可评审可执行,再谈自动化才是正确顺序。
7.3 用缺陷反向补用例的机制,让用例库持续进化
用例库最大的敌人是“僵化”:版本迭代很多轮,但用例还是老一套,线上问题却在新的路径上不断出现。要解决这个问题,可以建立“缺陷反向补用例”机制。具体执行方式:
- 每个线上事故和每个测试阶段发现的严重缺陷,修复后必须补一条用例。
- 补的用例要覆盖根因,而不只是覆盖“这次失败的输入”。比如缺陷是空值导致报错,用例就不只是“输入空值”,还要覆盖“接口返回空对象”“列表为空时刷新”等同类场景。
- 补用例后更新需求追踪矩阵,必要时同步更新自动化回归基线。
这个机制最大的作用不是增加用例数量,而是让用例库不断吸收真实世界的风险。它会随着时间变成团队最宝贵的测试资产。新成员接手一个老模块时,翻用例库里的历史缺陷相关用例,比翻任何文档都快。
7.4 发布前用例检查清单
最后一章给一个可以直接使用的发布前检查清单,适合每个版本上线前对照执行:
- 本期所有需求是否都有对应用例,需求覆盖率是否达到团队要求。
- 变更需求是否同步更新了用例,旧用例是否已经调整或删除。
- P0/P1 用例是否已全部执行并记录结果。
- 所有失败用例是否都有明确的原因分类,是产品缺陷还是环境问题。
- 所有严重缺陷是否有关联用例,修复后是否已回归。
- 线上历史高风险场景是否已经纳入回归用例库。
- 自动化回归基线是否已执行,与手工用例执行结果是否一致。
- 用例变更记录和需求追踪矩阵是否已更新到最新版本。
这份清单可以直接打印出来,放在每一轮版本的用例评审和发布评审里。清单的意义不在于每一项都必须打勾,而在于让团队在忙乱中还能回答“这一版本到底测了什么、漏了什么”。
测试用例设计的专业程度,最终体现在三件事上:每条用例能不能被任何人执行并给出确定结论;一套用例能不能覆盖正常路径、异常路径、边界和组合;用例库能不能随需求、缺陷和线上风险持续更新。对刚入行的测试工程师来说,先不要急着记一堆测试方法名词,先把一条用例的字段写完整,把预期结果写成可判定断言,再用等价类、边界值、判定表和场景法去拆解新的需求。对测试负责人来说,更要关注的是机制,比如评审清单、缺陷反向补用例、需求追踪矩阵和自动化分层。把这些机制建起来,测试用例设计就会从“个人经验”变成“团队能力”,这份用例才真正算得上专业。