4、测试用例设计方法(下):判定表驱动法、正交实验法、场景法、错误推测法
好,咱们接着聊。上一节我们把等价类和边界值讲透了,这两个方法虽然基础,但说实话,覆盖不了所有场景。你想想看,有时候输入条件之间是互相影响的,一个条件成立与否,直接决定了另一个条件要不要测。这时候,就得请出我们今天的主角们了。
4.1 判定表驱动法:逻辑组合的照妖镜
判定表这玩意儿,说白了就是用来处理「多个条件组合」的。我刚开始带项目时,有个同事写了个登录模块,测试时发现密码错误和账号锁定两个状态同时出现时,系统直接崩溃了。为什么?因为开发只考虑了单一条件,没做组合测试。
判定表的核心结构很简单:
- 条件桩:列出所有可能的输入条件
- 动作桩:列出所有可能的输出结果
- 条件项:每个条件的具体取值(真/假)
- 动作项:对应条件组合下的输出
举个例子,一个简单的登录校验:
| 条件 | 规则1 | 规则2 | 规则3 | 规则4 |
|---|---|---|---|---|
| 用户名正确? | Y | Y | N | N |
| 密码正确? | Y | N | Y | N |
| 登录成功 | ✓ | |||
| 提示密码错误 | ✓ | |||
| 提示用户不存在 | ✓ | ✓ |
你看,4种组合,一目了然。我曾经在一个支付系统里用过判定表,条件有「余额充足」「风控通过」「商户状态正常」三个,组合出来8种情况。结果发现有一种组合(余额不足+风控通过+商户异常)开发根本没处理,直接抛了500错误。这就是判定表的威力——把逻辑漏洞照得清清楚楚。
4.2 正交实验法:用最少的用例覆盖最多的组合
判定表虽好,但条件一多就扛不住了。比如你有6个条件,每个条件2个取值,那就是2^6=64种组合。真要全测,时间成本扛不住。这时候正交实验法就派上用场了。
正交实验法的核心思想是:用最少的用例,覆盖最广的组合。它基于一个数学原理——任意两个条件的组合,至少出现一次。
我习惯用L9(3^4)这种符号来表示:
- L:正交表
- 9:需要执行的测试用例数
- 3:每个条件的取值个数
- 4:最多支持的条件数
举个例子,一个搜索功能有3个条件:
- 搜索类型:精确、模糊
- 排序方式:时间、热度、相关度
- 结果数量:10条、20条
全组合是2×3×2=12种。用正交表,我选L4(2^3)就够了:
| 用例 | 搜索类型 | 排序方式 | 结果数量 |
|---|---|---|---|
| 1 | 精确 | 时间 | 10 |
| 2 | 精确 | 热度 | 20 |
| 3 | 模糊 | 时间 | 20 |
| 4 | 模糊 | 热度 | 10 |
你看,4个用例就覆盖了所有两两组合。排序方式「相关度」没出现?嗯,这里要注意,正交表不是100%覆盖所有组合,它只保证两两组合。如果你的业务要求必须覆盖某个特定组合,那就得额外加用例。
4.3 场景法:从用户视角出发
前面几种方法,都是从「输入条件」出发。但有时候,用户的操作流程才是关键。场景法就是干这个的——模拟用户真实的使用路径。
场景法分两种:
- 基本流:用户最常用的、最顺利的路径
- 备选流:各种异常、分支、中断的情况
拿网购下单来说:
- 基本流:选商品→加购物车→结算→支付→完成
- 备选流1:购物车为空时点击结算
- 备选流2:支付时余额不足
- 备选流3:支付过程中取消订单
- 备选流4:库存不足时下单
我一般画场景法时,会先画一个流程图。把基本流画成一条直线,备选流像树枝一样分出去。然后每个分支写一个测试用例。这样做的好处是——你永远不会漏掉用户的操作路径。
我记得有一次测一个银行转账功能,基本流很顺畅。但备选流里有个「转账途中账户被冻结」的场景,开发没处理,结果用户转账到一半,钱扣了但对方没收到。这就是场景法的价值——它逼着你去想「如果用户不按套路出牌怎么办」。
4.4 错误推测法:靠经验吃饭
这个方法,说白了就是「猜」。但猜得有依据,不是瞎猜。错误推测法依赖的是测试人员的经验积累——你知道哪些地方容易出问题,就重点测哪里。
常见的错误推测方向:
- 边界值附近:比如输入框最大长度、数值的0值
- 空值/空字符串:很多系统对空值处理不当
- 特殊字符:SQL注入、XSS攻击的常见入口
- 并发操作:同时点击、快速双击
- 数据一致性:修改后刷新、删除后查询
我曾经测过一个文件上传功能,大家都测了正常上传、大文件上传、格式错误上传。但我凭经验推测——如果上传过程中网络断了会怎样?一试,果然,文件只上传了一半,系统显示上传成功,但实际文件损坏了。这就是错误推测法的价值——它不靠公式,靠的是你对系统的理解。
我个人的习惯是,每次测试一个新系统,先花半小时做错误推测。把最容易出问题的点列出来,优先测。等这些点都过了,再去做系统性的测试。这样效率最高。
好了,这四种方法讲完了。你可能会问,实际项目中到底用哪个?我的建议是:判定表用于逻辑组合,正交表用于参数组合,场景法用于流程测试,错误推测法用于查漏补缺。没有哪个方法能包打天下,组合使用才是王道。