4. 被控对象建模
做HIL测试这些年,我见过不少团队上来就对着需求文档猛写用例。结果呢?要么测了一堆重复场景,要么关键边界漏得干干净净。说白了,测试用例设计不是靠体力活堆出来的,得有方法。
这一章,我把四种最实用的设计方法掰开揉碎讲给你听。它们不是学院派的纸上谈兵,而是我在项目里反复验证过的真功夫。
4.1 等价类划分:别在无效数据上浪费时间
等价类划分的核心思想很简单:把输入数据分成若干类,每类里挑一个代表就够了。为什么?因为同一类里的数据,程序处理逻辑是一样的。
我记得有一次做BMS(电池管理系统)的HIL测试,电压采集通道有0~5V的范围。测试新人写了20多个用例,从0.1V到4.9V每隔0.2V测一次。我问他:「0.1V和0.3V测出来的逻辑有区别吗?」他想了想,说没有。这就是典型的无效覆盖。
- 有效等价类:符合需求规格的输入,程序应正常处理
- 无效等价类:不符合需求规格的输入,程序应有容错或报错机制
在HIL里,等价类划分特别适合处理传感器信号、CAN报文ID、诊断故障码这类离散输入。你想想看,一个CAN信号有256种取值,但真正影响控制逻辑的可能只有3~5个区间。
| 信号类型 | 有效等价类 | 无效等价类 |
|---|---|---|
| 车速信号(0~250km/h) | 0~30(低速)、30~80(中速)、80~120(高速)、120~250(超速) | <0、>250 |
| 电池SOC(0~100%) | 0~20(低电量)、20~80(正常)、80~100(满电) | <0、>100 |
| 发动机水温(-40~150℃) | -40~0(冷启动)、0~90(暖机)、90~120(正常工作)、120~150(过热) | <-40、>150 |
4.2 边界值分析:Bug最喜欢藏在边缘
经验告诉我,80%的软件缺陷都集中在输入域的边界附近。为什么?因为开发人员在写条件判断时,最容易搞错「<」和「<=」的区别。
边界值分析不是独立使用的,它和等价类划分是黄金搭档。等价类帮你圈定范围,边界值帮你精准打击。
- 取最小值、最大值
- 取最小值-1、最大值+1(越过边界)
- 取最小值+1、最大值-1(紧贴边界内侧)
举个例子,一个PWM占空比信号,需求规定有效范围是5%~95%。边界值用例就是:4%、5%、6%、94%、95%、96%。一共6个用例,覆盖了所有边界风险点。
我曾经在一个EPS(电动助力转向)项目中吃过亏。扭矩传感器的有效范围是0~10Nm,我们只测了0和10两个边界。结果台架跑起来,在9.9Nm附近转向助力突然抖动。后来一查,是标定表在9.9~10.0之间有个跳变点。从那以后,我要求团队必须把「最大值-1」也纳入边界测试。
4.3 因果图法:理清条件与结果的逻辑网
因果图法,说白了就是画一张逻辑关系图。输入条件是「因」,输出结果是「果」。HIL测试里最头疼的就是多条件组合场景,比如:「当车速大于30且制动踏板被踩下且ABS未激活时,触发再生制动请求」。这种逻辑用自然语言描述,很容易漏掉组合。
因果图的步骤我总结为四步:
- 列出所有输入条件(因):比如车速状态、踏板状态、系统状态
- 列出所有输出结果(果):比如再生制动激活、故障灯点亮
- 画出因果图:用与门、或门、非门连接因和果
- 生成决策表:把因果图转成表格,每一列就是一个测试用例
我习惯在画因果图之前,先和系统工程师过一遍需求文档。有一次做ADAS的HIL测试,需求里写「当AEB触发时,ESC退出」。因果图一画才发现,AEB和ESC之间还有三个中间状态没定义。要不是画了这张图,上了台架肯定出事故。
4.4 正交实验法:用最少的用例覆盖最多的组合
正交实验法解决的是「组合爆炸」问题。假设你有4个参数,每个参数有3个取值,全组合是3⁴=81个用例。但用正交表,可能9个用例就够了。
正交实验法的核心是「均匀分散,齐整可比」。它保证任意两个参数的组合都至少出现一次,但总用例数大幅减少。
我在VCU(整车控制器)项目中用过一次正交实验法。当时要测试6种驾驶模式 × 4种路面附着系数 × 3种坡度 × 2种载荷状态,全组合是144个用例。用L16正交表,只做了16个用例,就覆盖了所有两两组合。最终跑下来,发现的问题和全组合测试几乎一样多。
| 参数 | 水平1 | 水平2 | 水平3 | 水平4 |
|---|---|---|---|---|
| 驾驶模式 | 经济 | 舒适 | 运动 | 雪地 |
| 路面附着 | 干燥 | 湿滑 | 冰雪 | 砂石 |
| 坡度 | 0° | 5° | 10° | 15° |
| 载荷 | 空载 | 半载 | 满载 | — |
- 参数数量多(3个以上)
- 每个参数的取值数量相近
- 主要关注两两交互效应,高阶交互可忽略
- 测试资源有限,无法做全组合
4.5 四种方法的协同策略
你可能会问:这四种方法到底怎么搭配用?我个人的工作流是这样的:
- 先用等价类划分:把输入空间切成若干区间,确定有效和无效范围
- 再用边界值分析:在每个区间的边界上补充用例,抓住最容易出Bug的地方
- 遇到复杂逻辑用因果图:画出条件与结果的逻辑关系,生成决策表
- 遇到多参数组合用正交实验法:用最少的用例覆盖最多的组合
这四种方法不是互斥的,而是层层递进的关系。等价类和边界值解决「单参数」问题,因果图和正交实验法解决「多参数」问题。
嗯,这里要注意一点:不要为了用方法而用方法。如果某个功能只有两个输入条件,直接写全组合就行,没必要硬套正交实验法。方法是为测试服务的,不是反过来。
最后说一句,这些方法不是一次性能把所有用例都设计完的。我通常第一轮用等价类和边界值搭骨架,第二轮用因果图和正交实验法填血肉。两轮下来,覆盖度基本能到90%以上。剩下的10%,靠评审和探索性测试去补。