第三章 测试用例设计方法:等价类划分、边界值分析、因果图法、正交实验法,以及场景法在整机测试中的应用
整机测试和单元测试最大的区别在哪?我个人觉得,是「组合爆炸」的问题。你测一个电源模块,输入电压、负载电流、温度,三个参数一组合,测试用例数量就奔着几百上千去了。全测?时间不够。不测?心里没底。
所以,测试用例设计方法,说白了就是教你用最少的用例,覆盖最多的风险。我做了十几年整机测试,踩过不少坑,今天把这五种方法掰开揉碎了讲给你听。
3.1 等价类划分:把无穷变成有限
等价类划分的核心思想很简单:把输入数据分成若干「类」,每一类里挑一个代表测就行了。为什么?因为同一类里的数据,程序处理逻辑是一样的。
举个例子,一个温度监控模块,要求输入范围是 -20°C 到 85°C。你想想看,你测了 -10°C 和 -5°C,结果会不一样吗?大概率不会。所以我们可以这样划分:
| 等价类 | 范围 | 示例值 |
|---|---|---|
| 有效等价类 | -20 ~ 85 | 0, 25, 80 |
| 无效等价类(下限) | < -20 | -30, -100 |
| 无效等价类(上限) | > 85 | 90, 120 |
3.2 边界值分析:Bug 最喜欢待的地方
为什么边界值分析这么重要?因为程序员写代码时,最容易在「边界」上犯错。比如判断条件写成 if (temp >= -20) 还是 if (temp > -20),差一个等号,结果天差地别。
边界值分析的原则是:取每个等价类的边界值,以及边界两侧的值。还是温度的例子:
- 下限边界:-20, -21, -19
- 上限边界:85, 84, 86
- 内部边界:0(如果有特殊逻辑)
if (baud == 9600) 的特殊处理分支,但我的测试只覆盖了边界值,没覆盖「边界上的特殊值」。所以,边界值分析要结合等价类划分一起用,别孤立使用。
3.3 因果图法:理清逻辑关系
因果图法适合处理「条件组合」导致的输出变化。比如一个设备有多个传感器,只有当温度过高 且 湿度也过高时,才触发报警。这种逻辑关系,用因果图一画就清楚了。
步骤很简单:
- 列出所有输入条件(因)
- 列出所有输出结果(果)
- 画出因果关系图
- 根据图生成决策表
- 从决策表导出测试用例
举个例子,一个电源管理模块:
- 因 A:输入电压 > 5V
- 因 B:温度 > 60°C
- 果 X:启动过压保护
- 果 Y:启动过温保护
- 果 Z:正常输出
逻辑关系:如果 A 成立,则 X 成立;如果 B 成立,则 Y 成立;如果 A 和 B 都不成立,则 Z 成立。
嗯,这里要注意:因果图法容易画得复杂。我个人的习惯是,先画草图,再用决策表来验证逻辑是否完整。别在画图上花太多时间,重点是理清逻辑。
3.4 正交实验法:用最少的组合覆盖最多的因素
正交实验法是我在整机测试中最常用的方法。为什么?因为整机测试涉及的因素太多了:电压、温度、负载、通信速率、固件版本……全组合测试根本不可能。
正交实验法的核心是:用正交表来安排实验,保证任意两个因素的不同水平都能被覆盖到一次。比如 3 个因素,每个因素 2 个水平,全组合需要 8 个用例,正交表只需要 4 个。
| 用例 | 电压 | 温度 | 负载 |
|---|---|---|---|
| 1 | 5V | 25°C | 轻载 |
| 2 | 5V | 60°C | 重载 |
| 3 | 12V | 25°C | 重载 |
| 4 | 12V | 60°C | 轻载 |
3.5 场景法:从用户视角出发
前面四种方法,都是从「输入-输出」的角度设计用例。但整机测试最终要回答的问题是:用户用起来会不会出问题?这就是场景法的价值。
场景法基于「事件流」的概念。一个典型场景包括:
- 正常流程:用户按预期操作,系统正常响应
- 备选流程:用户操作有变化,系统仍能正确处理
- 异常流程:用户操作错误或系统异常,系统有合理的处理
举个例子,一个智能门锁的整机测试场景:
- 正常场景:用户输入正确密码 → 门锁打开 → 用户进门 → 门自动上锁
- 备选场景:用户输入错误密码 → 提示重新输入 → 连续错误 3 次 → 锁定 30 秒
- 异常场景:用户输入密码时断电 → 恢复供电后 → 门锁状态保持锁定
我建议,场景法最好和等价类划分、边界值分析结合起来用。比如,在「连续错误 3 次」这个场景里,边界值就是 2 次、3 次、4 次。你想想看,如果只测了 3 次,没测 2 次和 4 次,万一代码写的是 if (count >= 3) 还是 if (count > 3),结果完全不一样。
3.6 五种方法的综合应用
在实际项目中,我不会只用一种方法。我的习惯是:
- 先用场景法梳理出核心业务流程
- 对每个场景中的输入参数,用等价类划分和边界值分析细化
- 如果参数之间有逻辑关系,用因果图法理清
- 如果参数多且独立,用正交实验法减少用例数量
下面这张图是我自己总结的整机测试用例设计流程,你可以参考一下:
最后说一句:测试用例设计不是一次性的工作。整机测试过程中,你会发现新的风险点,这时候要回头补充用例。我自己的习惯是,每轮测试结束后,花 30 分钟复盘:哪些 Bug 没被现有用例覆盖?为什么?然后更新用例库。这样,下一轮测试就会越来越轻松。
公众号:蓝海资料掘金营,微信deep3321