返回测试用例设计实战教程
Business Testing / Tutorial 03

测试设计方法地图

遇到不同的业务问题,选择合适的方法,把有限的测试时间用在真正有风险的地方。

10 个章节8 类设计方法商城下单 + 会员积分实战
01

先根据问题找方法

不要从术语出发

你已经会写用例,现在要学会选方法

在商城下单中,商品数量有边界,优惠券涉及条件组合,设备与支付方式会产生大量配置,订单又会不断改变状态。它们不是同一种问题,也不应该套用同一种方法。

从业务问题进入测试设计方法地图
01

输入与边界

值该怎么选

等价类 · 边界值

02

规则与组合

条件如何搭配

因果图 · Pairwise · 分类树

03

经验与未知

还可能漏什么

错误推测 · 探索性测试

04

不变规则

什么始终不能错

属性测试 · 模型驱动

先识别问题

确认你面对的是输入、边界、组合、状态、历史缺陷,还是尚未完全看清的风险。

再选择方法

选择最能暴露这类问题的方法,不需要为了“方法齐全”把每一种都用一遍。

最后检查覆盖

确认关键规则、数据、组合和异常都能映射到可执行用例。

方法不是用例模板。它帮助你思考“哪里可能出错”,最终仍要把结果写成明确的条件、操作和预期。
02

用四个问题完成第一次选择

先判断问题类型
四个问题把你带到合适的方法
输入有范围?等价类 / 边界值
条件会组合?因果图 / Pairwise
输入维度很多?分类树
风险仍不清楚?错误推测 / 探索

从商城问题找到合适的方法

你看到的问题先问什么优先方法下单示例
输入可以分组哪些值会触发相同处理?等价类商品数量、手机号格式
规则有明确分界临界值前后是否变化?边界值购买上限、优惠门槛
多个条件共同决定结果条件之间是否有依赖或互斥?因果图 → 判定表会员、金额和优惠券资格
参数组合数量过多能否用较少组合覆盖参数交互?Pairwise / N-wise设备、支付方式、会员等级
输入维度需要逐层拆分每个维度有哪些有效类别?分类树积分抵扣规则
系统有历史缺陷或高风险经验哪里最可能再次出错?错误推测重复下单、金额精度
需求不完整或需要边做边学执行中还能发现什么?探索性测试营销活动联调
规则应对大量输入始终成立有哪些永远不能被破坏的约束?属性测试 / 模型驱动金额守恒、订单状态

一次需求可以同时使用多种方法

例如会员积分抵扣既有积分数量边界,也有会员等级、订单金额和积分状态的组合,还涉及支付失败后的积分退回。你可以先用分类树整理输入,再用边界值选择数据,最后用状态模型检查扣减与退回。

如果一个方法无法回答当前风险,就换一种或组合使用。判断标准始终是:它是否帮助你发现遗漏并生成可验证的用例。
03

用因果图理清条件之间的关系

适合复杂业务规则

会员券不是三个独立开关

商城规定:只有会员、订单金额达到 100 元并且优惠券有效时,才能抵扣 20 元。三个原因共同决定一个结果,任何一个条件不满足,都不能优惠。

三个原因同时成立,才产生优惠结果
会员
金额 ≥ 100
优惠券有效
AND
抵扣 20 元

先写原因和结果,再转换为判定表

编号原因或结果业务含义
C1用户是会员决定是否具备会员券资格
C2订单金额 ≥ 100 元决定是否达到使用门槛
C3优惠券有效决定优惠券当前是否可用
E1优惠券抵扣 20 元C1 且 C2 且 C3 同时成立
E2提示不可用并保持原价三个原因中至少一个不成立

因果图负责理清逻辑

  • 与:多个条件必须同时成立。
  • 或:满足任意条件即可触发。
  • 非:某个条件不成立时触发。
  • 互斥:两个条件不能同时出现。
  • 依赖:一个条件成立前必须先满足另一个条件。

判定表负责落到用例

  • 把原因放在条件行。
  • 把结果放在动作行。
  • 每一种有效组合形成一列规则。
  • 合并结果相同且风险一致的组合。
  • 为每列规则生成可执行用例。
条件超过三四个时,不要直接穷举。先用因果关系排除不可能组合,再决定哪些组合必须进入判定表。
04

用 Pairwise 缩减参数组合

组合多时先覆盖两两交互

设备、支付方式、会员等级和优惠券状态全部组合会迅速膨胀。Pairwise 选择较少的用例,让任意两个参数值至少共同出现一次。

四个参数产生六种参数对,每一对中的取值都要相遇
设备支付01
设备会员02
设备优惠券03
支付会员04
支付优惠券05
会员优惠券06

一组示意性的两两组合

用例设备支付方式会员优惠券
1PC微信普通会员不使用
2PC支付宝银卡会员有效券
3Android微信银卡会员不使用
4Android支付宝普通会员过期券
5iOS微信普通会员有效券
6iOS支付宝银卡会员过期券

适合使用

  • 浏览器、设备和系统版本兼容。
  • 支付渠道、会员等级和营销配置。
  • 权限角色、资源类型和操作动作。
  • 参数之间主要是低阶交互。

不能只靠 Pairwise

  • 资金、库存等核心组合要单独保留。
  • 三个条件共同触发的规则需要 3-wise 或判定表。
  • 业务禁止的组合要先加约束。
  • 边界、异常和状态问题仍需其他方法。
Pairwise 的目标是减少重复,不是证明所有组合都安全。高风险组合即使已经被两两覆盖,也应该保留独立用例。
05

用分类树整理多维输入

先分维度,再选组合

把会员积分抵扣拆成五个维度

面对一长串规则时,可以把测试对象放在树根,把身份、积分、金额、积分状态和支付结果作为分类,再为每个分类列出互不重复的类别。

从“积分抵扣”向下拆出分类和类别
会员积分抵扣
会员普通 / 银卡
积分0 / 部分 / 充足
金额门槛前 / 门槛后
状态有效 / 冻结 / 过期
支付成功 / 失败 / 超时

会员积分抵扣分类表

分类类别选择原则
会员身份普通会员、银卡会员每类至少选择一种身份
积分余额0、1~999、≥1000覆盖不可用、部分抵扣和充足积分
订单金额<100、100~499.99、≥500覆盖门槛和抵扣上限变化
积分状态有效、冻结、过期覆盖可以使用和不能使用
支付结果成功、失败、超时覆盖扣减、释放和结果未知

从树上组合一条用例

当银卡会员拥有 1000 积分、订单金额为 500 元、积分有效且支付成功时,系统按抵扣上限扣减积分,订单金额和剩余积分正确。

分类树帮你看见输入空间,但不要求每个叶子都与其他叶子全组合。优先组合存在业务关系、高风险或容易被忽略的类别。
06

用错误推测补上经验中的风险

从历史缺陷出发
把历史问题变成下一轮测试的风险雷达
重复
精度
并发
状态
权限
形成可重复执行的风险用例

记录来源、触发方式和验证证据

下单系统中值得主动猜测的错误

风险模式主动尝试重点检查
重复动作快速双击提交、超时后重试只生成一笔订单,只扣一次积分
金额精度99.99 元、0.01 元抵扣、多优惠叠加分摊金额和实付金额不出现负数或尾差
状态不同步支付成功但回调延迟订单与积分最终一致,可安全补偿
并发变化提交前库存或积分被其他请求占用重新校验并给出明确结果
权限绕过替换订单 ID 或用户 ID不能查看或操作他人的订单和积分

经验从哪里来

  • 同一模块的历史缺陷。
  • 线上故障和用户投诉。
  • 相似系统的常见问题。
  • 代码变更、架构边界和第三方依赖。
  • 开发与测试复盘中的薄弱环节。

怎样避免只靠感觉

  • 为每个猜测写出风险来源。
  • 说明失败后会影响谁和哪些数据。
  • 转换成可以重复执行的用例。
  • 记录命中率并更新风险清单。
  • 不让经验替代基础规则覆盖。
错误推测不是随便试。你要能说清楚:为什么怀疑这里、怎样触发、出现问题后用什么证据确认。
07

用探索性测试边执行边学习

有目标地探索

营销活动联调时,需求不会告诉你所有风险

当优惠券、积分、库存和支付服务首次组合上线时,可以围绕一个明确目标进行 45 分钟探索:尝试让订单金额、优惠状态和支付结果发生变化,观察系统是否保持一致。

一次探索会在学习、执行和记录之间循环
01任务

支付异常时保持一致

02时间盒

45 分钟

03探索

变化数据与操作

04记录

证据与新风险

05沉淀

缺陷与回归用例

探索任务

验证支付结果不确定时,订单、库存、优惠券和积分能否最终一致。

重点变化

支付中断、重复回调、页面刷新、切换网络和再次提交。

带走证据

时间线、订单号、请求日志、状态快照、发现的问题和后续用例。

一份探索记录至少回答

  • 本次探索目标和范围是什么。
  • 实际尝试了哪些操作和数据。
  • 发现了什么缺陷、疑问或新风险。
  • 哪些区域没有覆盖,为什么。
  • 哪些发现需要沉淀为回归用例。
探索性测试不是没有用例地随便点。它把学习、设计和执行放在同一个时间盒里,并用清晰的任务和证据控制范围。
08

用属性和模型验证更大的输入空间

检查始终成立的规则

示例用例只能覆盖少量数据。面对金额计算和订单状态,可以先定义始终不能被破坏的规则,再由程序生成大量数据或操作序列进行验证。

属性检查数据规则,模型检查操作路径
PROPERTY

金额始终守恒

商品金额 - 优惠 - 积分 + 运费 = 应付金额

MODEL
待支付
已支付
已完成

取消分支只能从待支付进入

商城下单中可以验证的属性

属性必须始终成立验证方式
金额守恒商品金额 - 优惠 - 积分抵扣 + 运费 = 应付金额随机生成金额、优惠和积分组合后仍成立
不可为负优惠、积分和退款不能让应付金额小于 0大量极端组合下应付金额始终 ≥ 0
幂等同一个业务请求重复执行,结果与执行一次相同重复提交不会增加订单数或重复扣积分
状态合法订单只能沿允许的方向迁移已取消订单不能再支付,已完成订单不能回到待支付
归属不变订单和积分只能被所属用户访问任意替换资源 ID 都不能越权

属性测试

适合金额公式、排序、转换、幂等和数据约束。重点不是某个固定输入的答案,而是大量合法输入都应满足同一条规则。

模型驱动测试

适合订单、支付、退款等状态系统。先定义允许的状态和动作,再生成不同操作序列,检查系统是否偏离模型。

属性和模型必须来自明确的业务约束。规则本身写错时,自动生成再多数据也只会更快地验证错误结论。
09

按风险组合方法,而不是选唯一答案

一项需求多种视角
一条可重复使用的测试设计路径
看问题输入 · 组合 · 状态
选方法分类 · 因果 · 探索
产用例条件 · 动作 · 预期
查覆盖规则 · 风险 · 证据

会员积分抵扣的组合方案

  1. 用分类树整理会员、积分、金额、状态和支付结果。
  2. 用等价类和边界值选择积分余额、订单金额与抵扣上限。
  3. 用因果图和判定表覆盖资格、门槛与状态组合。
  4. 用状态模型检查冻结、扣减、释放和退回。
  5. 用错误推测补充重复请求、精度和并发风险。
  6. 联调阶段用探索性测试发现未知问题。

停止增加用例前检查

  • 每条业务规则都有对应验证。
  • 核心边界和高风险组合已经覆盖。
  • 失败后的数据变化和恢复已经覆盖。
  • 历史高频缺陷有回归用例。
  • 低风险重复组合已合理缩减。
  • 剩余风险已明确记录。

方法选择没有固定顺序

规则清晰时,可以先从分类树和判定表开始;线上问题较多时,可以先从历史缺陷和探索性测试开始。顺序可以变化,但最终要回到需求、风险、用例和证据之间的对应关系。

10

完成一份可评审的方法地图

把选择理由交付出来

练习:为会员积分抵扣设计测试

  1. 整理会员身份、积分余额、订单金额、积分状态和支付结果五个输入维度。
  2. 画出积分资格、抵扣门槛和支付结果之间的因果关系。
  3. 为设备、支付方式和会员等级生成一组 Pairwise 组合。
  4. 从历史缺陷中补充不少于 5 个错误推测用例。
  5. 写一份 45 分钟探索任务,说明目标、变化方式和证据。
  6. 定义金额守恒、幂等和状态合法三条属性。
  7. 按“当……时,……”格式产出不少于 15 条用例。
  8. 为每条用例标注方法来源、优先级和对应测试点。

问题已看清

  • 输入维度已拆分
  • 条件关系已说明
  • 状态变化已画出
  • 未知风险已记录

方法有依据

  • 每种方法对应问题
  • 高风险组合单独保留
  • 约束与排除项明确
  • 没有为了数量套方法

结果可评审

  • 用例可以直接执行
  • 测试点与用例对应
  • 优先级理由明确
  • 剩余风险已说明

你最终应该交付

问题地图问题类型 → 方法
业务模型分类 · 因果 · 状态
测试用例方法来源可追溯
评审结论覆盖与剩余风险

掌握测试设计方法后,继续学习需求评审与测试方案,把风险识别转化为一次完整交付计划。

继续学习需求评审与测试方案