测试设计方法地图
遇到不同的业务问题,选择合适的方法,把有限的测试时间用在真正有风险的地方。
先根据问题找方法
不要从术语出发你已经会写用例,现在要学会选方法
在商城下单中,商品数量有边界,优惠券涉及条件组合,设备与支付方式会产生大量配置,订单又会不断改变状态。它们不是同一种问题,也不应该套用同一种方法。
输入与边界
值该怎么选
等价类 · 边界值
规则与组合
条件如何搭配
因果图 · Pairwise · 分类树
经验与未知
还可能漏什么
错误推测 · 探索性测试
不变规则
什么始终不能错
属性测试 · 模型驱动
先识别问题
确认你面对的是输入、边界、组合、状态、历史缺陷,还是尚未完全看清的风险。
再选择方法
选择最能暴露这类问题的方法,不需要为了“方法齐全”把每一种都用一遍。
最后检查覆盖
确认关键规则、数据、组合和异常都能映射到可执行用例。
用四个问题完成第一次选择
先判断问题类型从商城问题找到合适的方法
| 你看到的问题 | 先问什么 | 优先方法 | 下单示例 |
|---|---|---|---|
| 输入可以分组 | 哪些值会触发相同处理? | 等价类 | 商品数量、手机号格式 |
| 规则有明确分界 | 临界值前后是否变化? | 边界值 | 购买上限、优惠门槛 |
| 多个条件共同决定结果 | 条件之间是否有依赖或互斥? | 因果图 → 判定表 | 会员、金额和优惠券资格 |
| 参数组合数量过多 | 能否用较少组合覆盖参数交互? | Pairwise / N-wise | 设备、支付方式、会员等级 |
| 输入维度需要逐层拆分 | 每个维度有哪些有效类别? | 分类树 | 积分抵扣规则 |
| 系统有历史缺陷或高风险经验 | 哪里最可能再次出错? | 错误推测 | 重复下单、金额精度 |
| 需求不完整或需要边做边学 | 执行中还能发现什么? | 探索性测试 | 营销活动联调 |
| 规则应对大量输入始终成立 | 有哪些永远不能被破坏的约束? | 属性测试 / 模型驱动 | 金额守恒、订单状态 |
一次需求可以同时使用多种方法
例如会员积分抵扣既有积分数量边界,也有会员等级、订单金额和积分状态的组合,还涉及支付失败后的积分退回。你可以先用分类树整理输入,再用边界值选择数据,最后用状态模型检查扣减与退回。
用因果图理清条件之间的关系
适合复杂业务规则会员券不是三个独立开关
商城规定:只有会员、订单金额达到 100 元并且优惠券有效时,才能抵扣 20 元。三个原因共同决定一个结果,任何一个条件不满足,都不能优惠。
先写原因和结果,再转换为判定表
| 编号 | 原因或结果 | 业务含义 |
|---|---|---|
| C1 | 用户是会员 | 决定是否具备会员券资格 |
| C2 | 订单金额 ≥ 100 元 | 决定是否达到使用门槛 |
| C3 | 优惠券有效 | 决定优惠券当前是否可用 |
| E1 | 优惠券抵扣 20 元 | C1 且 C2 且 C3 同时成立 |
| E2 | 提示不可用并保持原价 | 三个原因中至少一个不成立 |
因果图负责理清逻辑
- 与:多个条件必须同时成立。
- 或:满足任意条件即可触发。
- 非:某个条件不成立时触发。
- 互斥:两个条件不能同时出现。
- 依赖:一个条件成立前必须先满足另一个条件。
判定表负责落到用例
- 把原因放在条件行。
- 把结果放在动作行。
- 每一种有效组合形成一列规则。
- 合并结果相同且风险一致的组合。
- 为每列规则生成可执行用例。
用 Pairwise 缩减参数组合
组合多时先覆盖两两交互设备、支付方式、会员等级和优惠券状态全部组合会迅速膨胀。Pairwise 选择较少的用例,让任意两个参数值至少共同出现一次。
一组示意性的两两组合
| 用例 | 设备 | 支付方式 | 会员 | 优惠券 |
|---|---|---|---|---|
| 1 | PC | 微信 | 普通会员 | 不使用 |
| 2 | PC | 支付宝 | 银卡会员 | 有效券 |
| 3 | Android | 微信 | 银卡会员 | 不使用 |
| 4 | Android | 支付宝 | 普通会员 | 过期券 |
| 5 | iOS | 微信 | 普通会员 | 有效券 |
| 6 | iOS | 支付宝 | 银卡会员 | 过期券 |
适合使用
- 浏览器、设备和系统版本兼容。
- 支付渠道、会员等级和营销配置。
- 权限角色、资源类型和操作动作。
- 参数之间主要是低阶交互。
不能只靠 Pairwise
- 资金、库存等核心组合要单独保留。
- 三个条件共同触发的规则需要 3-wise 或判定表。
- 业务禁止的组合要先加约束。
- 边界、异常和状态问题仍需其他方法。
用分类树整理多维输入
先分维度,再选组合把会员积分抵扣拆成五个维度
面对一长串规则时,可以把测试对象放在树根,把身份、积分、金额、积分状态和支付结果作为分类,再为每个分类列出互不重复的类别。
会员积分抵扣分类表
| 分类 | 类别 | 选择原则 |
|---|---|---|
| 会员身份 | 普通会员、银卡会员 | 每类至少选择一种身份 |
| 积分余额 | 0、1~999、≥1000 | 覆盖不可用、部分抵扣和充足积分 |
| 订单金额 | <100、100~499.99、≥500 | 覆盖门槛和抵扣上限变化 |
| 积分状态 | 有效、冻结、过期 | 覆盖可以使用和不能使用 |
| 支付结果 | 成功、失败、超时 | 覆盖扣减、释放和结果未知 |
从树上组合一条用例
当银卡会员拥有 1000 积分、订单金额为 500 元、积分有效且支付成功时,系统按抵扣上限扣减积分,订单金额和剩余积分正确。
用错误推测补上经验中的风险
从历史缺陷出发记录来源、触发方式和验证证据
下单系统中值得主动猜测的错误
| 风险模式 | 主动尝试 | 重点检查 |
|---|---|---|
| 重复动作 | 快速双击提交、超时后重试 | 只生成一笔订单,只扣一次积分 |
| 金额精度 | 99.99 元、0.01 元抵扣、多优惠叠加 | 分摊金额和实付金额不出现负数或尾差 |
| 状态不同步 | 支付成功但回调延迟 | 订单与积分最终一致,可安全补偿 |
| 并发变化 | 提交前库存或积分被其他请求占用 | 重新校验并给出明确结果 |
| 权限绕过 | 替换订单 ID 或用户 ID | 不能查看或操作他人的订单和积分 |
经验从哪里来
- 同一模块的历史缺陷。
- 线上故障和用户投诉。
- 相似系统的常见问题。
- 代码变更、架构边界和第三方依赖。
- 开发与测试复盘中的薄弱环节。
怎样避免只靠感觉
- 为每个猜测写出风险来源。
- 说明失败后会影响谁和哪些数据。
- 转换成可以重复执行的用例。
- 记录命中率并更新风险清单。
- 不让经验替代基础规则覆盖。
用探索性测试边执行边学习
有目标地探索营销活动联调时,需求不会告诉你所有风险
当优惠券、积分、库存和支付服务首次组合上线时,可以围绕一个明确目标进行 45 分钟探索:尝试让订单金额、优惠状态和支付结果发生变化,观察系统是否保持一致。
支付异常时保持一致
45 分钟
变化数据与操作
证据与新风险
缺陷与回归用例
探索任务
验证支付结果不确定时,订单、库存、优惠券和积分能否最终一致。
重点变化
支付中断、重复回调、页面刷新、切换网络和再次提交。
带走证据
时间线、订单号、请求日志、状态快照、发现的问题和后续用例。
一份探索记录至少回答
- 本次探索目标和范围是什么。
- 实际尝试了哪些操作和数据。
- 发现了什么缺陷、疑问或新风险。
- 哪些区域没有覆盖,为什么。
- 哪些发现需要沉淀为回归用例。
用属性和模型验证更大的输入空间
检查始终成立的规则示例用例只能覆盖少量数据。面对金额计算和订单状态,可以先定义始终不能被破坏的规则,再由程序生成大量数据或操作序列进行验证。
金额始终守恒
商品金额 - 优惠 - 积分 + 运费 = 应付金额
取消分支只能从待支付进入
商城下单中可以验证的属性
| 属性 | 必须始终成立 | 验证方式 |
|---|---|---|
| 金额守恒 | 商品金额 - 优惠 - 积分抵扣 + 运费 = 应付金额 | 随机生成金额、优惠和积分组合后仍成立 |
| 不可为负 | 优惠、积分和退款不能让应付金额小于 0 | 大量极端组合下应付金额始终 ≥ 0 |
| 幂等 | 同一个业务请求重复执行,结果与执行一次相同 | 重复提交不会增加订单数或重复扣积分 |
| 状态合法 | 订单只能沿允许的方向迁移 | 已取消订单不能再支付,已完成订单不能回到待支付 |
| 归属不变 | 订单和积分只能被所属用户访问 | 任意替换资源 ID 都不能越权 |
属性测试
适合金额公式、排序、转换、幂等和数据约束。重点不是某个固定输入的答案,而是大量合法输入都应满足同一条规则。
模型驱动测试
适合订单、支付、退款等状态系统。先定义允许的状态和动作,再生成不同操作序列,检查系统是否偏离模型。
按风险组合方法,而不是选唯一答案
一项需求多种视角会员积分抵扣的组合方案
- 用分类树整理会员、积分、金额、状态和支付结果。
- 用等价类和边界值选择积分余额、订单金额与抵扣上限。
- 用因果图和判定表覆盖资格、门槛与状态组合。
- 用状态模型检查冻结、扣减、释放和退回。
- 用错误推测补充重复请求、精度和并发风险。
- 联调阶段用探索性测试发现未知问题。
停止增加用例前检查
- 每条业务规则都有对应验证。
- 核心边界和高风险组合已经覆盖。
- 失败后的数据变化和恢复已经覆盖。
- 历史高频缺陷有回归用例。
- 低风险重复组合已合理缩减。
- 剩余风险已明确记录。
方法选择没有固定顺序
规则清晰时,可以先从分类树和判定表开始;线上问题较多时,可以先从历史缺陷和探索性测试开始。顺序可以变化,但最终要回到需求、风险、用例和证据之间的对应关系。
完成一份可评审的方法地图
把选择理由交付出来练习:为会员积分抵扣设计测试
- 整理会员身份、积分余额、订单金额、积分状态和支付结果五个输入维度。
- 画出积分资格、抵扣门槛和支付结果之间的因果关系。
- 为设备、支付方式和会员等级生成一组 Pairwise 组合。
- 从历史缺陷中补充不少于 5 个错误推测用例。
- 写一份 45 分钟探索任务,说明目标、变化方式和证据。
- 定义金额守恒、幂等和状态合法三条属性。
- 按“当……时,……”格式产出不少于 15 条用例。
- 为每条用例标注方法来源、优先级和对应测试点。
问题已看清
- 输入维度已拆分
- 条件关系已说明
- 状态变化已画出
- 未知风险已记录
方法有依据
- 每种方法对应问题
- 高风险组合单独保留
- 约束与排除项明确
- 没有为了数量套方法
结果可评审
- 用例可以直接执行
- 测试点与用例对应
- 优先级理由明确
- 剩余风险已说明
你最终应该交付
掌握测试设计方法后,继续学习需求评审与测试方案,把风险识别转化为一次完整交付计划。
继续学习需求评审与测试方案