3、测试用例设计基础:等价类划分、边界值分析、因果图法
做MIL测试这么多年,我见过太多人一上来就闷头写用例。结果呢?要么测了半天没覆盖到关键点,要么用例数量爆炸,跑都跑不完。说白了,测试用例设计不是拍脑袋,是有章法的。
今天咱们就聊聊三个最基础、也最实用的方法:等价类划分、边界值分析、因果图法。这三个方法,我几乎每个项目都会用到。
3.1 等价类划分:把无穷变成有限
先问个问题:一个输入范围是0到100的整数,你要测多少个值才能放心?理论上,101个。但实际项目中,你不可能这么干。
等价类划分的思路很简单:把输入域分成若干「等价类」,每个类里挑一个代表测就行了。因为同一个类里的值,程序处理逻辑是一样的。
举个例子,我之前做过一个电池SOC(荷电状态)的模型。输入范围是0%到100%。
- 有效等价类:0 ≤ SOC ≤ 100(正常范围)
- 无效等价类:SOC < 0(低于下限)
- 无效等价类:SOC > 100(高于上限)
每个类里挑一个值,比如0、50、-5、120,四个用例就覆盖了全部逻辑。效率提升不是一点半点。
3.2 边界值分析:bug最喜欢待的地方
等价类划分解决了「测哪些值」的问题,但有个坑——边界附近最容易出bug。为什么?因为开发写代码时,边界条件最容易写错。比如 if (x >= 0) 写成 if (x > 0),差一个等号,天差地别。
边界值分析就是专门对付这个的。它要求我们不仅测等价类里的值,还要测边界上的值。
还是那个SOC的例子,范围0到100。边界值要测哪些?
- 最小值:0
- 略大于最小值:1
- 略小于最小值:-1(无效)
- 最大值:100
- 略小于最大值:99
- 略大于最大值:101(无效)
你看,从6个边界值就能发现很多隐藏问题。我个人习惯是:等价类划分打底,边界值分析补刀。两者结合,覆盖率就上去了。
3.3 因果图法:理清复杂逻辑
等价类和边界值主要针对单个输入。但实际模型里,多个输入之间往往有复杂的逻辑关系。这时候,因果图法就派上用场了。
因果图法的思路是:先列出所有输入条件(因),再列出所有输出结果(果),然后画出它们之间的逻辑关系图。最后根据图来设计测试用例。
举个例子,一个简单的电池保护逻辑:
- 输入条件(因):
- C1:电池温度 > 60°C
- C2:电池电流 > 200A
- C3:SOC < 10%
- 输出结果(果):
- E1:触发过温保护
- E2:触发过流保护
- E3:触发欠压保护
逻辑关系是:C1导致E1,C2导致E2,C3导致E3。但实际项目中,这些条件可能组合出现,比如同时过温和过流。因果图就能帮你理清这些组合。
下面是我画的一个简单因果图,你看一眼就明白了:
画完因果图后,就可以设计测试用例了。每个「因」的组合都要覆盖到。比如:
| 用例编号 | C1 | C2 | C3 | 预期结果 |
|---|---|---|---|---|
| TC-01 | 1 | 0 | 0 | E1触发 |
| TC-02 | 0 | 1 | 0 | E2触发 |
| TC-03 | 0 | 0 | 1 | E3触发 |
| TC-04 | 1 | 1 | 0 | E1和E2同时触发 |
| TC-05 | 0 | 0 | 0 | 无保护触发 |
3.4 三种方法的配合使用
这三种方法不是孤立的。我一般这样用:
- 先用等价类划分:把每个输入的范围搞清楚,分出有效和无效类。
- 再用边界值分析:在等价类的基础上,补充边界附近的测试点。
- 最后用因果图法:处理多个输入之间的逻辑关系,确保组合场景也覆盖到。
举个例子,一个电机转速控制模型:
- 输入:目标转速(0-10000 rpm)、油门开度(0-100%)、刹车信号(0或1)
- 输出:实际转速、故障码
等价类划分:目标转速分0-5000、5001-10000两个有效类,再加负值和大于10000的无效类。油门开度类似。
边界值分析:目标转速的边界是0、1、9999、10000、-1、10001。油门开度的边界是0、1、99、100、-1、101。
因果图法:刹车信号为1时,无论目标转速和油门开度如何,实际转速必须为0。这就是一个典型的逻辑关系。
你看,三种方法一结合,测试用例既全面又高效。嗯,这就是我多年项目里总结出来的套路。
好了,测试用例设计的基础就这些。记住:等价类划分管范围,边界值分析管边界,因果图法管逻辑。三者配合,你的MIL测试覆盖率绝对差不了。