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” → 制动灯亮
  • “车门未关 || 安全带未系” → 报警

这种多输入、多输出的场景,因果图法就派上用场了。

核心步骤

  1. 列出原因(输入)和结果(输出)
  2. 画出因果关系图(用与、或、非等逻辑门)
  3. 根据因果图生成决策表
  4. 从决策表导出测试用例

举个例子:一个简单的“车门报警”模型。

原因

  • 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 三种方法的组合应用

实际项目中,这三种方法不是孤立的。我一般这样用:

  1. 先用因果图法:理清输入输出的逻辑关系,生成决策表
  2. 再用等价类划分:对每个输入信号,确定有效类和无效类
  3. 最后用边界值分析:对每个等价类的边界,补充测试点

举个例子:一个“制动灯控制”模型。

  • 因果图法:确定“制动踏板 && 车速 > 0” → 制动灯亮
  • 等价类划分:车速分为“≤0”和“>0”两个等价类
  • 边界值分析:车速边界取-0.1、0、0.1

这样组合下来,测试用例既全面又高效。

注意:我曾经在一个项目中,只用了等价类划分,没做边界值分析。结果模型在车速=0时,制动灯偶尔闪一下——因为浮点数比较时,0.0和-0.0被当成不同值。从那以后,我每次做MIL测试,边界值分析必做。

4.5 总结

好了,今天的内容就到这里。总结一下:

  • 等价类划分:解决“测哪些值”的问题,把无穷输入变成有限测试点
  • 边界值分析:解决“边界容易出错”的问题,专门抓边界Bug
  • 因果图法:解决“多输入逻辑关系”的问题,生成完整的组合测试

这三种方法,是MIL测试的三大法宝。你想想看,如果每个模型都能用这三种方法设计用例,那测试覆盖率至少能到90%以上。剩下的10%,靠随机测试和场景测试来补。

下一章,我们会讲“测试用例的自动化生成与执行”。到时候,我会分享一些用MATLAB脚本自动生成测试用例的技巧。敬请期待。

课后思考

  • 你的模型里,有没有那种“多输入、多输出”的逻辑?试着画一张因果图看看。
  • 找一个你最近测过的模型,用边界值分析法重新设计用例,看看能不能发现新Bug。