测试用例设计方法论:等价类划分、边界值分析、因果图法、正交实验法
各位好,我是老周。今天咱们聊聊测试用例设计的方法论。说实话,我刚入行那会儿,写测试用例全靠拍脑袋——想到哪写到哪。结果呢?要么漏测,要么重复测,效率低得可怜。后来带团队了,才真正体会到:没有方法论的测试,就是在赌运气。
这一章,我把最常用的四种方法掰开揉碎了讲。你想想看,搞硬件调试,最怕什么?怕测不全,怕测不准。这四种方法,就是帮你把「测全」和「测准」落到实处的工具。
一、等价类划分:把无穷变成有限
先问个问题:一个 8 位 ADC,输入电压范围 0~5V,你要测多少个点?理论上无穷多个。但实际测试中,我们只能选有限个点。怎么选?等价类划分就是干这个的。
核心思想:把输入域分成若干「等价类」,每个类里的任意一个值,对测试结果来说都是等价的。你只需要从每个类里取一个代表值就够了。
关键概念:
- 有效等价类:符合规格要求、程序应正常处理的输入
- 无效等价类
我在项目中遇到过一件事:一个温度传感器模块,规格说工作温度 -40°C ~ +85°C。测试员只测了 0°C、25°C、50°C 三个点,全是有效等价类。结果呢?产品在 -20°C 环境下直接罢工了。为什么?因为没测无效等价类——低于 -40°C 和高于 +85°C 的情况根本没覆盖到。
划分原则:
- 按输入条件分组,每组一个等价类
- 每个等价类至少覆盖一个测试用例
- 有效和无效等价类都要覆盖
我的习惯:先列所有输入条件,再给每个条件画一个「有效/无效」的表格。这样一眼就能看出有没有漏掉无效类。别小看这一步,很多线上事故都是无效类没覆盖导致的。
二、边界值分析:Bug 最爱扎堆的地方
等价类划分解决了「测哪些值」的问题,但有个坑——它忽略了边界。经验告诉我,80% 的 Bug 都集中在边界附近。为什么?因为开发写代码时,最容易在边界条件上犯糊涂。
边界值分析就是专门对付这个的。它不测等价类内部的「普通值」,专测边界上的「特殊值」。
基本规则:
- 取边界值本身
- 取边界值左侧紧邻的值
- 取边界值右侧紧邻的值
举个例子:一个寄存器,取值范围 0~255。边界值要测哪些?
| 边界类型 | 测试值 | 说明 |
|---|---|---|
| 下边界 | 0, 1 | 最小值及右侧邻值 |
| 上边界 | 254, 255 | 最大值及左侧邻值 |
| 无效下边界 | -1 | 低于最小值 |
| 无效上边界 | 256 | 高于最大值 |
我曾经踩过的坑:有一次测 SPI 通信的时钟分频系数,规格说分频值范围 2~256。我按边界值测了 2、3、255、256,全过了。结果量产时发现,分频值设为 1 时芯片直接死机。为什么?因为开发在代码里写的是 if (divider < 2) divider = 2;,但没处理 divider == 1 这个边界。记住:边界值分析一定要包含「刚好越过边界」的那个值。
三、因果图法:理清复杂逻辑
前面两种方法适合处理「单个输入」的场景。但硬件系统里,很多功能是多个条件组合触发的。比如:只有「使能信号为高」且「时钟存在」且「复位已完成」,输出才有效。这种多条件逻辑,用等价类和边界值就不好使了。
因果图法就是专门对付这种「多条件组合」的。它把输入条件看作「因」,输出结果看作「果」,然后用逻辑图把因果关系画出来。
基本步骤:
- 列出所有输入条件(因)
- 列出所有输出结果(果)
- 画出因果关系图(与、或、非、异或等逻辑门)
- 根据因果图生成决策表
- 从决策表导出测试用例
我举个例子:一个电源管理芯片,有过压保护和欠压锁定两个功能。输入条件是 VIN 电压值,输出结果是「正常工作」「过压保护」「欠压锁定」三种状态。因果图画出来是这样的:
画完因果图,下一步就是生成决策表。决策表把每个「因」的组合都列出来,然后看对应的「果」是什么。这样就不会漏掉任何组合。
我个人习惯:因果图法别画太复杂。如果输入条件超过 6 个,组合数会爆炸。这时候我一般先做等价类划分,把输入条件精简到 4~5 个,再用因果图。说白了,因果图是「精雕细琢」的工具,不是「大而全」的工具。
四、正交实验法:用最少的组合覆盖最多的场景
因果图法有个硬伤:条件一多,组合数就失控。比如 5 个条件,每个条件 2 种取值,全组合就是 2⁵ = 32 种。如果每个条件 3 种取值,3⁵ = 243 种。测不完,根本测不完。
正交实验法就是来解决这个问题的。它用一套数学工具,从海量组合中挑出「最有代表性」的那几个组合,用最少的测试用例覆盖最多的场景。
核心概念:
- 因子:输入条件
- 水平:每个因子的取值个数
- 正交表:一种特殊设计的表格,任意两列的组合是均匀分布的
举个例子:一个 I²C 接口,要测 4 个因子——时钟频率、上拉电阻、总线电容、从机地址。每个因子有 2 个水平。全组合要 16 种,但用正交表 L₈(2⁷) 只需要 8 种。
| 测试用例 | 时钟频率 | 上拉电阻 | 总线电容 | 从机地址 |
|---|---|---|---|---|
| 1 | 100kHz | 4.7kΩ | 50pF | 0x50 |
| 2 | 100kHz | 4.7kΩ | 200pF | 0x51 |
| 3 | 100kHz | 10kΩ | 50pF | 0x51 |
| 4 | 100kHz | 10kΩ | 200pF | 0x50 |
| 5 | 400kHz | 4.7kΩ | 50pF | 0x51 |
| 6 | 400kHz | 4.7kΩ | 200pF | 0x50 |
| 7 | 400kHz | 10kΩ | 50pF | 0x50 |
| 8 | 400kHz | 10kΩ | 200pF | 0x51 |
你看,8 个用例覆盖了所有因子的所有水平组合,而且任意两个因子的组合都出现了两次。这就是正交实验法的厉害之处——用 50% 的用例覆盖 90% 以上的组合场景。
我曾经犯过的错:有一次做 DDR 接口的信号完整性测试,因子有 6 个,每个 3 个水平。我图省事,直接用了正交表。结果测完发现,有一组「高频 + 长走线 + 弱驱动」的组合没覆盖到,偏偏这个组合在量产时出了问题。后来我学乖了:正交实验法适合「筛选性测试」,不适合「验证性测试」。关键场景、高风险组合,该全测还是得全测。
五、四种方法的选型指南
说了这么多,你可能会问:到底什么时候用哪种方法?我整理了一张表,方便你对照着选:
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 等价类划分 | 单个输入、连续值范围 | 简单高效,覆盖全面 | 不处理边界,不处理组合 |
| 边界值分析 | 有明确边界的输入 | 精准打击 Bug 高发区 | 只关注边界,忽略内部 |
| 因果图法 | 多条件逻辑组合 | 逻辑清晰,不漏组合 | 条件多时组合爆炸 |
| 正交实验法 | 多因子、多水平筛选 | 用例少,覆盖广 | 可能漏掉关键组合 |
实际项目中,我很少只用一种方法。通常是:先用等价类划分确定「测哪些值」,再用边界值分析补充「边界上的值」,如果涉及多条件逻辑,用因果图法梳理「组合关系」,最后用正交实验法「压缩用例数量」。四种方法配合使用,效果最好。
我的经验总结:
- 等价类划分是「地基」,每个项目必用
- 边界值分析是「标配」,尤其是寄存器、ADC、DAC 这类有明确边界的模块
- 因果图法是「手术刀」,只在逻辑复杂时用,别滥用
- 正交实验法是「加速器」,因子多、时间紧的时候用,但别忘了补测高风险组合