4、测试用例设计方法:等价类划分、边界值分析、因果图法、正交实验法
好,咱们进入正题。测试用例怎么设计?这是每个做嵌入式测试的人都要面对的问题。尤其是ABS这种安全关键系统,你不可能把所有输入组合都测一遍——时间不允许,成本也扛不住。那怎么办?
我个人的习惯是,先搞清楚被测对象的特点,再选合适的方法。说白了,没有银弹。今天这四种方法,是我在ABS项目里用得最多的。咱们一个一个聊。
4.1 等价类划分:把无穷变成有限
等价类划分,核心思想就一句话:把输入域分成若干「等价」的区间,每个区间里取一个代表值测试就够了。
为什么能这么干?因为同一个区间里的输入,程序处理逻辑是一样的。你测了其中一个,就等于测了全部。
举个例子,ABS系统的轮速传感器输入范围是0~300 km/h。那我们可以这样划分:
- 有效等价类:0 ~ 300 km/h(正常车速)
- 无效等价类:小于0(负值,物理上不可能)
- 无效等价类:大于300(超出传感器量程)
我在项目中遇到过一个问题:某次测试只覆盖了有效等价类,结果在实车路试时,轮速信号因为电磁干扰出现了负值,系统直接崩溃了。嗯,从那以后,我每次都会把无效等价类单独列出来,哪怕看起来再「不可能」。
4.2 边界值分析:Bug最爱藏在边界上
等价类划分的搭档,就是边界值分析。你想想看,程序里那些判断条件——if (speed >= 0 && speed <= 300)——最容易出问题的地方在哪?就是边界。
边界值分析的原则很简单:取每个等价类的边界值,以及边界两侧紧邻的值。一般取:最小值、略大于最小值、正常值、略小于最大值、最大值。
拿ABS的制动压力控制阀来说,它的PWM占空比范围是5%~95%。那我们要测哪些值?
| 测试点 | 取值 | 说明 |
|---|---|---|
| 下边界 | 5% | 最小允许值 |
| 下边界+1 | 6% | 紧邻下边界的有效值 |
| 上边界-1 | 94% | 紧邻上边界的有效值 |
| 上边界 | 95% | 最大允许值 |
| 下边界-1 | 4% | 无效值,预期应被钳位或报错 |
| 上边界+1 | 96% | 无效值,预期应被钳位或报错 |
4.3 因果图法:理清输入输出的逻辑关系
等价类和边界值,主要针对单个输入。但ABS系统里,很多功能是多个输入组合决定的。比如:
- 轮速差 > 阈值 且 制动踏板被踩下 → 触发ABS调节
- 轮速差 > 阈值 但 制动踏板未踩下 → 不触发
这种「多个条件决定一个结果」的场景,用因果图法最合适。
因果图法的步骤,我总结为四步:
- 列出原因(输入条件):比如「轮速差超限」「制动踏板信号有效」「车速大于10km/h」
- 列出结果(输出动作):比如「激活ABS调节」「点亮ABS故障灯」
- 画出因果关系:用与、或、非等逻辑门连接
- 生成决策表:把因果图转成表格,每一列就是一个测试用例
举个例子,ABS自检逻辑:
原因:
C1: 点火开关ON
C2: 系统供电正常
C3: 轮速传感器自检通过
结果:
E1: ABS系统进入待命状态
E2: 点亮ABS故障灯
逻辑关系:
E1 = C1 AND C2 AND C3
E2 = NOT (C1 AND C2 AND C3)
对应的决策表是这样的:
| 用例 | C1 | C2 | C3 | E1 | E2 |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 1 | 0 |
| 2 | 1 | 1 | 0 | 0 | 1 |
| 3 | 1 | 0 | 1 | 0 | 1 |
| 4 | 0 | 1 | 1 | 0 | 1 |
4.4 正交实验法:用最少的组合覆盖最多的场景
因果图法有个问题:如果输入条件太多,组合数会爆炸。比如ABS系统有6个输入条件,每个条件有2种取值,那组合数就是2^6=64种。如果每个条件有3种取值,那就是729种。测不完。
这时候正交实验法就派上用场了。它的核心思想是:用最少的实验次数,覆盖所有因素之间的两两组合。
我举个例子。假设ABS的某个功能受4个因素影响:
- A: 车速(低/中/高)
- B: 路面附着系数(低/高)
- C: 制动强度(轻/中/重)
- D: 载荷状态(空载/满载)
全部组合是3×2×3×2=36种。但用正交表L18(3^2 × 2^2),只需要18个测试用例,就能覆盖所有两两组合。
正交表长什么样?
| 用例 | A | B | C | D |
|---|---|---|---|---|
| 1 | 低 | 低 | 轻 | 空载 |
| 2 | 低 | 高 | 中 | 满载 |
| 3 | 中 | 低 | 重 | 满载 |
| ... | ... | ... | ... | ... |
4.5 四种方法怎么选?我的经验
最后说说我的选择策略:
- 单个输入参数 → 等价类 + 边界值。这是基础,每个项目必做。
- 多个输入有逻辑关系 → 因果图 + 决策表。适合功能逻辑复杂的模块。
- 多个输入无强逻辑关系,但组合太多 → 正交实验法。适合参数配置类测试。
- 安全关键功能 → 四种方法全上,再加基于模型的测试来兜底。
我曾经在一个ABS项目中,只用等价类和边界值就覆盖了80%的缺陷。但剩下的20%,全是组合逻辑导致的。从那以后,我再也不敢偷懒了——因果图和正交实验法,该用就得用。
好,这章就到这儿。下一章咱们聊聊「基于模型的测试用例生成」,那才是真正的大杀器。