4、测试用例设计方法:等价类划分法、边界值分析法、因果图法在MIL中的应用
各位工程师朋友,大家好。今天我们聊聊测试用例设计。
做MIL测试,说白了就是跟模型打交道。模型跑得对不对,全靠用例来验证。我见过不少团队,模型搭得漂漂亮亮,一跑测试就露馅——要么用例太少,要么用例太偏。嗯,这里的关键,就是测试用例设计方法。
我个人习惯,在MIL阶段至少用三种方法:等价类划分、边界值分析、因果图法。今天就把它们掰开揉碎了讲清楚。
4.1 等价类划分法:把无穷变成有限
先问个问题:一个输入信号范围是0到100,你要测多少个点?
理论上无穷多个。但实际测试中,我们只能选有限个。怎么选?等价类划分就是干这个的。
核心思想:把输入域分成若干等价类,每个类里选一个代表值。如果这个代表值能通过,那整个类里的值大概率都能通过。
举个例子:车速信号,范围0~200 km/h。
- 有效等价类:0 ≤ 车速 ≤ 200(正常范围)
- 无效等价类:车速 < 0(负值)
- 无效等价类:车速 > 200(超范围)
我在项目中遇到过一件事:有个同事把车速范围设成0~200,但只测了50、100、150三个点。结果模型里有个逻辑是“车速>200时报警”,他根本没测到。后来实车测试时,车速表一超200就报错,吓得驾驶员一跳。你看,无效等价类没覆盖,坑就来了。
MIL中的操作建议:
- 每个输入信号至少取3个值:一个有效类、两个无效类(上下边界外)
- 如果信号有多个分段(比如0~50、50~100、100~200),每个分段都要取代表值
- 别忘了枚举型信号——每个枚举值都是一个等价类
小技巧:在Simulink里,可以用Test Sequence模块的“assert”语句快速验证等价类。比如:
assert(speed >= 0 && speed <= 200, '车速超出范围');
这样跑一次测试,所有等价类都能自动检查。
4.2 边界值分析法:Bug最爱藏在边界上
等价类划分解决了“选哪些值”的问题,但还不够。为什么?因为软件里的Bug,十有八九都藏在边界上。
你想想看:一个条件判断是“if (x >= 10)”,那x=9.999和x=10.001,结果天差地别。边界值分析法,就是专门抓这种“差一点”的Bug。
基本原则:取边界值、边界值-1、边界值+1。
还是车速的例子:范围0~200,边界值有0和200。
- 上点:0, 200
- 离点:-1, 1, 199, 201
- 内点:100(可选)
一共6个测试点,比等价类多了3个,但覆盖率提升一大截。
我记得有一次做ACC(自适应巡航)的MIL测试。模型里有个逻辑:当车速低于30 km/h时,自动退出巡航。我按边界值法测了29.9、30.0、30.1。结果发现,车速正好30.0时,模型有时退出、有时不退出——原来是浮点数精度问题。如果我只测30和31,这个Bug根本抓不到。
避坑指南:我曾经在测试一个温度传感器模型时,边界值取了-40、-39、85、86。结果模型在-39.5时直接崩溃。为什么?因为模型内部用了int8类型,-39.5被截断成-39,但逻辑判断用的是float。边界值分析时,一定要考虑数据类型和精度。
MIL中的操作建议:
- 每个边界至少测3个点:边界值、边界值-ε、边界值+ε
- 如果边界是整数,ε取1;如果是浮点数,ε取最小精度(比如0.1或0.01)
- 别忘了“开区间”和“闭区间”的区别——这直接影响边界值的选取
4.3 因果图法:理清逻辑关系
等价类和边界值,主要针对单个输入。但实际模型里,多个输入之间往往有复杂的逻辑关系。比如:
- “刹车踏板踩下 && 车速 > 0” → 制动灯亮
- “车门未关 || 安全带未系” → 报警
这种多输入、多输出的场景,因果图法就派上用场了。
核心步骤:
- 列出原因(输入)和结果(输出)
- 画出因果关系图(用与、或、非等逻辑门)
- 根据因果图生成决策表
- 从决策表导出测试用例
举个例子:一个简单的“车门报警”模型。
原因:
- C1:驾驶员车门未关
- C2:乘客车门未关
- C3:车速 > 5 km/h
结果:
- E1:报警灯亮
- E2:蜂鸣器响
逻辑关系:
- E1 = C1 OR C2(任一车门未关就报警)
- E2 = (C1 OR C2) AND C3(车速超过5且车门未关才响蜂鸣器)
根据这个因果图,我们可以生成决策表:
| 用例 | C1 | C2 | C3 | E1 | E2 |
|---|---|---|---|---|---|
| 1 | 0 | 0 | 0 | 0 | 0 |
| 2 | 1 | 0 | 0 | 1 | 0 |
| 3 | 0 | 1 | 0 | 1 | 0 |
| 4 | 1 | 1 | 0 | 1 | 0 |
| 5 | 0 | 0 | 1 | 0 | 0 |
| 6 | 1 | 0 | 1 | 1 | 1 |
| 7 | 0 | 1 | 1 | 1 | 1 |
| 8 | 1 | 1 | 1 | 1 | 1 |
你看,3个输入,理论上2³=8种组合。因果图法帮我们理清了逻辑,直接生成8个测试用例,一个不漏。
个人经验:我建议在MIL测试中,因果图法不要画得太复杂。如果输入超过5个,组合数会爆炸。这时候可以先用等价类把输入分组,再对每组画因果图。比如上面的例子,C1和C2可以合并成“任一车门未关”,这样输入就从3个降为2个。
4.4 三种方法的组合应用
实际项目中,这三种方法不是孤立的。我一般这样用:
- 先用因果图法:理清输入输出的逻辑关系,生成决策表
- 再用等价类划分:对每个输入信号,确定有效类和无效类
- 最后用边界值分析:对每个等价类的边界,补充测试点
举个例子:一个“制动灯控制”模型。
- 因果图法:确定“制动踏板 && 车速 > 0” → 制动灯亮
- 等价类划分:车速分为“≤0”和“>0”两个等价类
- 边界值分析:车速边界取-0.1、0、0.1
这样组合下来,测试用例既全面又高效。
注意:我曾经在一个项目中,只用了等价类划分,没做边界值分析。结果模型在车速=0时,制动灯偶尔闪一下——因为浮点数比较时,0.0和-0.0被当成不同值。从那以后,我每次做MIL测试,边界值分析必做。
4.5 总结
好了,今天的内容就到这里。总结一下:
- 等价类划分:解决“测哪些值”的问题,把无穷输入变成有限测试点
- 边界值分析:解决“边界容易出错”的问题,专门抓边界Bug
- 因果图法:解决“多输入逻辑关系”的问题,生成完整的组合测试
这三种方法,是MIL测试的三大法宝。你想想看,如果每个模型都能用这三种方法设计用例,那测试覆盖率至少能到90%以上。剩下的10%,靠随机测试和场景测试来补。
下一章,我们会讲“测试用例的自动化生成与执行”。到时候,我会分享一些用MATLAB脚本自动生成测试用例的技巧。敬请期待。
课后思考:
- 你的模型里,有没有那种“多输入、多输出”的逻辑?试着画一张因果图看看。
- 找一个你最近测过的模型,用边界值分析法重新设计用例,看看能不能发现新Bug。