3. 测试用例设计基础:等价类划分法、边界值分析法、因果图法在MIL中的应用

各位同学,咱们今天聊点实在的。做MIL测试,说白了就是要在模型跑起来之前,把能想到的坑都踩一遍。但问题来了——模型输入空间那么大,你不可能把所有情况都测一遍。那怎么办?

这时候就需要一些经典的方法论来帮忙了。等价类划分、边界值分析、因果图法,这三个东西在软件测试里是老面孔了。但在MIL里怎么用?我踩过不少坑,今天跟你好好聊聊。

3.1 等价类划分法:把无穷变成有限

等价类划分,核心思想就一句话:把输入域分成若干互不相交的子集,每个子集里选一个代表值来测。你想想看,如果一组输入对程序的行为影响是一样的,那测一个就够了,何必浪费时间测十个?

在MIL里,我习惯把等价类分成两类:

  • 有效等价类:符合需求规格的输入。比如车速信号,范围是0~200 km/h,那0~200之间的值就是有效的。
  • 无效等价类:不符合需求规格的输入。比如车速负值、超过200的值,或者干脆是NaN。

举个例子,假设你有一个MIL模型,功能是计算制动压力。输入是制动踏板开度(0%~100%)。

等价类划分示例:

  • 有效等价类:0% ~ 100%(正常开度范围)
  • 无效等价类1:小于0%(比如-5%)
  • 无效等价类2:大于100%(比如120%)
  • 无效等价类3:非数值(比如NaN、Inf)

我在项目中遇到过一件事。有个同事把有效等价类只分了一个区间,结果模型在开度接近0%时表现正常,但在开度接近100%时却出现了数值溢出。为什么?因为等价类划分只保证了“类内等价”,但边界附近的行为往往不一样。这就引出了下一个方法。

3.2 边界值分析法:魔鬼在细节里

边界值分析,说白了就是盯着输入域的边界使劲测。为什么?因为程序出bug,十有八九都在边界上。我自己的经验是,边界值分析能发现等价类划分漏掉的80%的bug

在MIL里,边界值分析通常和等价类划分搭配使用。做法是:在每个等价类的边界上,取最小值、最大值、略小于最小值、略大于最大值这几个点来测。

还是拿制动踏板开度举例:

边界类型 测试值 说明
下边界 0% 最小值
略低于下边界 -0.1% 无效等价类边界
上边界 100% 最大值
略高于上边界 100.1% 无效等价类边界
内点 50% 有效等价类内部

我的小技巧:在MIL里,边界值不光要看输入,还要看输出。比如模型输出的制动压力,它的边界值也要测。我曾经因为只测了输入边界,漏掉了输出饱和时的bug,后来被测试经理追着问了一下午……

3.3 因果图法:理清逻辑关系

等价类和边界值主要处理的是单个输入。但MIL模型里,很多功能是多个输入共同决定的。比如一个安全气囊的点火逻辑,需要同时满足车速、加速度、乘员状态等多个条件。这时候,因果图法就派上用场了。

因果图法的步骤,我总结为四步:

  1. 识别原因(输入条件):比如车速>30 km/h、加速度>5g、乘员在位。
  2. 识别结果(输出动作):比如点火、不点火。
  3. 画出因果图:用逻辑门(与、或、非)把原因和结果连起来。
  4. 生成决策表:把因果图转成表格,每一列就是一个测试用例。

举个例子,一个简单的MIL模型:如果车速大于30且加速度大于5,则触发紧急制动

因果图是这样的:

原因:
  C1: 车速 > 30 km/h
  C2: 加速度 > 5 m/s²

结果:
  E1: 触发紧急制动

逻辑关系:
  E1 = C1 AND C2

对应的决策表:

测试用例 C1(车速>30) C2(加速度>5) E1(触发紧急制动)
1
2
3
4

注意:因果图法在MIL里有个坑——模型的逻辑可能不是纯组合逻辑,还有时序逻辑。比如“加速度大于5持续100ms以上才触发”。这时候因果图只能覆盖组合部分,时序部分得靠状态机测试来补。我刚开始用因果图时,就因为这个吃了亏。

3.4 三种方法如何搭配使用?

这三种方法不是孤立的。我个人习惯的流程是这样的:

  1. 先用因果图法:理清输入输出之间的逻辑关系,生成决策表。这一步能保证逻辑覆盖。
  2. 再用等价类划分:对每个输入条件,划分有效和无效等价类。这一步能减少冗余测试。
  3. 最后用边界值分析:在等价类的基础上,补充边界测试。这一步能抓住最容易出bug的地方。

举个例子,还是那个紧急制动模型。因果图已经给出了4个测试用例。但每个用例里的具体数值怎么定?用等价类和边界值来定。

比如C1(车速>30),等价类划分:

  • 有效:30~200 km/h
  • 无效:<30 km/h、>200 km/h

边界值:30、30.1、29.9、200、200.1

这样组合下来,测试用例就从4个变成了几十个。但别怕,MIL测试是自动化的,你只需要把测试向量写清楚,剩下的交给工具跑。

总结一下:

  • 等价类划分:把无穷输入变成有限类,减少测试量。
  • 边界值分析:盯着边界测,抓住80%的bug。
  • 因果图法:理清逻辑关系,保证功能覆盖。
  • 三者搭配:因果图定结构,等价类定范围,边界值定精度。

嗯,今天就聊到这儿。这三种方法看着简单,但真正用好,得靠项目里一点点积累。你下次做MIL测试时,不妨试试这个流程。有什么问题,咱们下节课接着聊。