4. 回归测试用例设计方法
回归测试用例设计不是把功能测试用例原样搬到 CANoe 工程里跑一遍。整车网络回归的核心对象是“报文—信号—节点状态—网络行为”这条链路,因此用例来源必须可追溯、可裁剪、可判定。实践中,回归用例主要来自三个入口:基于需求、基于变更、基于风险。三者不是互斥关系,而是同一用例池的三种筛选视角,最终合并去重后形成回归集。
三类用例来源的定位与产出
基于需求的用例回答“规范要求网络必须做什么”。输入是网络通信矩阵、DBC/ARXML、诊断规范、网络管理规范和整车功能规范。典型产出包括:报文周期与容差、信号取值范围与精度、超时与失效替代值、E2E 校验与计数器、网络管理睡眠/唤醒时序、诊断请求响应与否定响应码。这类用例覆盖面广、稳定性高,是回归集的基线,但数量大,必须靠变更和风险做二次裁剪。
基于变更的用例回答“这次改了什么,哪些行为可能被破坏”。输入是版本差异:DBC 中新增/删除/修改的信号、报文周期变化、节点新增或下线、网关路由表调整、诊断服务或 DID 变更、网络管理参数调整。变更用例要沿依赖链扩散,而不是只看被改对象本身。例如某报文周期由 100 ms 改为 20 ms,除该报文自身周期检查外,还要回归总线负载、接收节点超时判定、网关转发时延和网络管理唤醒保持条件。
基于风险的用例回答“一旦失效,后果最严重或最易漏检的地方在哪里”。风险通常来自:安全相关信号(扭矩、车速、挡位)、E2E 保护信号、跨网段网关路由、诊断刷写与安全访问、网络管理边界状态、历史缺陷高发模块。风险用例数量不必多,但必须优先执行,并配合更严格的判定阈值和更长观察窗口。
三类来源合并时,建议按“需求 ID / 变更项 ID / 风险项 ID”建立映射,同一用例可挂多个来源标签。裁剪原则是:需求用例保底覆盖,变更用例必测,风险用例优先且加严。这样既避免全量重跑导致周期失控,也避免只测变更点造成漏检。
等价类与边界值在报文层的落地
报文层的等价类和边界值,不能停留在“信号值分有效/无效”这种抽象描述,而要落到具体字段和判定量上。以一条 8 字节报文中的车速信号为例,假设 DBC 定义:起始位 0,长度 16 bit,小端,因子 0.01,偏移 0,物理范围 0~250 km/h,无效值 0xFFFF。那么可划分的等价类与边界如下:
- 有效等价类:0~250 km/h 对应的原始值 0~25000,正常应被接收节点正确解析。
- 无效等价类:原始值 25001~65534,属于超出物理范围但非保留值,接收端应有明确处理策略(钳位、忽略或置失效)。
- 保留/失效值:0xFFFF,应触发失效替代逻辑,如车速置为无效并点亮相应提示。
- 边界点:0、1、24999、25000、25001、65534、65535,其中 0 和 25000 是有效边界,25001 和 65534 是无效边界,65535 是失效边界。
除信号值外,报文层还有几类常被忽略但必须做等价类和边界值的维度:
- 周期边界:标称周期 T,容差 ±10%。边界取 0.9T、T、1.1T,以及超时判定阈值 T_timeout(通常为 3~5 倍周期)。
- 计数器/校验:E2E 计数器的回绕点(0→15→0)、校验错误、计数器跳变。
- 字节填充:未使用位/字节的默认填充值(0x00、0xFF)及被意外改写的情况。
- 发送模式:周期发送、事件触发发送、周期+事件混合发送的切换边界。
下面这张图把三类用例来源与报文层等价类/边界值的对应关系放在同一张关系图中,便于在设计用例时快速定位“该从哪个维度取点”。
从取点到可执行用例:一个报文层示例
以“车速信号越界与失效处理”为例,说明如何把等价类和边界值写成 CANoe 可执行用例。假设被测对象是接收节点 A,输入报文为 VCU_Status,周期 20 ms,车速信号 16 bit,因子 0.01,范围 0~250 km/h,失效值 0xFFFF,超时阈值 100 ms。
用例编号:REG-SIG-SPD-001
来源标签:需求(REQ-COM-012) + 变更(DBC v2.3 车速范围调整) + 风险(安全信号)
前置条件:CANoe 仿真 VCU_Status,周期 20 ms,接收节点 A 上电,总线负载 < 40%
测试步骤:
1) 发送车速原始值 0x0000,持续 500 ms,记录 A 解析值
2) 发送 0x0001、0x61A7(24999)、0x61A8(25000),各持续 200 ms
3) 发送 0x61A9(25001)、0xFFFE(65534),各持续 200 ms
4) 发送 0xFFFF,持续 500 ms
5) 停止发送 VCU_Status,等待 120 ms,观察超时处理
判定标准:
- 0x0000~0x61A8:A 解析值 = 原始值 × 0.01,误差 ≤ 0.01 km/h
- 0x61A9~0xFFFE:A 按规范钳位或置无效,不得出现随机跳变
- 0xFFFF:A 车速置无效,替代值符合规范,故障标志置位
- 超时 120 ms:A 触发超时替代,故障标志置位,恢复发送后 200 ms 内恢复正常
这个用例的关键在于:边界点不是只取 0 和 25000,而是把 25001、65534、65535 都纳入;判定不是只看“有没有收到”,而是看解析值、替代值、故障标志和恢复时间。CANoe 中可用 CAPL 或 Test Module 实现,通过 output() 构造报文、testWaitForTimeout() 控制时序、testGetValue() 读取接收节点内部变量或总线信号,最后用 testStepPass/Fail 记录判定。
最后需要强调:三类来源的权重不是固定的。新车型首轮回归可提高需求用例比例;改款车型以变更用例为主;安全相关或历史问题多的模块提高风险用例比例。每次回归结束后,应根据缺陷分布反查用例来源是否失衡——如果缺陷集中在变更点,说明变更扩散分析不足;如果缺陷集中在边界附近,说明边界取点不够细。通过这种反馈迭代,回归用例池才会逐步收敛到“覆盖够、数量可控、判定明确”的状态。