测试用例写了几百条,需求覆盖率却停留在70%左右,这种情况我在中大型项目的测试复盘中见过很多次。真正的问题通常不是测试人员不够认真,而是用例集中在“输入正确数据、点击提交、验证成功”这条主路径上,边界、异常、权限、状态迁移和接口失败都没有被系统拆开。下面这10个软件测试用例设计技巧,重点不是教你机械增加用例数量,而是帮助你用更少的重复用例,覆盖更多真正有风险的业务场景。
10个高效的软件测试测试用例设计技巧,让你的测试覆盖率翻倍!
一、先讲核心结论:覆盖率提升,不是靠堆用例
1. 高覆盖率来自风险维度,而不是用例数量
我判断测试用例是否有效,通常不会先看“写了多少条”,而是先看它覆盖了多少种风险。两条用例如果只是把用户名从“test01”改成“test02”,但执行路径、数据类型、权限和系统状态完全相同,那么它们在测试价值上几乎是重复的。
一套真正有覆盖效果的用例,至少需要从以下维度展开:功能规则、输入数据、业务状态、用户角色、接口交互、异常环境和历史缺陷。不同业务的权重不一样,但只覆盖主流程,几乎一定会留下明显盲区。
| 覆盖维度 | 低效写法 | 高效写法 | 主要发现的问题 |
|---|---|---|---|
| 输入数据 | 只输入一组合法值 | 同时覆盖空值、非法值、边界值和特殊字符 | 校验遗漏、类型转换错误 |
| 业务流程 | 只验证成功路径 | 补充失败、取消、重试、超时和回退 | 状态错乱、异常流程中断 |
| 权限角色 | 只用管理员账号测试 | 建立角色与操作权限矩阵 | 越权访问、权限配置错误 |
| 系统交互 | 只验证页面显示 | 同步检查接口、数据库和消息状态 | 前后端结果不一致、重复提交 |
因此,“测试覆盖率翻倍”更准确的理解是:在原来只覆盖主流程的基础上,补齐异常、边界和状态场景,使覆盖维度显著扩展。它不等于用例数量必然增加一倍,也不等于代码覆盖率一定翻倍。

2. 一条优秀用例必须同时满足四个标准
第一是可执行。测试人员不需要依赖编写者的口头解释,就能按照前置条件、测试数据和步骤完成操作。步骤中出现“正常操作”“检查一下”“验证系统是否正确”等模糊表述时,执行结果往往会因人而异。
第二是可验证。预期结果不能只写“登录成功”或“页面正常”。更好的写法是“接口返回200,生成有效会话信息,页面跳转至工作台,用户头像显示当前账号,刷新页面后登录状态仍然保留”。结果越具体,后续回归越稳定。
第三是可追溯。每条用例都应该能关联到需求、业务规则、风险或历史缺陷。没有关联关系的用例,需求变更后很容易成为无人维护的“孤儿用例”。
第四是可维护。用例不是一次性文档。字段、接口、页面和业务规则都会变化,因此步骤应该尽量模块化,测试数据应集中管理,重复前置条件可以通过公共配置复用。
二、为什么用例写了很多,覆盖率仍然不高
1. 从“功能名称”直接跳到“操作步骤”
最常见的低效流程是:产品经理写了“支持用户登录”,测试人员马上开始写“打开登录页,输入账号,输入密码,点击登录,登录成功”。这实际上跳过了最重要的需求分析阶段,因为“登录”不是一个场景,而是一组业务规则的集合。
我在拆登录需求时,会先把它改写成可验证的规则:账号允许什么格式,密码长度范围是多少,错误次数达到多少会锁定,验证码是否必填,锁定多久解除,不同角色登录后能看到什么,登录成功后是否允许多设备同时在线。
只有把功能名称拆成规则,测试用例才不会停留在页面操作层。否则即使写出20条登录用例,也可能只是换了20组合法账号和密码。
2. 把“测试通过率”误认为“测试覆盖率”
测试通过率回答的是“已经执行的用例中,有多少条通过”;测试覆盖率回答的是“需求、场景、风险或代码中,有多少部分被测试触达”。一轮回归中100%的用例通过,并不能证明没有遗漏,因为未被设计、未被执行的场景根本不会出现在分母里。
例如,一个支付需求只设计了“余额足够并支付成功”一条用例,这条用例执行通过后,测试通过率可以是100%,但支付失败、重复扣款、支付回调延迟、订单金额变化和支付后库存扣减等风险仍然没有覆盖。
3. 只增加数据,不增加场景
“把账号换成不同用户再跑一遍”有时是必要的,但它不能替代角色差异、权限差异和状态差异。测试数据变化只有在触发不同处理逻辑时才有价值。
我通常会问一个简单问题:这组新数据是否会让系统进入不同分支、不同状态或不同结果?如果答案是否定的,就应当考虑删除重复用例,把时间投入到更高风险的边界和异常场景上。
4. 需求覆盖率统计口径不清
不同团队对“需求覆盖率”的定义可能完全不同。有的团队按需求文档条目计算,有的按功能点计算,有的按用户故事验收条件计算。如果一个大需求下面包含登录、锁定、验证码和权限四类规则,却只关联一条主流程用例,统计数字看起来很高,实际覆盖仍然不足。

三、10个高效的测试用例设计技巧
1. 先把需求拆成可验证的业务规则
我建议不要直接从页面控件开始写用例,而是先建立“规则清单”。以注册功能为例,规则至少包括手机号格式、验证码有效期、密码复杂度、重复注册、协议勾选、注册成功后的账号状态以及风控限制。
拆解时可以使用下面这个顺序:
- 圈出需求中的业务对象,例如用户、订单、优惠券或审批单。
- 找出对象的属性,例如状态、金额、角色、有效期和数量。
- 找出触发条件,例如点击提交、超时、支付成功或审核拒绝。
- 找出系统结果,包括页面提示、数据库变化、接口响应和消息通知。
- 把“必须、不得、仅当、超过、至少、最多、有效期内”等词单独列出。
这些限制词往往是缺陷的来源。需求中写“用户最多添加5个地址”,至少要产生4、5、6和空值等不同场景,而不是只验证添加一个地址成功。
2. 用等价类划分压缩重复输入
等价类的核心不是“把数据分组”这么简单,而是判断一组输入是否会经过相同的程序逻辑。如果手机号为空、手机号包含字母、手机号位数不足,系统对它们都展示同一种提示,那么它们可以归入同一类;如果其中一种会触发风控接口,另一种只在前端拦截,就不能简单合并。
以年龄字段“18至60岁可申请”为例,我会至少设计以下等价类:
- 有效类:18至60之间的整数。
- 下限无效类:小于18的整数。
- 上限无效类:大于60的整数。
- 格式无效类:小数、字母、负数和特殊字符。
- 空值类:未填写、仅输入空格。
- 长度异常类:超出数据库或接口允许的最大长度。
等价类可以减少重复测试,但它有一个边界:只有在业务处理逻辑相同的前提下才能合并。例如“未注册手机号”和“已注册手机号”都符合手机号格式,却会触发完全不同的业务结果,因此不能归为同一个有效类。
3. 优先测试边界值和临界值
很多缺陷不发生在普通输入,而发生在“刚好满足”和“刚好不满足”的地方。密码要求8至20位时,测试重点应放在7、8、9、19、20和21位,而不是随便输入一串12位密码。
除了数值边界,还要关注以下边界:
- 字符串长度边界,例如数据库字段长度与前端限制不一致。
- 金额精度边界,例如0.01元、0元、负数和超过两位小数。
- 时间边界,例如23:59:59、00:00:00和跨日后的第一秒。
- 数量边界,例如库存为1、库存为0和超卖请求。
- 分页边界,例如第一页、最后一页、空结果页和超大页码。
我会特别提醒测试人员,不要只测“规则允许的最小值”和“最大值”,还要测临界值前一位与后一位。真正能区分程序分支的,往往就是这几个值。

4. 用判定表覆盖多条件组合
当一个结果由多个条件共同决定时,判定表比散乱地写用例更清晰。以优惠券使用为例,结果可能同时依赖有效期、最低消费金额、用户范围、商品范围和使用次数。
| 条件 | 组合一 | 组合二 | 组合三 | 组合四 |
|---|---|---|---|---|
| 处于有效期 | 是 | 否 | 是 | 是 |
| 达到最低金额 | 是 | 是 | 否 | 是 |
| 用户符合范围 | 是 | 是 | 是 | 否 |
| 商品符合范围 | 是 | 是 | 是 | 是 |
| 预期结果 | 允许使用 | 拒绝使用 | 拒绝使用 | 拒绝使用 |
判定表不意味着把所有理论组合全部穷举。实际项目中,我会先剔除业务上不可能发生的组合,再保留能够触发不同结果或不同错误提示的组合。这样既能覆盖规则,又不会制造大量无意义用例。
5. 用因果图理清条件之间的关系
因果图适合处理“多个输入条件共同导致一个结果”的复杂需求。例如库存系统中,是否允许下单可能取决于库存数量、用户是否登录、商品是否上架、是否超过限购数量以及支付方式是否可用。
使用因果图时,先把输入原因列出来,再把系统结果列出来,最后标记条件之间的“与”“或”“非”关系。这样做的价值在于,测试人员能够发现需求描述中隐藏的逻辑冲突,例如“库存大于0即可购买”和“用户购买数量不得超过限购数量”同时成立时,系统到底优先执行哪条规则。
如果业务只有两个简单条件,不必强行使用因果图;如果规则超过四五个,且条件之间存在依赖关系,因果图往往能显著减少漏测。
6. 用状态迁移覆盖流程变化
订单、支付、审批、工单和会员权益都不是静态页面,它们会随着操作和时间变化。测试这类功能时,只验证每个状态的页面展示是不够的,还要验证状态之间能否正确转换。
以订单为例,正常路径是“待支付,已支付,配送中,已完成”。但真正容易出问题的路径通常是:
- 待支付订单超时后自动关闭。
- 支付失败后是否仍然允许重新支付。
- 支付成功但回调延迟时,订单是否重复扣款。
- 已取消订单是否还能通过旧页面继续支付。
- 已完成订单申请退款后,库存和金额状态是否同步更新。
- 配送中的订单被重复点击发货时,系统是否拒绝非法转换。
我会把每个状态转换写成“当前状态+触发动作+目标状态+禁止动作”的格式。最后一项很重要,因为非法状态转换经常比正常转换更容易暴露权限和接口校验漏洞。

7. 使用错误推测补齐经验型风险
错误推测不是凭感觉随便猜,而是根据历史缺陷、技术架构、用户行为和线上事故记录,提前设计高概率问题。例如我在表单提交功能中,几乎一定会检查重复点击、网络抖动、刷新页面、浏览器返回、接口超时和返回空数据。
下面这些场景通常值得加入高频功能的测试集:
- 用户连续点击提交按钮。
- 用户在接口响应前刷新页面。
- 请求超时后再次提交。
- 接口成功但前端未收到响应。
- 前端显示失败,但后端已经写入数据。
- 用户在两个浏览器窗口同时修改同一条记录。
- 管理员修改权限后,旧会话仍然保持有效。
错误推测最适合补充系统化方法遗漏的真实使用行为,但不应该单独承担全部测试设计工作。它的依据越接近历史缺陷和实际操作,价值越高。
8. 用角色权限矩阵覆盖允许与禁止操作
权限测试不能只验证“管理员能不能操作”,还要验证普通用户、审核人员、只读人员和未登录用户能不能被明确限制。很多越权缺陷恰恰发生在页面按钮隐藏了,但接口仍然接受请求。
| 角色 | 查看数据 | 新增数据 | 编辑数据 | 删除数据 | 审核数据 |
|---|---|---|---|---|---|
| 超级管理员 | 允许 | 允许 | 允许 | 允许 | 允许 |
| 业务管理员 | 允许 | 允许 | 允许 | 按范围允许 | 禁止 |
| 审核人员 | 允许 | 禁止 | 禁止 | 禁止 | 允许 |
| 只读用户 | 允许 | 禁止 | 禁止 | 禁止 | 禁止 |
| 未登录用户 | 公开数据可查看 | 禁止 | 禁止 | 禁止 | 禁止 |
对于权限矩阵中的“禁止”,预期结果应包含状态码、提示信息、页面表现和数据是否发生变化。只验证按钮不显示是不够的,必须直接调用接口或修改请求参数,确认后端也拒绝越权操作。

9. 同时验证前端、接口和数据结果
一个页面提示“保存成功”,并不代表数据一定正确写入。测试用例至少要从三个层面检查:前端交互是否正确、接口响应是否符合约定、数据库或业务对象状态是否真正变化。
例如修改用户手机号时,前端可能提示成功,但接口实际返回了部分失败;或者接口返回成功,数据库已经写入,但缓存仍然显示旧手机号。此时只看页面就会误判测试通过。
我会把这类用例拆成四个检查点:请求参数是否正确、响应码和错误码是否正确、持久化数据是否正确、刷新或重新登录后结果是否一致。对于支付、库存、权限和审批等核心业务,还应检查消息队列、审计日志和关联对象状态。
10. 用风险优先级决定用例先测什么
测试资源永远有限,因此不能把所有用例都当成同样重要。我的优先级判断通常由业务影响、发生概率、变更范围和技术复杂度共同决定。
- P0:资金、权限、数据安全、核心交易链路和不可逆操作。
- P1:高频使用的主要功能、核心接口和大范围变更模块。
- P2:一般功能、低频异常、兼容性和体验细节。
- P3:低风险展示问题、非核心文案和暂不影响业务的优化项。
风险优先级不是给产品贴永久标签,而是根据版本变化动态调整。一个平时属于P2的导出功能,如果本次修改了权限校验和敏感字段处理,就应当临时提升为P0或P1。

四、用登录功能做一次完整拆解
1. 从一条需求拆出15个可执行场景
假设需求是:“用户输入正确账号和密码后可以登录,连续输错5次后账号锁定。”如果只写一条主流程用例,至少会遗漏账号校验、密码边界、锁定状态、验证码、权限和接口异常。
我会先建立如下场景清单:
| 编号 | 设计方法 | 场景 | 主要验证点 |
|---|---|---|---|
| TC-01 | 等价类 | 输入合法账号和密码 | 登录成功并生成有效会话 |
| TC-02 | 等价类 | 账号为空 | 是否阻止提交并提示必填 |
| TC-03 | 等价类 | 密码为空 | 是否阻止提交并提示必填 |
| TC-04 | 格式校验 | 账号包含非法字符 | 前后端校验规则是否一致 |
| TC-05 | 边界值 | 密码长度为下限值 | 符合规则的边界值能否通过 |
| TC-06 | 边界值 | 密码长度超过上限 | 是否拒绝超长输入并保持数据安全 |
| TC-07 | 状态迁移 | 连续输错4次 | 账号是否仍可登录,错误计数是否正确 |
| TC-08 | 状态迁移 | 连续输错第5次 | 账号是否进入锁定状态 |
| TC-09 | 状态迁移 | 锁定账号输入正确密码 | 锁定状态是否优先于密码正确 |
| TC-10 | 错误推测 | 连续快速点击登录 | 是否生成重复请求或重复日志 |
| TC-11 | 接口异常 | 登录接口超时 | 提示是否清晰,是否允许安全重试 |
| TC-12 | 接口异常 | 接口返回空数据 | 前端是否出现异常页面或错误跳转 |
| TC-13 | 权限矩阵 | 普通用户访问管理页面 | 页面和接口是否同时拒绝越权 |
| TC-14 | 状态持久化 | 登录成功后刷新页面 | 会话是否有效,用户数据是否正确 |
| TC-15 | 并发场景 | 两个设备同时登录 | 会话策略、踢出策略和安全提示是否符合规则 |
2. 用例步骤应该写到什么程度
好的测试步骤不是越长越好,而是要让关键变量和判断结果足够明确。以“密码错误达到5次”为例,不能只写“多次输入错误密码”,而应明确使用同一个账号、每次请求间隔、验证码是否参与、计数是否跨页面保留,以及第5次请求后的账号状态。
用例编号:LOGIN-LOCK-005
测试目标:验证账号连续输错5次后进入锁定状态
前置条件:
测试账号已注册且当前状态为正常
账号未存在历史失败次数
登录风控规则配置为连续失败5次锁定
测试数据:
账号:test_user_01
密码:错误密码
步骤:
输入正确账号和错误密码,提交登录
重复执行步骤1,直到累计失败4次
第5次输入错误密码并提交
使用正确密码再次登录
预期结果:
- 前4次均提示账号或密码错误,账号保持正常状态
- 第5次失败后,账号状态变为锁定
- 使用正确密码再次登录时仍被拒绝
- 页面提示锁定原因和解除方式
- 数据库、接口响应和安全日志中的状态保持一致
这里最容易遗漏的是“第5次之后使用正确密码再次登录”。如果只验证错误提示,无法确认锁定状态是否真的生效,也无法发现前端限制与后端状态不一致的问题。
3. 观察用例数量变化,更要观察覆盖结构变化
下面是一组情景模拟数据,用来说明设计方式改变后,覆盖效果如何变化。原方案有30条用例,其中22条集中在正常登录、不同账号和不同浏览器;优化后用例数量增加到38条,但新增部分主要用于边界、状态、权限和接口异常,而不是简单重复。
| 覆盖类型 | 优化前用例数 | 优化后用例数 | 变化 |
|---|---|---|---|
| 正常流程 | 18 | 18 | 保持不变 |
| 异常输入 | 5 | 9 | 增加4条 |
| 边界条件 | 2 | 6 | 增加4条 |
| 状态迁移 | 1 | 4 | 增加3条 |
| 权限场景 | 2 | 5 | 增加3条 |
| 接口与环境异常 | 2 | 6 | 增加4条 |
这组数据不是某个项目的公开统计,而是用于演示设计逻辑的样本推演。它说明一个关键判断:高质量优化不一定大幅增加主流程用例,而是把新增资源投入到原先没有覆盖的风险维度。

五、如何衡量测试覆盖率是否真的提升
1. 至少同时看四种覆盖率
在实际项目中,我不建议只设一个“总覆盖率”。最低限度可以同时看需求覆盖率、场景覆盖率、风险覆盖率和缺陷回归覆盖率。
需求覆盖率用于判断需求是否有测试映射,适合发现“完全没有用例”的需求项。基础公式是:已关联测试用例的需求项数量除以需求总项数量,再乘以100%。
场景覆盖率用于判断主流程、异常流程、边界流程和回退流程是否都被设计。它比单纯需求覆盖率更接近用户实际使用情况。
风险覆盖率用于判断高影响风险是否都有对应验证,例如资金错误、越权访问、数据丢失、重复扣款和审批绕过。
缺陷回归覆盖率用于判断已修复缺陷是否转化为长期回归资产。一个线上缺陷修复后,如果没有补充回归用例,下一次改动仍可能重复出现。
| 覆盖率类型 | 计算示例 | 适合回答的问题 | 主要局限 |
|---|---|---|---|
| 需求覆盖率 | 已关联需求数 ÷ 需求总数 | 哪些需求还没有测试 | 无法说明每个需求内部是否完整 |
| 场景覆盖率 | 已覆盖场景数 ÷ 识别出的场景总数 | 是否覆盖正常、异常和边界流程 | 场景识别质量决定分母质量 |
| 风险覆盖率 | 已验证高风险项 ÷ 高风险项总数 | 关键风险是否被优先验证 | 风险等级需要专业判断 |
| 缺陷回归覆盖率 | 已转化回归用例缺陷数 ÷ 已修复缺陷数 | 历史问题是否形成防线 | 不能代表新需求覆盖度 |
2. 用覆盖矩阵发现“看起来覆盖,实际上遗漏”
我经常使用需求,风险,用例三维矩阵做评审。需求负责说明要实现什么,风险负责说明可能怎样失败,用例负责说明如何验证。如果某个需求只有用例没有风险分析,往往会出现大量主流程重复;如果只有风险没有用例,说明风险还没有落地。
矩阵评审可以按以下步骤执行:
- 把需求拆成可验证的规则和验收条件。
- 为每条规则标注影响范围、发生概率和风险等级。
- 检查每个高风险项是否至少有一条正向和一条反向验证。
- 检查边界、异常、权限和状态是否都有对应编号。
- 删除只改变测试数据、但不改变业务逻辑的重复用例。
- 确认所有高优先级用例都已安排到当前测试周期。
3. 建立“覆盖率提升”的基线,而不是直接承诺翻倍
标题中的“翻倍”适合吸引关注,但项目管理和测试汇报必须有严谨口径。开始优化前,应先记录当前基线:需求条目数量、已关联用例数量、正常场景数量、异常场景数量、历史缺陷数量和高风险项数量。
例如,当前需求覆盖率为60%,优化后达到85%,这属于提升25个百分点,不是“提升25%”。如果当前异常场景覆盖率为30%,优化后为60%,才可以说该维度实现了翻倍,但仍然要注明样本范围和统计周期。

六、PingCode在中大型测试协作中的使用判断
1. 什么情况下适合引入测试管理平台
当团队规模超过100人、研发与测试成员分布在多个项目,或者需求、缺陷和回归用例之间需要长期追踪时,仅靠电子表格很容易出现版本冲突、关联丢失和执行结果无法复盘的问题。
以PingCode这类研发管理平台为例,它更适合承载需求、测试用例、缺陷和迭代之间的关联关系。对于中大型企业,测试负责人可以按版本、模块、风险等级和执行批次查看测试状态,而不是在多个文件中人工拼接结果。
但工具不能替代测试设计。把一批重复用例导入平台,并不会自动提高覆盖率;如果需求拆解、风险识别和用例评审本身没有做好,平台只会让低质量用例被更高效地管理。
2. 选型时重点看四个能力
第一,需求与用例的双向追踪。从需求能看到关联用例、缺陷和执行结果,从缺陷也能回溯到受影响需求和历史版本,这对变更影响分析非常重要。
第二,测试执行与缺陷联动。测试失败后能够直接关联缺陷,记录环境、版本、复现步骤和日志,避免测试人员重复整理信息。
第三,权限与组织隔离。中大型企业通常存在多项目、多部门和多角色,平台需要支持项目级权限、字段权限和数据隔离。
第四,部署与迁移能力。涉及研发数据、客户信息或行业合规要求的团队,往往需要私有化部署。若企业已有Jira等系统,还要重点评估需求、任务、缺陷、用户和历史数据能否平滑迁移,避免工具切换反而造成管理断层。

3. 什么时候不必急着上工具
如果团队只有两三名测试人员,需求规模小、迭代频率低,并且当前连用例字段、编号规则和评审机制都没有建立,直接采购平台可能会把时间消耗在配置和维护上。
这类团队可以先用表格完成三件事:统一用例模板、建立需求与用例关联、增加风险和场景字段。等到用例数量、项目并行数或协作人员增加后,再评估是否迁移到专业平台。
我更看重“流程先行、工具后置”。平台的价值是减少协作成本和数据丢失,而不是替团队完成边界分析、判定表设计和风险判断。
七、不同项目阶段的行动建议与取舍
1. 需求评审阶段:优先补规则,不急着写完整步骤
需求刚进入评审时,最有效的工作不是立即写几十条测试步骤,而是检查规则是否完整。重点追问输入范围、默认值、异常提示、权限范围、状态变化、失败重试和数据保留周期。
这一阶段的取舍是:宁可少写执行步骤,也不要放过模糊业务规则。需求评审时发现一个缺失条件,往往比测试阶段发现一个页面缺陷便宜得多。
- 产品规则不清:先补充判定条件和预期结果。
- 角色边界不清:先建立权限矩阵。
- 状态规则不清:先画状态迁移图。
- 接口约定不清:先确认错误码、超时和重试策略。
2. 开发联调阶段:优先覆盖接口和高风险分支
开发联调阶段不适合等待所有页面都完成后再测试。对于支付、库存、审批、权限和数据写入功能,应尽早验证接口参数、错误码、幂等性和状态变化。
如果时间只有两天,我会优先执行P0和P1用例,再执行高频主流程,最后处理低风险兼容性和体验问题。这样做的代价是部分低优先级细节可能延后,但能避免核心链路在发布前才暴露结构性缺陷。
3. 回归测试阶段:优先复用稳定用例,谨慎增加新用例
回归阶段最怕两件事:一是历史缺陷没有转化为回归资产,二是每次需求变更都无限增加用例。前者会造成问题重复发生,后者会让执行成本快速失控。
我建议把用例分为三层:
- 冒烟集:验证系统是否具备继续测试的条件。
- 核心回归集:覆盖P0、P1风险和历史高频缺陷。
- 扩展回归集:覆盖兼容性、低频异常和边界体验。
每次变更先做影响分析,再决定执行哪一层。不是所有改动都需要全量回归,但涉及公共组件、权限、订单状态和数据模型的改动,通常不能只执行冒烟集。
4. 发布前阶段:用风险清单代替“全部通过”的单一结论
发布前汇报不应只写“用例通过率100%”。更有决策价值的报告应包括:已执行范围、未执行范围、高风险项状态、遗留缺陷、已知限制、回归深度和上线后的监控方案。
如果某个低风险兼容性用例因环境不足未执行,可以明确说明影响范围;如果一个权限接口存在高风险缺陷,即使总通过率很高,也不应给出无条件的发布建议。
八、测试用例设计完成后的检查清单
1. 需求与规则检查
- 是否每条需求都能关联到至少一个测试目标?
- 是否把“必须、不得、至少、最多、超过、仅当”等限制词拆成规则?
- 是否明确了成功、失败和异常时的预期结果?
- 是否确认了默认值、空值和缺省参数的处理方式?
2. 场景与数据检查
- 是否覆盖主流程和失败流程?
- 是否覆盖有效等价类和无效等价类?
- 是否覆盖最小值、最大值、临界值前后数据?
- 是否覆盖空值、空格、特殊字符、超长数据和错误类型?
- 是否覆盖重复提交、刷新、返回、超时和网络中断?
3. 权限与状态检查
- 是否为不同角色建立查看、新增、编辑、删除和审核矩阵?
- 是否验证了页面限制和接口限制的一致性?
- 是否覆盖每个关键状态以及合法、非法转换?
- 是否检查了状态变化后的数据、日志和通知?
4. 执行与维护检查
- 步骤是否足够明确,其他测试人员能否独立执行?
- 预期结果是否可观察、可判断、可复现?
- 是否关联需求、风险、缺陷和版本?
- 是否删除了只改变测试数据、不改变业务逻辑的重复用例?
- 是否给P0和P1风险设置了优先级和明确负责人?

九、结语:真正值得追求的是风险覆盖率
1. 不要把“用例更多”当成“测试更专业”
测试用例设计的专业性,体现在能否从需求中识别出不同处理逻辑,能否提前发现状态和权限风险,能否用明确的预期结果验证系统行为,而不是体现在文档页数和用例总量上。
如果一套用例只有正常输入、主流程和页面提示,即使数量达到几百条,也可能无法覆盖一次真实的异常操作。相反,一套经过等价类划分、边界分析、判定表、状态迁移和风险排序的用例,数量未必庞大,却更接近真实质量风险。
2. 下一步可以直接这样做
- 选一个当前正在迭代的登录、订单、支付或审批功能。
- 先暂停新增用例,花30分钟列出业务规则和风险点。
- 分别补齐正常、异常、边界、权限和状态迁移场景。
- 删除只改变测试数据、不改变业务逻辑的重复用例。
- 为每条高风险场景设置优先级,并关联需求或历史缺陷。
- 用需求覆盖率、场景覆盖率和风险覆盖率分别汇报结果。
- 当团队规模和协作复杂度上升后,再评估是否使用PingCode等测试管理平台统一追踪。
我最建议保留的判断是:先追踪“遗漏了哪些风险”,再统计“写了多少用例”。当测试设计从功能清单转向风险模型,覆盖率才不再是一个漂亮但空泛的百分比,而会真正变成帮助团队决定是否发布、哪里需要加测、哪些问题必须修复的工程依据。
常见问题解答(FAQ)
1. 测试用例数量越多,测试覆盖率就越高吗?
我以前也习惯用用例数量衡量测试工作量,一个需求写出几十条用例后,就认为覆盖得比较充分。可是执行几轮后发现,很多用例只是换了数据,真正的异常流程、权限差异和状态变化仍然没有覆盖,我想知道怎样判断覆盖率是否真的提升。
不一定。测试用例数量增加,只能说明测试记录变多,不能证明业务风险被覆盖。实际项目中最容易出现一种“虚假增长”:同一条主流程反复替换账号、商品或金额,数量从30条增加到60条,但异常路径仍然只有登录失败和参数为空两类。我更建议把覆盖率拆成四个维度检查:需求覆盖、场景覆盖、风险覆盖和回归覆盖。
比如一个支付需求有10条业务规则,关联用例的需求覆盖率可能达到100%,但如果没有验证重复扣款、支付回调延迟和支付成功后的订单状态,风险覆盖仍然是不完整的。
检查维度计算示例主要解决的问题 需求覆盖率已关联用例的需求项 ÷ 需求总项有没有需求没有测试 场景覆盖率已验证场景 ÷ 已识别场景是否只测了主流程 风险覆盖率已验证高风险项 ÷ 高风险项总数关键风险是否被优先验证 回归覆盖率已补充回归用例的缺陷 ÷ 有效缺陷总数历史问题是否再次被防护 在一次订单流程复盘中,我们删除了约20%的重复用例,却增加了库存不足、重复提交、支付回调延迟和取消后再次支付等场景。
用例总数没有明显增长,但风险清单覆盖从约60%提升到接近90%。这比简单把用例数量翻倍更有价值。所以,“覆盖率翻倍”必须先说明统计口径。没有口径的覆盖率数字,很容易把记录数量、代码行覆盖率和业务场景覆盖率混为一谈。
2. 等价类、边界值、判定表和状态迁移应该怎么选择?
我知道这些测试用例设计方法的名称,也看过不少定义,但真正拿到一个登录、优惠券或订单需求时,经常不知道该用哪一种。有时为了显得完整,把所有方法都套上一遍,结果用例很多却没有抓住重点,我想了解更实际的选择方式。
选择方法时不要先问“今天要不要用边界值”,而要先看缺陷风险来自哪里。输入范围容易出错,就优先用等价类和边界值;多个条件共同决定结果,就用判定表;功能存在明确的前后状态,就用状态迁移;如果规则来自多个相互影响的条件,再考虑因果关系分析。
我在评审用例时,会先把需求改写成三类信息:输入约束、决策条件、状态变化。这样比按测试方法背目录更快,也更不容易机械套用。
需求特征优先方法例子常见误区 有长度、金额、日期范围等价类加边界值密码8至20位只测8位和20位,不测临界前后 多个条件共同决定结果判定表优惠券是否可用穷举无业务意义的组合 对象会经历多个阶段状态迁移待支付到已完成只测每个状态,不测非法转换 条件之间存在依赖关系因果关系分析会员等级和商品类型共同影响折扣忽略条件之间的互斥关系 例如优惠券规则包含“在有效期内、订单金额达标、商品属于适用范围、用户未使用过”四个条件,单纯使用等价类只能验证各个输入的有效与无效,无法确认条件组合是否正确。
此时判定表更合适,但应先剔除系统实际上不可能出现的组合,否则会把时间浪费在无效穷举上。我的经验是,一条复杂需求通常需要方法组合,而不是单一方法包打天下。先用等价类减少重复输入,再用边界值找临界缺陷,最后用判定表或状态迁移补上业务逻辑,这个顺序通常更高效。
3. 如何用一个登录功能设计出高覆盖率测试用例?
我以前写登录用例时,通常只有正确账号密码、错误密码、账号为空这几条。后来线上遇到过验证码过期、连续点击产生重复请求、账号锁定后仍能登录等问题,我想用一个完整案例看看登录功能到底应该从哪些角度拆解。
登录功能看似简单,实际同时包含输入校验、身份认证、账号状态、验证码、会话管理、权限控制和异常恢复。只写“输入正确账号密码后登录成功”,验证的只是最短路径,无法代表登录功能已经被充分覆盖。我会先把登录需求拆成规则,再按风险排序。
下面这组示例不是为了追求用例数量,而是为了覆盖不同类型的失败原因和状态变化。
编号设计方法测试场景重点验证 TC-01等价类合法账号和合法密码认证成功、跳转正确、会话建立 TC-02边界值密码长度为7、8、20、21位长度规则是否准确执行 TC-03异常场景账号为空、密码为空、格式非法提示是否明确,是否发起无效请求 TC-04状态迁移连续输错达到锁定阈值账号是否进入锁定状态 TC-05状态迁移锁定后等待、解锁或管理员处理不同解锁条件是否符合规则 TC-06错误推测验证码过期后提交是否要求刷新验证码,旧验证码是否失效 TC-07接口异常登录接口超时或返回空数据页面是否重复提交,错误提示是否一致 TC-08权限矩阵普通用户访问管理页面前端隐藏和后端禁止是否同时成立 TC-09并发操作快速连续点击登录按钮是否创建重复会话或重复请求 TC-10会话场景登录后刷新、退出、返回上一页会话状态和受限页面访问是否正确 这里最容易被忽略的是“账号锁定”与“权限控制”。
它们不是单纯的输入校验,而是状态和角色问题。如果只验证页面提示,却没有检查接口是否真正拒绝请求,就可能出现前端显示锁定、后端仍然允许登录的严重缺陷。执行顺序上,我会先跑正确登录、错误密码、账号锁定、越权访问和会话失效等高风险用例,再补充兼容性和体验细节。
这样即使时间只够完成一轮冒烟测试,也能优先保护身份安全和核心访问链路。
4. 测试用例写完后,怎样发现遗漏的场景和无效的重复用例?
我经常遇到两种相反的问题:一方面,用例评审时大家都说“差不多覆盖了”,测试结束后却发现漏了异常流程;另一方面,同一个需求下有很多步骤几乎一样,维护起来非常耗时。我想知道有没有一套可以在评审会上直接使用的检查方法。
用例评审不应该只逐条检查文字是否完整,更应该检查“需求规则是否都能在用例中找到证据”。我通常会建立一张需求,风险,场景矩阵,先看有没有空白,再看同一格里是否堆了大量重复用例。例如一个退款需求可以拆成金额规则、订单状态、用户角色、支付渠道、时间限制和接口异常六类风险。
若用例表只有“退款成功”和“退款失败”,即使步骤写得很详细,也无法证明这些风险已经被覆盖。
评审问题如果答案是否定的应补充的方向 主流程是否覆盖用户无法完成核心任务正常输入、正常状态、成功结果 失败流程是否覆盖错误处理可能不稳定非法输入、业务拒绝、接口失败 边界是否覆盖临界值容易产生缺陷最小值、最大值、临界前后值 角色是否覆盖可能出现越权允许角色、禁止角色、未登录用户 状态转换是否覆盖流程中断后可能无法恢复合法转换、非法转换、重复转换 历史缺陷是否回归旧问题可能再次出现缺陷复现步骤和相邻场景 判断重复用例时,不要只看标题是否相同,而要比较三个要素:输入数据是否属于同一等价类、系统状态是否相同、预期结果是否相同。
如果三者都相同,通常可以合并;如果只有账号不同但账号类型、权限和状态也不同,就不能简单删除。我还会要求每条高优先级用例关联一个具体风险或业务规则,并把预期结果写成可观察的证据,例如“订单状态变为已退款,退款流水生成,余额增加对应金额”,而不是笼统写“系统处理正常”。
最后用一次缺陷反推检查:每个已发现缺陷是否都有回归用例?如果没有,说明用例库缺少从真实问题中学习的机制。长期来看,历史缺陷比测试人员临时想到的“可能异常”更值得沉淀。
核心关键词
原创文章,作者:飞飞,如若转载,请注明出处:https://worktile.com/solution-1/archives/33189
读者评论
文章把“覆盖率高”和“用例数量多”区分得很清楚,尤其是边界、异常和状态迁移这些维度,对日常回归设计很有参考价值。
等价类和边界值的示例比较实用。不过实际项目中还要结合接口校验、数据库字段限制一起验证,否则前后端规则不一致的问题可能仍会遗漏。
判定表适合处理优惠券、权限等多条件业务,但组合数量容易快速增长,文中提到先排除不可能组合,这一点对控制测试成本很重要。
状态迁移部分很有价值,很多订单问题确实不是正常流程导致的,而是重复提交、超时回调和非法状态转换没有覆盖。
文章强调用例的可执行、可验证、可追溯和可维护,比较符合团队协作实际。若能再补充接口自动化与用例优先级的落地示例,会更完整。