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

做MIL测试这么多年,我见过太多工程师一上来就对着模型瞎点。点完发现覆盖率不够,又回头补用例。说白了,测试用例设计不是拍脑袋的事。它需要方法,需要套路。

今天聊的这四种方法,是我个人在MIL项目中最常用的。它们不是理论空谈,每一个我都踩过坑,也填过坑。

3.1 等价类划分法:别做无用功

等价类划分,说白了就是把输入域分成几个“同类”的区间。你只要从每个区间里挑一个值测试,就能代表整个区间。

为什么MIL里特别管用?

因为模型里的输入信号,很多都是连续值。比如车速0-300km/h,你不可能每个速度都测一遍。那得测到猴年马月去。

核心原则:

  • 有效等价类:符合需求规格的输入。比如车速0-300km/h,这个区间内的值都是有效的。
  • 无效等价类:不符合需求规格的输入。比如车速小于0,或者大于300。

我记得有一次,测试一个电池SOC(荷电状态)的估算模型。需求写的是SOC范围0%-100%。我偷懒,只测了50%这一个点。结果呢?模型在SOC接近0%时,估算误差突然变大。因为那个区间有个非线性补偿算法,我根本没覆盖到。

避坑指南:

我曾经犯过一个错:把无效等价类想得太简单。比如车速输入,你以为小于0就是无效。但模型内部可能对负值有特殊处理(比如取绝对值)。所以无效等价类也要测,而且要测出边界。

MIL中的实践步骤:

  1. 识别输入条件(比如车速、油门开度、制动压力)。
  2. 划分有效和无效等价类。
  3. 每个等价类至少选一个代表值。
  4. 生成测试用例。

3.2 边界值分析法:Bug最爱藏在边边上

等价类划分解决了“测哪些区间”的问题。但边界值分析法解决的是“区间边界怎么测”。

你想想看,开发写代码时,最容易出错的地方是哪?就是那些判断条件。比如 if (speed >= 0 && speed <= 300),这个 >=<= 的边界,稍微写错一个符号,模型行为就全变了。

边界值分析法的要点:

  • 取边界上的值(比如0和300)。
  • 取边界两侧的值(比如-1和301)。
  • 取边界内侧的值(比如1和299)。

我的习惯:在MIL测试中,我通常把边界值分析法跟等价类划分法结合着用。先划分等价类,再在边界上多测几个点。这样覆盖率基本不会差。

举个例子,测试一个“车速超过120km/h时报警”的功能。边界值用例可以这样设计:

测试输入(车速) 预期输出(报警状态) 说明
119 km/h 不报警 边界内侧
120 km/h 报警 边界值
121 km/h 报警 边界外侧

嗯,这里要注意:边界值不光是数值边界。时间边界、状态边界也一样。比如一个延时5秒的动作,第4.9秒和第5.1秒就是边界。

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

等价类和边界值,主要针对单个输入。但模型里很多功能是多个输入组合决定的。这时候因果图法就派上用场了。

因果图法的本质:把“原因”(输入条件)和“结果”(输出行为)之间的逻辑关系画出来。然后根据这个图生成测试用例。

常见的逻辑关系有:

  • 恒等:原因A成立,结果B就成立。
  • :原因A不成立,结果B才成立。
  • :多个原因同时成立,结果才成立。
  • :多个原因中只要有一个成立,结果就成立。

我在项目中遇到过这样一个案例:一个“自动紧急制动(AEB)”模型。它的触发条件是:车速大于30km/h 前车距离小于10米 驾驶员未踩制动。三个条件缺一不可。

如果用等价类划分,你可能只测了“三个条件都满足”和“都不满足”。但因果图法会告诉你:

  • 条件1满足,条件2不满足,条件3满足 → 结果?
  • 条件1不满足,条件2满足,条件3满足 → 结果?
  • ……

一共2^3=8种组合。你想想看,如果漏掉其中一种,模型在那种组合下可能做出错误决策。后果是什么?可能是追尾。

因果图法的步骤:

  1. 分析需求,找出所有原因和结果。
  2. 画出因果图(逻辑关系图)。
  3. 根据因果图生成决策表。
  4. 从决策表导出测试用例。

3.4 场景法:模拟真实驾驶

前面三种方法,都是从“输入”角度出发的。但场景法不一样。它从“用户故事”或“驾驶场景”出发。

为什么需要场景法?

因为很多Bug,不是单个输入错了,而是多个事件按特定顺序发生时,模型处理不过来。比如:

  • 先急加速,再急减速,再急加速。
  • 先进入弯道,再触发AEB,再退出弯道。

这些场景,用等价类或边界值很难构造出来。但场景法可以。

场景法的核心:

  • 基本流:正常、无异常的流程。比如“驾驶员正常加速到60km/h,然后匀速行驶”。
  • 备选流:出现异常或分支的流程。比如“加速过程中,前车突然急刹”。
  • 异常流:系统无法处理的流程。比如“传感器突然失效”。

我个人习惯,在MIL测试中,场景法通常用来做“集成测试”或“系统测试”级别的用例设计。因为单元测试用等价类和边界值就够了。但到了模型集成阶段,场景法能帮你发现那些“意想不到”的交互问题。

避坑指南:我曾经设计过一个“高速公路跟车”场景。基本流是“前车匀速,后车跟车”。备选流是“前车减速,后车减速”。看起来没问题。但实际测试时,模型在“前车减速后又加速”这个场景下,出现了跟车距离过大的问题。因为模型对“减速后恢复”的响应太慢了。这个场景,如果不用场景法,我根本想不到去测。

3.5 四种方法的组合使用

说了这么多,你可能会问:到底用哪种?

我的建议是:别只用一种。它们不是互斥的,是互补的。

方法 适用场景 MIL中的典型应用
等价类划分法 单个输入,连续值 车速、温度、压力等模拟量输入
边界值分析法 有明确边界的输入 阈值判断、状态切换点
因果图法 多个输入组合决定输出 逻辑判断、使能条件、故障处理
场景法 事件序列、用户操作流程 驾驶场景、故障注入、模式切换

我通常的做法是:

  1. 先用场景法,梳理出核心的驾驶场景。
  2. 对每个场景中的关键输入,用等价类划分和边界值分析法细化。
  3. 对场景中的逻辑判断,用因果图法补充。

这样一套组合拳下来,测试用例的覆盖率基本能到90%以上。剩下的10%,靠经验和对模型的深入理解去补。

最后提醒一句:方法只是工具。别为了用方法而用方法。我见过有人把因果图画得跟电路图一样复杂,结果用例数量爆炸,根本测不完。记住,MIL测试的目的是“用最少的用例,发现最多的Bug”。