1. 课程导入与全景认知

在基于模型的设计(Model-Based Design,MBD)流程中,Simulink 模型往往承担了从算法设计、控制策略验证到代码生成的核心角色。当模型数量从几个增长到几十、上百个,当一次改动可能牵动多个子系统与多个测试用例时,靠人工点击“运行仿真”、肉眼比对波形的方式就难以为继。持续集成(Continuous Integration,CI)与自动测试(Automated Testing)正是为了解决这一规模化和可重复性问题而引入的工程实践。

简单来说,Simulink 持续集成是指:每当模型或相关脚本发生变更并提交到版本库后,由服务器或本地流水线自动触发一系列动作——拉取代码、加载模型、执行测试、生成报告、归档结果,并把成功或失败反馈给开发者。Simulink 自动测试则是这套流水线中最核心的执行环节,它用可重复、可判定的测试用例替代人工观察,对模型的功能、接口、边界条件进行验证。二者结合,形成“改动—验证—反馈”的快速闭环。

它的价值可以归纳为三点。第一是回归防护:模型重构、参数调整、库更新后,历史测试能立刻告诉你是否破坏了原有行为。第二是可追溯性:每个测试结果都与具体的模型版本、需求条目、测试用例绑定,便于审计与问题定位。第三是效率与一致性:夜间批量执行数百个测试,比人工逐个打开模型可靠得多,也避免了“忘记跑某个用例”的疏漏。

典型工程场景包括:控制器模型每次提交后自动跑 MIL(模型在环)测试;生成代码前自动执行 SIL(软件在环)与 PIL(处理器在环)测试;多版本模型并行维护时的基线比对;以及交付前自动生成测试覆盖率与需求覆盖报告。

要理解这套体系,先要看清它的整体结构。下图给出了一条典型的 Simulink 持续集成与自动测试链路:从开发者提交变更开始,经过版本库触发、流水线调度、模型加载与测试执行,最终输出报告与反馈。图中同时标出了各环节使用的代表性工具,帮助建立工具链全景认知。

Simulink 持续集成与自动测试链路全景 开发与提交 Simulink 模型 测试脚本 / 用例 Git / SVN 提交 触发与调度 Jenkins / GitLab CI Azure DevOps 流水线配置 测试执行 MATLAB Unit Test Simulink Test MIL / SIL / PIL 结果与反馈 测试报告 / 覆盖率 需求追溯矩阵 邮件 / 看板通知 失败反馈:定位问题、修复模型、重新提交 工具链分层概览 建模与仿真层 Simulink / Stateflow 测试编写层 MATLAB Test / Simulink Test 执行与调度层 Jenkins / MATLAB Batch 报告与追溯层 Test Manager / Requirements 核心原则:每次变更都自动验证,结果可追溯、可重复、可度量 课程路线:环境搭建 → 测试编写 → 流水线集成 → 覆盖率与需求追溯 → 工程化落地

从图中可以看到,整条链路可以拆成四个阶段:开发与提交、触发与调度、测试执行、结果与反馈。前两个阶段解决“什么时候跑、由谁跑”的问题,后两个阶段解决“跑什么、结果怎么用”的问题。橙色虚线表示失败后的反馈回路——测试不通过时,流水线会把失败信息回传给开发者,形成闭环。这正是持续集成区别于“一次性测试”的关键:它不是一次动作,而是一个持续运转的循环。

在工具链层面,可以按职责分为四层。建模与仿真层是 Simulink 与 Stateflow,负责被测试对象的构建;测试编写层是 MATLAB Unit Test 框架与 Simulink Test,负责把验证意图写成可执行、可判定的代码;执行与调度层是 Jenkins、GitLab CI 或 Azure DevOps 等流水线工具,配合 MATLAB 的批处理模式在无界面环境下运行;报告与追溯层则通过 Test Manager、Requirements Toolbox 等生成测试报告、覆盖率数据和需求追溯矩阵。理解这四层的分工,后续章节中遇到具体工具时就不会迷失位置。

本课程的整体路线也遵循这条链路展开:先完成环境搭建与版本控制准备,再学习如何编写结构良好的自动测试用例,接着把测试接入流水线,然后引入覆盖率度量与需求追溯,最后讨论多模型、多版本、多团队协作下的工程化落地。每一章都会围绕一个可操作的目标推进,而不是停留在概念介绍。

学习建议:在开始后续章节前,先确认本机已安装 MATLAB、Simulink 与 Simulink Test,并准备好一个可用的 Git 仓库。后续示例会以一个简单的温度控制器模型为被测试对象,所有参数与结果均为教学示例,实际工程中请以项目真实数据为准。

需要特别强调的是,持续集成与自动测试并不是“额外负担”,而是把原本分散、易遗漏的验证工作固化成可重复执行的资产。一次投入编写测试,换来的是每次改动后的即时反馈。随着课程推进,你会逐步体会到:真正困难的不是让测试跑起来,而是设计出既能覆盖关键行为、又便于维护和扩展的测试集。这也是本课程希望帮你建立的核心能力。