3. 网关路由表解析与测试用例设计
网关路由表是整车网络架构中“谁转发什么、按什么规则转发”的权威描述。它通常由网络架构团队以 DBC/ARXML/Excel 形式发布,包含源总线、目标总线、报文标识、路由类型、触发条件、超时策略等字段。测试工程师拿到路由表后,第一件事不是立刻写用例,而是把表“翻译”成可验证的转发契约:一条路由条目意味着一个确定的输入—输出映射,以及一组必须成立的时序与内容约束。本节围绕直通路由、条件路由、协议转换路由三类典型条目,说明如何解析字段并据此设计信号级与 PDU 级测试用例。
一、路由表关键字段的语义解析
以常见的 CAN-CAN 网关路由表为例,一条条目通常包含以下字段:
| 字段 | 示例值 | 测试含义 |
|---|---|---|
| SourceBus | CAN1 | 激励注入的物理通道 |
| SourceID | 0x1A0 | 源报文 CAN ID |
| DestBus | CAN2 | 目标通道,需在目标总线上抓取 |
| DestID | 0x2B0 | 目标报文 CAN ID,可能被重映射 |
| RouteType | Direct / Conditional / Gateway | 决定转发逻辑与用例类型 |
| SignalMap | EngineSpeed→EngSpd | 信号级映射关系,含缩放与偏移 |
| Timeout | 100 ms | 源报文丢失后目标报文的超时行为 |
| EnableCondition | Ignition==ON | 条件路由的使能前提 |
解析时需特别注意三点:一是 ID 是否重映射,若 DestID 与 SourceID 不同,目标侧抓包必须按 DestID 过滤;二是信号映射是否带缩放,例如源信号 0.5 rpm/bit、目标 0.25 rpm/bit,则同一物理值在两侧原始值不同;三是超时策略,它决定“源停发后目标报文是停发、保持最后值还是置默认值”。这三类信息直接决定用例的激励方式与判据。
二、三类路由的测试用例设计
直通路由(Direct)是最基础的转发:源报文按周期到达后,网关在固定延迟内原样或按 ID 映射转发到目标总线。信号级用例应选取边界值与典型值,例如 EngineSpeed 取 0、800、3000、6500 rpm,在 CAN1 上构造对应原始值,在 CAN2 上按 DestID 抓取并反算物理值,判据为“物理值一致且误差不超过量化步长的一半”。PDU 级用例则关注整帧:DLC 是否一致、保留位是否被清零、滚动计数器是否连续。若路由表声明“保留位透传”,则需构造保留位非零的帧验证其是否被原样转发。
条件路由(Conditional)在直通基础上增加使能条件。例如“仅当 Ignition==ON 且车速大于 0 时才转发”。设计用例时必须做条件组合覆盖:条件全真、单条件假、全假。以 Ignition 与 VehicleSpeed 两个布尔化条件为例,至少四条用例。判据不仅是“条件真时目标有报文”,还包括“条件假时目标无报文或按超时策略处理”。这里容易遗漏的是条件切换瞬间:Ignition 由 OFF 变 ON 后,目标报文应在多少毫秒内出现?路由表若给出 50 ms 使能延迟,则用例需在切换点后 50 ms 内检查首帧。
协议转换路由(Gateway)涉及跨协议或跨帧结构转换,典型如 CAN 到 CAN FD、CAN 到 LIN、或信号重新打包。此时源与目标的 DLC、信号布局、字节序都可能不同。用例设计要分两层:信号级验证物理值经缩放偏移后一致;PDU 级验证目标帧的 DLC、填充字节、校验和(若目标协议要求)是否正确。例如源 CAN 帧 8 字节,目标 CAN FD 帧 16 字节,则需检查后 8 字节是否为填充值 0x00 或 0xCC,这取决于路由表约定。
三、从路由表到可执行用例的转换方法
把路由表条目转换为 CAPL 或 vTESTstudio 用例时,建议采用“一条路由条目对应一个测试函数”的组织方式。函数内部依次完成:设置源信号物理值、按源 DBC 编码为原始值、调用输出函数发送、等待目标报文、解码目标信号、与期望值比较。对于条件路由,额外增加条件变量设置与清除步骤。对于协议转换路由,需分别加载源与目标 DBC,确保解码器正确。
以下是一个直通路由信号级用例的 CAPL 片段示例,用于验证 EngineSpeed 从 CAN1 到 CAN2 的映射:
testcase DirectRoute_EngineSpeed_Boundary()
{
float physValues[4] = {0.0, 800.0, 3000.0, 6500.0};
int i;
for (i = 0; i < 4; i++)
{
// 按源 DBC 编码并发送
message 0x1A0 msg;
msg.EngineSpeed = physValues[i];
output(msg);
// 等待目标报文
if (TestWaitForMessage(0x2B0, 200) == 1)
{
message 0x2B0 rxMsg;
TestGetWaitEventMsgData(rxMsg);
float actual = rxMsg.EngSpd;
float tolerance = 0.25 / 2.0; // 目标量化步长一半
if (abs(actual - physValues[i]) <= tolerance)
TestStepPass("EngineSpeed %f rpm 映射正确", physValues[i]);
else
TestStepFail("EngineSpeed %f rpm 映射偏差 %f", physValues[i], actual);
}
else
{
TestStepFail("未在 200 ms 内收到目标报文 0x2B0");
}
}
}
该用例体现了三个关键设计点:一是边界值选取覆盖了信号量程两端;二是容差按目标量化步长的一半设定,避免因量化误差误判;三是等待超时设为 200 ms,大于路由表声明的最大转发延迟,留出余量。对于条件路由,可在循环外增加条件设置与清除,并增加“条件为假时 TestWaitForMessage 应超时”的反向断言。
四、覆盖度检查与常见遗漏
完成用例编写后,需对照路由表做覆盖度检查。建议从三个维度核对:路由条目覆盖(每条 RouteType 至少一条用例)、信号覆盖(每个映射信号至少一个边界值)、异常覆盖(超时、条件切换、DLC 异常)。常见遗漏包括:只测了条件为真的情况,未测条件为假;只测了典型值,未测量程边界;只验证了信号值,未验证目标帧 DLC 与保留位;以及未验证源报文停发后的超时行为。把这些检查项固化为评审清单,可显著降低漏测风险。
综上,路由表解析的核心是把表格字段转化为可观测的输入输出契约,测试用例设计则围绕直通、条件、协议转换三类路由分别展开信号级与 PDU 级验证。只有把 ID 映射、信号缩放、使能条件、超时策略四个要素都纳入用例,才能形成对网关路由功能的完整覆盖。