4. 平台总体架构设计

自动化回归测试平台不是把若干脚本堆在一起,而是一套需要长期演进、多人协作、跨工具链运行的工程系统。总体架构设计要回答四个问题:系统分成哪几层、每层由哪些模块构成、模块之间用什么接口通信、这些模块最终部署在哪些机器上。本节以 dSPACE 硬件在环(HIL)测试为背景,给出一套可直接落地的分层架构方案。

一、分层架构:从用例到硬件的五层切分

平台按职责纵向切分为五层,每层只依赖其下一层,禁止跨层反向调用。这样做的直接收益是:更换被测控制器或更换测试管理工具时,只需替换对应层,其余层保持稳定。

  • 用例层:以自然语言与参数表描述测试意图,例如“车速 60 km/h 时触发 AEB,期望制动减速度 ≥ 6 m/s²”。该层不出现任何 dSPACE API。
  • 编排层:负责用例调度、参数化展开、前置条件准备、失败重试与结果汇总,是回归批次的“指挥中心”。
  • 抽象层:把“设置车速”“读取 CAN 信号”“注入故障”等操作抽象为与硬件无关的接口,屏蔽具体工具差异。
  • 适配层:将抽象层调用翻译为 dSPACE 具体实现,如 AutomationDesk 的库函数、ControlDesk 的变量访问、XIL API 的调用。
  • 资源层:真实硬件与仿真资源,包括实时处理器(DS1006/DS6001)、I/O 板卡(DS2211)、总线接口(DS4302 CAN)、被测 ECU 与负载箱。

分层的关键约束是“接口向下定义、实现向上替换”。抽象层接口一旦冻结,适配层可以并行开发多个后端(真实 HIL、纯仿真、回放台架),用例层完全无感。

二、模块划分与职责边界

在五层之内进一步划分模块,每个模块应有单一职责和明确的输入输出。核心模块包括:

模块所属层核心职责关键输出
用例解析器用例层解析 YAML/Excel 用例,校验参数合法性标准化用例对象
调度引擎编排层批次编排、并发控制、超时与重试执行任务队列
测试服务接口抽象层定义信号读写、故障注入、测量采集契约接口定义(IDL)
dSPACE 适配器适配层调用 AutomationDesk/XIL API 完成实际操作原始测量数据
结果判定器编排层按判据比较实测值与期望值通过/失败结论
报告生成器编排层汇总日志、曲线、截图,生成 HTML/PDF 报告回归报告
资源管理器资源层台架占用、锁释放、模型加载与复位可用台架句柄

模块边界要防止两类常见错误:一是把判定逻辑写进适配器,导致换台架就要改判据;二是让调度引擎直接操作硬件变量,绕过抽象层。前者破坏可移植性,后者破坏可测试性。

三、接口定义:三类契约

平台内部存在三类接口,必须显式定义并版本化管理。

第一类是用例接口,即用例文件的结构约定。建议固定字段:case_id、precondition、stimulus、expected、tolerance、timeout_ms。其中 tolerance 用于浮点比较,例如减速度判据写为 expected: 6.0, tolerance: 0.3,避免因仿真步长导致误判。

第二类是服务接口,即抽象层暴露给编排层的方法。典型签名如下:

interface TestService {
  setSignal(name: string, value: number): void;
  getSignal(name: string): number;
  injectFault(component: string, mode: string): void;
  startMeasurement(signals: string[], rate_hz: number): MeasurementHandle;
  stopMeasurement(handle: MeasurementHandle): MeasurementResult;
}

第三类是数据接口,即测量结果的落盘格式。推荐统一为列式结构:时间戳、信号名、值、单位、质量码。质量码用于标记信号是否有效,例如 CAN 超时置为 0x02,判定器遇到无效质量码应直接判失败而非比较数值。

四、数据流:一次回归执行的完整链路

下面这张图给出从用例加载到报告产出的数据流与部署拓扑。图中同时标出了各模块所在的物理节点,便于后续部署规划。

回归测试平台数据流与部署拓扑 测试管理服务器 用例仓库(YAML/Excel) case_id / stimulus / expected 用例解析器 + 调度引擎 参数展开 / 并发 / 重试 结果判定器 期望值 ± tolerance 比较 报告生成器 HTML / PDF / 曲线 结果数据库 批次 / 用例 / 测量 / 质量码 历史趋势与失败聚类 HIL 台架 dSPACE 适配器 AutomationDesk / XIL API 实时处理器 DS1006 车辆模型 / 步长 1 ms I/O 与总线板卡 DS2211 / DS4302 CAN 被测 ECU + 负载箱 真实控制器 / 执行器模拟 测量采集通道 信号名 / 时间戳 / 值 / 单位 采样率 100 Hz ~ 1 kHz 抽象层服务接口 setSignal / getSignal injectFault startMeasurement stopMeasurement 接口版本 v1.2(冻结) 调用 适配 测量数据 回传判定 落盘 控制/调用流 数据/测量流

数据流的关键点在于:控制流自左向右下发,测量流自右向左回传,两者在抽象层交汇。判定器只消费抽象层返回的 MeasurementResult,不直接读取硬件,因此同一套判据既可用于 HIL,也可用于纯仿真回放。

五、部署拓扑与资源约束

部署上建议采用“一管理多台架”的拓扑:测试管理服务器一台,负责用例仓库、调度、判定与报告;HIL 台架若干,每台运行一个 dSPACE 适配器实例。服务器与台架之间通过以太网通信,适配器以服务方式常驻,避免每次执行都重新加载模型。

资源约束需要显式建模。每台 HIL 台架同一时刻只能被一个批次独占,因此调度引擎必须实现台架锁:申请锁时记录 bench_id 与 batch_id,执行结束或超时后释放。若某批次申请锁超过 lock_timeout_ms(示例取 30000 ms),应转入等待队列而非直接失败,并在报告中标注“资源等待”而非“用例失败”,避免误判。

接口版本管理建议:抽象层接口使用语义化版本,主版本变更必须同步更新所有适配器;用例层只依赖主版本号,次版本新增方法应提供默认实现,保证旧用例无需修改即可运行。

六、一个可执行的部署检查清单

架构落地前,可用下面这份清单逐项确认,避免上线后才发现接口或资源问题:

  1. 抽象层接口是否已冻结并打上版本号,是否有对应的接口文档与示例调用。
  2. 每个适配器是否实现了全部接口方法,未实现的方法是否显式抛出“不支持”而非静默返回 0。
  3. 测量数据的质量码是否已定义,判定器是否在比较前检查质量码。
  4. 台架锁是否具备超时释放与异常释放机制,服务器重启后锁状态能否恢复。
  5. 报告是否包含批次号、台架号、接口版本、用例版本,便于失败回溯。
  6. 结果数据库是否按批次分区,单批次数据量是否评估过(示例:500 用例 × 20 信号 × 10 s × 100 Hz ≈ 1000 万点)。