2. 电驱系统基础

做HIL测试这么多年,我见过不少团队一上来就盯着“覆盖率”这个数字猛追。结果呢?数字很好看,车在路上跑着跑着就出问题了。说白了,覆盖度不是单一指标,它是个体系。你得分清楚你在测什么,才能知道你的覆盖度到底有没有意义。

这一章,我们就来掰扯清楚四种最核心的覆盖度概念。我个人习惯把它们分成两类:一类是“测没测到代码”,另一类是“测没测到功能”。前者是代码覆盖度,后者是需求、功能、接口覆盖度。方向完全不同,但缺一不可。

核心观点: 覆盖度不是越高越好,而是“该覆盖的地方都覆盖了”。盲目追求100%代码覆盖度,反而可能让你漏掉真正的功能缺陷。
HIL测试覆盖度体系 HIL测试覆盖度 代码覆盖度 需求覆盖度 功能覆盖度 接口覆盖度 关键区别: • 代码覆盖度:关注“代码执行了没有”,是白盒视角 • 需求覆盖度:关注“需求验证了没有”,是黑盒视角 • 功能覆盖度:关注“功能实现了没有”,是系统视角 • 接口覆盖度:关注“信号交互对了没有”,是集成视角

2.1 代码覆盖度:你到底跑了多少代码?

代码覆盖度,说白了就是看你的测试用例把被测代码“踩”了多少。它是最底层的覆盖度指标,也是很多开发团队最熟悉的。

常见的代码覆盖度指标有这几个:

指标名称 定义 HIL场景适用性
语句覆盖 每条可执行语句是否至少执行一次 低——HIL通常不关注单条语句
分支覆盖 每个判断条件的真/假分支是否都走到 中——可用于关键逻辑验证
条件覆盖 每个布尔子条件的真/假是否都覆盖 低——过于细粒度
MC/DC覆盖 每个条件独立影响结果 高——安全关键功能(如ASIL D)必备
函数覆盖 每个函数是否至少被调用一次 中——可用于模块级验证
注意: 在HIL测试中,代码覆盖度通常不是直接目标。HIL测的是“系统行为”,不是“代码行”。但如果你在做安全关键系统(比如ISO 26262要求的ASIL C/D),MC/DC覆盖度就是硬性要求。我曾经在一个EPS项目中,就因为MC/DC覆盖度差2%,被审核员卡了整整两周。

2.2 需求覆盖度:你的需求都测了吗?

需求覆盖度,这是HIL测试里我最看重的指标。它回答一个简单的问题:需求文档里写的每一条,你都有对应的测试用例吗?

我建议把需求覆盖度分成两个层次:

  • 正向覆盖: 每个功能需求至少有一个测试用例覆盖。这是基础,做不到就别谈别的。
  • 反向覆盖: 每个测试用例都能追溯到至少一个需求。这能防止你写一堆“没用”的用例。

举个例子,我之前做BMS(电池管理系统)项目时,需求里有一条:“当SOC低于10%时,系统发出低电量警告”。对应的测试用例就是:模拟SOC从15%下降到5%,检查CAN总线上是否发出警告信号。这就是正向覆盖。

我的习惯: 每次写测试用例前,先把需求清单拉出来,逐条打勾。没打勾的,要么是需求冗余,要么是测试遗漏。这两种情况,我都遇到过。

2.3 功能覆盖度:功能真的能用吗?

功能覆盖度比需求覆盖度更“粗”一些,但也更贴近用户视角。它关注的是:这个功能的所有使用场景,你都测了吗?

需求覆盖度是“点对点”,功能覆盖度是“面对面”。你想想看,一个功能可能对应多条需求,也可能对应多个使用场景。

功能覆盖度通常用功能矩阵来管理:

功能模块 子功能 正常场景 边界场景 异常场景 覆盖状态
ACC自适应巡航 跟车启停 前车减速/加速 前车静止/切入切出 传感器遮挡/失效 已覆盖
ACC自适应巡航 目标切换 弯道目标保持 多目标并行 目标丢失/误识别 部分覆盖
AEB自动紧急制动 车辆检测 前方静止车辆 前方慢速车辆 鬼探头/遮挡 已覆盖

这里要注意,功能覆盖度不是简单的“功能有就行”。你得把功能的状态机走通。比如ACC功能,从“待机”到“激活”到“退出”,每个状态转换都要覆盖到。

2.4 接口覆盖度:信号交互对了吗?

接口覆盖度,这是HIL测试的“独门绝技”。纯软件测试不太关注这个,但在HIL里,接口覆盖度直接决定了你的测试环境是否真实。

接口覆盖度关注的是:ECU与外界交互的所有信号通道,你都测了吗?

常见的接口类型包括:

  • CAN/LIN/FlexRay总线信号——报文ID、信号值、周期、校验
  • 硬线IO信号——数字输入输出、PWM、模拟量采集
  • 传感器/执行器仿真信号——温度、压力、转速、位置
  • 诊断接口——UDS、OBD、XCP/CCP

我建议用接口覆盖度矩阵来管理:

接口类型 信号名称 方向 正常值覆盖 边界值覆盖 故障注入覆盖
CAN 车速信号(0x100) 输入 0~250 km/h 0, 250, 255 信号超时/校验错误
硬线 刹车开关 输入 高/低电平 抖动/毛刺 对地短路/对电源短路
PWM 油门位置 输出 5%~95%占空比 0%, 100% 频率偏移/占空比超限
避坑指南: 我曾经在一个项目中,接口覆盖度做到了95%,但漏掉了一个“传感器供电电压”的硬线信号。结果台架上跑得好好的,装车后传感器供电不稳,系统直接死机。从那以后,我要求每个接口信号必须覆盖:正常值、边界值、故障注入三种场景。

2.5 四种覆盖度的区别与联系

说了这么多,我们来总结一下这四种覆盖度的核心区别。我习惯用一个表格来对比:

维度 代码覆盖度 需求覆盖度 功能覆盖度 接口覆盖度
关注对象 代码语句/分支 需求条目 功能场景 信号通道
测试视角 白盒 黑盒 灰盒 集成
粒度 细 中 粗 中
HIL适用性 低(安全关键除外) 高 高 极高
常用工具 Polyspace, Cantata DOORS, Polarion Test Manager, ECU-TEST CANoe, vTESTstudio
典型指标 MC/DC ≥ 100% 需求-用例追溯率 ≥ 100% 功能场景覆盖率 ≥ 90% 信号通道覆盖率 ≥ 95%

它们之间的关系,我打个比方你就明白了:

  • 需求覆盖度是“我要测什么”——目标清单
  • 功能覆盖度是“怎么用才算对”——使用场景
  • 接口覆盖度是“信号走通了没”——通信验证
  • 代码覆盖度是“代码执行了没”——实现验证

在HIL测试中,我个人的优先级排序是:接口覆盖度 > 功能覆盖度 > 需求覆盖度 > 代码覆盖度。为什么?因为HIL的核心价值在于“真实环境下的系统验证”,接口和功能是直接反映系统行为的,而代码覆盖度更多是开发阶段的事。

一句话总结: 代码覆盖度告诉你“代码跑了多少”,需求覆盖度告诉你“需求测了多少”,功能覆盖度告诉你“场景覆盖了多少”,接口覆盖度告诉你“信号验证了多少”。四者缺一不可,但HIL测试的重心,永远在接口和功能上。