3. 网关路由表解析与测试用例设计

网关路由表是整车网络架构中“谁转发什么、按什么规则转发”的权威描述。它通常由网络架构团队以 DBC/ARXML/Excel 形式发布,包含源总线、目标总线、报文标识、路由类型、触发条件、超时策略等字段。测试工程师拿到路由表后,第一件事不是立刻写用例,而是把表“翻译”成可验证的转发契约:一条路由条目意味着一个确定的输入—输出映射,以及一组必须成立的时序与内容约束。本节围绕直通路由、条件路由、协议转换路由三类典型条目,说明如何解析字段并据此设计信号级与 PDU 级测试用例。

一、路由表关键字段的语义解析

以常见的 CAN-CAN 网关路由表为例,一条条目通常包含以下字段:

字段示例值测试含义
SourceBusCAN1激励注入的物理通道
SourceID0x1A0源报文 CAN ID
DestBusCAN2目标通道,需在目标总线上抓取
DestID0x2B0目标报文 CAN ID,可能被重映射
RouteTypeDirect / Conditional / Gateway决定转发逻辑与用例类型
SignalMapEngineSpeed→EngSpd信号级映射关系,含缩放与偏移
Timeout100 ms源报文丢失后目标报文的超时行为
EnableConditionIgnition==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,这取决于路由表约定。

网关路由表解析与三类路由测试映射 网关路由表条目 SourceBus: CAN1 SourceID: 0x1A0 DestBus: CAN2 DestID: 0x2B0 RouteType: 三类 Timeout: 100 ms SignalMap: 缩放/偏移 直通路由 Direct 激励:CAN1 发 0x1A0,周期 20 ms 判据:CAN2 收 0x2B0,物理值一致 信号级:边界值 0/800/3000/6500 rpm 条件路由 Conditional 使能:Ignition==ON && Speed>0 用例:条件全真/单假/全假 4 组 判据:假时无报文或按超时策略 切换点:ON 后 50 ms 内首帧 协议转换 Gateway CAN→CAN FD:DLC 8→16 信号级:缩放偏移后物理值一致 PDU 级:填充字节 0x00/0xCC 校验和:目标协议要求时验证 测试执行与观测 CANoe 激励节点 CAPL 构造源报文 网关 DUT 按路由表转发 目标总线抓包 按 DestID 过滤 判据比对 物理值/DLC/时序 信号级关注物理值映射,PDU 级关注帧结构与时序;条件路由需覆盖条件组合与切换瞬间

三、从路由表到可执行用例的转换方法

把路由表条目转换为 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 与保留位;以及未验证源报文停发后的超时行为。把这些检查项固化为评审清单,可显著降低漏测风险。

路由表中的 Timeout 字段常被忽略。若声明“超时后目标报文停发”,则用例需在源停发后等待 Timeout+余量,断言目标总线上不再出现该 DestID;若声明“保持最后值”,则需断言目标信号维持不变。两种策略的判据完全相反,必须按表执行。

综上,路由表解析的核心是把表格字段转化为可观测的输入输出契约,测试用例设计则围绕直通、条件、协议转换三类路由分别展开信号级与 PDU 级验证。只有把 ID 映射、信号缩放、使能条件、超时策略四个要素都纳入用例,才能形成对网关路由功能的完整覆盖。