1. 课程导入与全景认知

在基于模型的设计(Model-Based Design,MBD)流程中,Simulink 模型往往承担着控制算法、被控对象、信号调理乃至部分软件逻辑的表达职责。当模型规模从几十个模块增长到上千个模块、当模型数量从单个控制器扩展到包含被控对象、传感器、执行器与调度逻辑的模型族时,靠人工打开模型、点击运行、肉眼比对波形的方式已经无法支撑高频迭代。持续集成(Continuous Integration,CI)与自动化回归测试(Automated Regression Testing)正是为了解决这一矛盾而引入的工程实践:前者关注“每次变更后能否快速、自动地构建并验证”,后者关注“变更是否破坏了既有行为”。

需要先厘清一个常见误解:Simulink 的 CI 并不等于把模型当作普通源代码做文本 diff。Simulink 模型是二进制或半结构化的 .slx 文件,其内部包含模块、连线、参数、状态、采样时间、求解器配置等大量语义信息。因此,Simulink CI 的核心不是“比较文件”,而是“在受控环境中自动加载模型、执行仿真或代码生成、采集结果、与基线比对并给出判定”。回归测试则是这套判定逻辑的主体:它用一组稳定的测试用例覆盖关键功能与边界条件,在每次提交后重复执行,从而把“是否退化”从主观判断变成可追溯的客观结论。

本节要建立的全景认知可以概括为三句话:CI 解决“自动化触发与执行”,回归测试解决“行为是否退化”,工具链解决“如何把两者串起来并留下证据”。

为什么 Simulink 项目需要 CI 与回归测试

以一个典型的电机控制项目为例:模型包含 FOC_Controller、PMSM_Plant、Inverter 与 Signal_Conditioning 四个子系统,顶层采样时间 Ts = 1e-4 s,仿真时长 0.5 s。若某次修改把电流环 PI 的积分增益从 Ki = 120 改为 Ki = 200,仅凭“模型能编译通过”无法判断转速超调是否从 8% 恶化到 25%、相电流 THD 是否越界。回归测试会固定输入工况(如转速阶跃 0→1000 r/min、负载转矩在 0.2 s 突加 3 N·m),自动运行仿真并提取 overshoot、settling_time、THD 等指标,与基线阈值比较后给出通过或失败。这样,一次看似局部的参数改动是否引入退化,在几分钟内就有结论。

从工程价值看,CI 与回归测试带来的收益通常体现在四个方面:第一,缺陷发现前移,避免问题在集成后期甚至台架阶段才暴露;第二,变更信心提升,工程师敢于重构模型结构或替换模块实现;第三,证据可追溯,每次构建的测试报告、覆盖率与基线差异都可归档,满足功能安全或行业审查要求;第四,人力释放,重复性的“打开—运行—看波形”工作被脚本替代,工程师可以专注于算法与架构设计。

典型工程场景

Simulink CI 与回归测试并非只适用于大型团队。以下场景都具有明确的落地价值:

  • 多分支并行开发:不同工程师在各自分支修改控制器或被控对象,合并前需自动验证接口一致性与关键工况行为。
  • 模型与代码一致性检查:在生成嵌入式 C 代码前,自动执行模型在环(MIL)与软件在环(SIL)对比,确认数值行为一致。
  • 参数标定回归:当标定数据或查表参数更新时,自动重跑一组标准工况,防止标定改动引入非预期响应。
  • 版本升级验证:MATLAB/Simulink 版本升级后,自动执行回归套件,快速识别因求解器或模块行为变化导致的差异。
  • 持续交付流水线:将模型构建、测试、代码生成、静态检查串联为流水线,每次提交触发完整验证。

工具链概览

Simulink 生态内的 CI 与回归测试工具链可以按“建模—测试—执行—报告”四个层面理解。建模层面以 Simulink、Stateflow、Simscape 等为主;测试层面以 Simulink Test 为核心,提供测试用例、测试序列、基线捕获与评估;执行层面依赖 MATLAB 的脚本化能力(如 sim、Simulink.SimulationInput)以及 CI 平台(Jenkins、GitLab CI、Azure DevOps 等);报告层面则通过 TestReport、sltest.testmanager 生成 HTML/PDF 报告,并与需求管理工具(如 Requirements Toolbox)关联。此外,Simulink Coverage 用于统计模型覆盖率,Simulink Check 用于建模规范检查,Polyspace 可用于生成代码的静态分析。这些工具并非必须全部启用,而是根据项目成熟度逐步引入。

Simulink CI 与自动化回归测试全景 开发与提交 Simulink 模型 .slx / .mdl 测试用例与基线 .mldatx / .mat 参数与标定数据 .mat / .m 版本控制提交 Git / SVN 触发 CI 流水线 CI 执行引擎 1. 环境准备:MATLAB / Simulink 版本、路径、许可证 matlab -batch "setup" 2. 模型加载与编译检查 load_system / Simulink.BlockDiagram 3. 执行回归测试套件 sltest.testmanager.run 4. 覆盖率与规范检查 Simulink Coverage / Check 5. 生成测试报告与判定 TestReport / JUnit XML 失败则阻断合并,成功则进入下一阶段 结果与反馈 测试报告 通过 / 失败 / 差异 覆盖率报告 判定/条件/MCDC 基线差异定位 信号级对比 需求追溯 用例 ↔ 需求 反馈至开发与合并决策 工具链:Simulink · Stateflow · Simulink Test · Simulink Coverage · Simulink Check · MATLAB Batch · Jenkins / GitLab CI / Azure DevOps 持续反馈:失败用例驱动修复与基线更新

学习路线图

本课程后续内容将沿着“认知—搭建—深化—落地”的路径展开。首先建立 CI 与回归测试的基本概念与工具链认知;随后进入实操层面,学习如何用 MATLAB 脚本组织测试用例、如何配置 Simulink Test 的基线评估、如何在 Jenkins 或 GitLab CI 中调用 matlab -batch 执行测试;接着深入覆盖率统计、SIL/PIL 对比、参数化测试与并行执行等进阶主题;最后通过一个完整的工程案例,把模型提交、自动构建、回归执行、报告归档与合并门禁串成可复用的流水线。学习过程中建议始终围绕一个真实或半真实的 Simulink 项目进行练习,因为 CI 与回归测试的价值只有在“反复执行、持续观察差异”中才能真正体现。

起步建议:不必一开始就追求全自动流水线。可以先从“一个模型 + 一个测试用例 + 一条 MATLAB 命令”开始,确认能自动运行并输出通过/失败结论,再逐步增加用例数量、覆盖率统计和 CI 平台集成。这样每一步都有可见的反馈,也更容易在团队内推广。

需要强调的是,CI 与回归测试不是一次性配置完成就一劳永逸的工作。随着模型演进、需求变更和工具版本升级,测试用例、基线数据和阈值都需要持续维护。把回归测试套件本身当作受版本控制的工程资产来管理,是保证其长期有效的关键。当测试失败时,正确的做法不是立即放宽阈值,而是先定位是模型行为真的退化,还是基线本身需要随需求更新;这一判断能力,正是本课程希望帮助读者建立的核心素养。