技术文章

Simulink模型验证的持续集成

作者:David Boissy、Paul Urban、Krishna Balasubramanian、Pablo Romero Cumbreras、Colin Branch和Jemima Pulipati,MathWorks


这是一个由两部分组成的系列中的第一篇文章。第1部分着眼于利用GitLab®用于版本控制和Jenkins®用于持续集成(CI)。第2部分,使用GitLab进行连续的Simulink模型验证集成,考虑将GitLab用于版本控制和CI。

持续集成(CI)越来越流行,并成为基于模型的设计的一个组成部分。但什么是CI?它的好处是什么?它试图解决什么问题?Simulink如何®融入CI生态系统?您如何在项目中最好地利用CI?

如果您熟悉基于模型的设计,但对CI不熟悉,您可能会问自己这些问题。在这篇技术文章中,我们探索了一个通用的CI工作流,并将其应用于基于模型的设计。然后,我们使用Jenkins、GitLab和Simulink Test™来浏览该工作流的示例。

本例中使用的项目是可供下载.

什么是CI?

CI是一种敏捷的方法论最佳实践,开发人员定期提交源代码更改并将其合并到中央存储库中。这些“变更集”随后会自动构建、鉴定和发布。图1说明了这个基本CI工作流和开发工作流。

CI工作流程图。开发人员和测试作者开发、测试、合并、审查并提交通过CI管道构建、测试、打包和部署的版本控制更改。完成后,构建输出、工件和报告可用

图1。CI工作流。

在工作流的开发部分,开发、验证、合并、审查模型和测试,并将其提交到开发人员桌面上的版本控制系统。然后,版本控制系统触发工作流的自动CI部分。CI工作流的关键部分包括:

内部版本:源代码和模型成为目标文件和可执行文件。

测试:测试作为质量关卡进行。

包裹:可执行文件、文档、工件和其他可交付成果被捆绑起来交付给最终用户。

部署:将包部署到生产环境。

这四个步骤统称为CI“管道”。管道通常是自动化的,根据系统的不同,可能需要几分钟到几天的时间才能完成。值得注意的是,在这些步骤中,创建了大量工件,例如物料清单、测试结果和报告。

CI工作流通常与与版本控制系统相关的开发人员工作流配对。在这些工作流中,开发人员通常将其更改保存在本地存储库中,并在部署之前使用本地CI管道来限定其更改。

CI的好处是什么?

实施CI的团队通常会报告以下好处:

  • 可重复性。CI管道为构建、测试、打包和部署提供了一致且可重复的自动化流程。可重复的自动化允许开发人员专注于必要的工作并节省项目时间。这也是降低风险的一个重要方面,通常是认证的要求。
  • 质量保证。手动测试是有效的,但它通常基于几天以前的快照,并且缺乏可重复性。对于CI,更改总是根据最新的代码库进行测试。
  • 缩短开发时间。具有内置质量保证的可重复流程加快了高质量产品的交付。自动化部署意味着您的代码始终为生产做好准备。
  • 改进协作。有了CI,开发人员就有了一个定义好的过程来管理变更集并将其代码合并到生产线中。一致的流程使管理大型团队成为可能,并降低了培养新开发人员的成本。
  • 审核就绪代码。 CI工作流提供了广泛的审核跟踪。对于通过CI管道进行的每个更改,都可以确定谁进行了更改,谁对其进行了审阅,更改的性质,以及依赖关系、测试及其结果,以及在此过程中生成的任何数量的相关报告和工件。

基于模型的设计如何适应CI?

根据设计,CI工作流和工具是语言和域中性的。这意味着面临的挑战是CI工具、系统和流程说话基于模型的设计——换句话说,使Simulink®和相关工具通用语CI工作流的。

这可以通过将基于模型的设计的三个关键组件集成到CI工作流中来实现:验证、代码生成和测试(图2)。基于模型的设计强调早期验证,它映射到CI管道,在构建阶段之前有一个验证阶段。代码生成在构建阶段进行。可以在测试阶段通过模拟和静态分析生成的代码进行动态测试。

基于模型的设计CI工作流的图示,在该工作流中,对模型的更改会触发CI管道来验证更改、构建、测试、打包和部署工件。

图2。基于模型的设计映射到CI管道。

以下是我们如何CI工作流说话基于模型的设计:

发展。MATLAB软件®Simulink、编码器和工具箱用于开发活动。MATLAB项目用于组织工作、协作和与版本控制系统的接口。

测试。 Simulink Check™用于在仿真和代码生成之前执行模型质量检查。Simulink测试用于开发、管理和执行基于仿真的测试。Simulink Coverage™用于测量覆盖率和评估测试有效性。然后,可以将质量检查、测试结果和覆盖率指标用作开发人员鉴定其工作的质量关卡。

合并。 MATLAB的比较文件和文件夹功能用于比较和合并MATLAB文件。模型比较工具用于比较和合并Simulink模型。

审查。审查是将更改提交给版本控制系统之前质量过程的最后一步。这里回顾了对MATLAB脚本和Simulink模型的更改。资格预审的测试结果也在提交之前作为最终质量关卡进行审查。

提交。MATLAB项目为版本控制系统提供了一个接口。

验证。 Simulink Check是用于本地验证的同一工具,用于CI系统内的自动验证。

生成。MATLAB Coder™、Simulink Coder™和Embedder编码器®用于生成软件在线(SIL)测试的代码。

测试。Simulink Test是用于本地测试的同一工具,用于CI系统内的自动化测试。

打包和部署。打包是将可执行文件、文档、工件和其他可交付成果捆绑起来以交付给最终用户的地方。部署是打包软件的发布。在基于模型的设计的工作流中,这些阶段在组织和组之间差异很大,通常涉及将不同的构建和认证工件捆绑到一个产品中,以便交付给其他团队。

现代开发工具和实践使开发人员能够尽早和经常地创建更健壮的系统和测试功能。当CI系统集成到工作流中时,单元级测试和系统级测试将自动进行。这意味着开发人员可以专注于开发新功能,而不是验证功能是否已正确集成。 

以下案例研究描述了一个包含CI和基于模型的设计的工作流。

案例研究:在CI系统中验证、构建和测试Simulink模型

在本例中,我们使用基于模型的设计和CI在汽车车道跟随系统上执行基于需求的测试(图3)。

左图是Simulink中显示车道跟随示例模型的屏幕截图。右图为Simulink中车道跟随示例模型的鸟瞰范围截图。

图3。车道跟随系统模型。

我们将使用的管道(图4)是在每个Jenkins构建中执行的。

图中显示了在车道跟随示例管道中执行的操作,包括验证标准符合性、构建模型和按顺序执行测试用例,以及所有这三个导致包工件步骤的步骤。

图4。以下是车道的管道示例。

管道中的阶段如下:

  1. 验证标准符合性:一个MATLAB单元脚本运行一个简单的模型顾问检查。评估标准确保模型没有未连接的线。
  2. 构建模型:MATLAB单元测试文件为我们的模型构建生产SIL代码。如果生成在没有警告的情况下成功,则通过评估标准。
  3. 执行测试用例:Simulink test中的一个测试套件使用几个驾驶场景来测试车道跟随控制器。使用三个评估标准验证控制器的正常运行:
    • 避免碰撞:在驾驶场景中,小汽车在任何时候都不会与领头车发生碰撞。
    • 安全距离维护:自我车和领先车之间的时间间隔超过1.5秒。两辆车之间的时间间隔被定义为计算出的车头时距与小汽车速度之比。
    • 车道跟随:与车道中心线的横向偏差在0.2 m以内。
  4. 包工件:前面的每个阶段都会生成工件,包括一个ModelAdvisor报告、一个生成的可执行文件和一组可以存档以供将来使用或参考的测试结果。

工作流步骤

工作流程由以下步骤组成(图5):

  1. 触发在Jenkins中构建,并观察验证和构建阶段是否通过。
  2. 检测Jenkins中的测试用例失败。
  3. 复制我们桌面上的问题MATLAB。
  4. 解决问题在模型中通过放宽评估标准。
  5. 本地测试以确保测试用例通过。
  6. 合并和审阅测试分支上的更改。
  7. 提交更改为Git并在Jenkins中触发构建。
  8. 验证、构建和测试在詹金斯。
图中显示了用户如何提交对版本控制的更改,从而触发CI管道。对更改进行验证、构建、测试、打包和部署。如果阶段失败,用户可以按照前面的步骤重新提交到版本控制。

图5。工作流示例。

我们第一次通过CI循环失败的过程如左上角所示。它显示了CI测试失败、本地复制、标准放宽和CI工作流的成功完成。

工作流详细信息

  1. 我们从开始触发通过选择内置Jenkins立即生成Simulink检查检查和代码生成通过。
Jenkins Dashboard下拉菜单的屏幕截图。已选中“立即生成”。
  1. 接下来,我们发现第二个验证阶段的测试用例失败。测试用例LFACC_Curve_CutInOut_TooClose(LFACC_曲线输入输出_关闭)在测试套件中车道跟随测试场景不符合评估标准。
故障摘要的屏幕截图。
  1. 为了更好地理解失败,我们复制使用Simulink测试在本地发生故障。我们打开测试文件车道跟踪测试场景.mldatx并运行测试用例LFACC_Curve_CutInOut_Too关闭请注意,它不符合安全距离评估标准。需要更灵活地确定领先车和自我车之间的时间间隔。
Simulink测试窗口的屏幕截图,其中包含通过的评估标准。
  1. 了解了问题后,我们现在解决问题。我们打开车道跟随测试台示例.slx模型并导航到碰撞检测/测试评估测试序列块。第一项评估认为,自我和领跑者之间的时间间隔不应低于1.5秒,每次不应超过2秒。
全球评估

%确保自我车辆和领先车辆之间的时间间隔不低于%1.5s,一次超过2s。
验证(期间(时间间隔<1.5,) < 2);%验证未检测到碰撞
验证(~碰撞);%验证车道中心线横向偏差的绝对值不超过0.2m%一次超过5秒。
验证(期间(abs(横向偏差)>0.2,) < 5);

此评估对于正在测试的攻击性驾驶操作过于严格。在本例中,我们放宽了评估标准,以确保时间间隔每次低于0.8秒的时间不超过5秒。

全球评估

%确保自我车辆和领先车辆之间的时间间隔不低于%0.8s,一次超过5s.验证(期间(时间间隔<0.8,) < 5);%验证未检测到碰撞
验证(~碰撞);%验证与车道中心线的横向偏差绝对值不超过0.2m%一次超过5秒。
验证(期间(abs(横向偏差)>0.2,) < 5);
  1. 该问题在我们的模拟中似乎已修复。为了确认,我们本地测试,保存模型并在测试管理器中重新运行测试。请注意,它通过了新的评估标准。
Simulink测试窗口的屏幕截图,其中包含通过的评估标准。
  1. 我们已经解决了问题,并在本地进行了验证。我们现在使用模型比较工具来回顾将更改提交到版本控制之前。
显示模型比较工具中旧更改和新更改的比较的屏幕截图。

我们还可以使用模型比较工具的发布功能来查看代码。

使用模型比较工具的发布功能时,显示旧更改和新更改的比较的屏幕截图。
  1. 修复了错误后,我们使用MATLAB项目将这些更改推送到GitLab,并添加一条提交消息来记录评估标准的更改。

然后,我们注意到GitLab中的最新提交。

GitLab自动触发Jenkins中的构建。Jenkins Project仪表板显示构建状态和进度。

Jenkins项目仪表板的屏幕截图,通过加载栏显示构建状态和进度。
  1. Jenkins构建运行。我们看到了验证、构建和测试管道阶段现已过去。

我们现在可以启动一个合并请求,将测试分支中的更改合并到主分支中。在GitLab中,在存储库我们选择分支机构然后单击合并请求在测试分支上的最新提交旁边。

我们填写表格并提交合并请求。

作为分支的所有者,我们可以通过单击合并按钮。现在,所有更改都会在主分支上捕获。

一个屏幕截图,显示合并请求成功时显示的消息。

使用示例:工具、资源和需求

以下各节概述了帮助您入门的资源、需要的工具以及应该如何配置这些工具。

配置系统

Jenkins被用作我们的CI系统,GitLab被用作版本控制系统。必须配置MATLAB、Jenkins和GitLab才能协同工作。以下教程将有助于设置。

配置我们的MATLAB项目

配置Jenkins

配置GitLab以触发Jenkins

这些教程特定于GitLab和Jenkins,但这些概念可以应用于其他版本控制和CI系统。

所需工具

此示例需要以下工具:

CI的许可证注意事项

如果计划在多台主机或云上执行CI,请联系continuous-integration@mathworks.com寻求帮助。 注:转换产品,如MathWorks®编码器和编译器产品可能需要客户端访问许可证(CAL)。

附录:配置MATLAB、GitLab和Jenkins

步骤1。配置MATLAB项目以使用源代码管理

我们示例中的第一步是将项目配置为使用GitLab的源代码管理。

  1. 创建名为的新目录MBD Git和Jenkins示例,将示例加载到其中,并打开MATLAB项目MBD带有GitAndJenkins.pj的示例.
  2. 在GitLab中,创建一个将作为远程存储库的新项目。说出它的名字MBD Git和Jenkins示例并记录其所在的URL。
  3. 在MATLAB中,将项目转换为使用源代码管理。在“项目”选项卡上,单击使用源代码管理.
屏幕截图显示了MATLAB中的项目选项卡,并选中了“使用源代码管理”按钮。

单击将项目添加到源代码管理.

源代码管理信息弹出窗口的屏幕截图。集成设置为无,存储库位置不适用。它声明没有为项目根目录检测到源代码管理系统,并有一个按钮,指示将项目添加到源代码控制。
  1. 单击转换.
用于添加到源代码管理的弹出窗口。源代码管理工具被选为Git,并给出了项目根。有一个转换按钮。
  1. 单击打开项目完成后。
显示添加到源代码管理的文件的屏幕截图。文件已通过所有检查,并且存在“打开项目”按钮。出现带有多个按钮和物流的Git菜单。

该项目现在处于本地Git源代码管理下。

步骤2。提交更改并将本地存储库推送到GitLab

  1. 在“项目”选项卡上,单击远程.
MATLAB项目选项卡的屏幕截图,突出显示“远程”。
  1. 在GitLab中指定远程源站的URL。
设置远程弹出窗口的屏幕截图。它有一个表单,用于指定源远程的U R L。给定的U R L是模糊的,底部有一个验证按钮和一个确定按钮。

单击验证要确保与远程存储库的连接成功,请单击好 啊。该项目现在配置为使用GitLab推送和拉取更改。

  1. 单击提交执行初始提交。
突出显示Commit按钮的MATLAB项目选项卡的屏幕截图。
注释窗口的屏幕截图,提交消息为Initial commit。
  1. 单击推动将所有更改从本地存储库推送到远程GitLab存储库。
选中按钮的MATLAB项目选项卡的屏幕截图。
  1. 刷新GitLab仪表板并观察MATLAB项目的内容。
GitLab仪表板的屏幕截图,其中使用之前推送的内容更新了空项目。

步骤3:创建测试分支

在这一步中,我们创建了一个测试分支,用于在与主分支合并之前测试和验证更改。

  1. 单击分支机构.
选中分支按钮的MATLAB项目选项卡的屏幕截图。
  1. 展开分支和标记创建部分,将分支命名为“Test”,然后单击创建.
分支窗口的屏幕截图,其中分支和标记创建部分已展开。分支的名称是Test,它旁边的创建按钮可用于创建分支。
  1. 观察测试在分支浏览器中。从测试分支单击交换机然后关闭.
“分支”窗口的屏幕截图,其中选定的当前分支为“测试”。旁边可用的切换按钮可用于将现有分支切换到测试分支。下面提供的关闭按钮可用于关闭窗口。
  1. 在MATLAB中选择推动将这些更改推送到GitLab,并观察GitLab中的测试分支。
显示GitLab仪表板的屏幕截图。选择测试分支,并显示分支的相应内容。

步骤4:配置Jenkins以调用MATLAB

  1. 安装两个必需的插件:
    • GitLab插件-这个插件允许GitLab触发Jenkins构建并在GitLabUI中显示其结果。
    • MATLAB插件-该插件将MATLAB与Jenkins集成在一起,并提供Jengins接口来调用MATLAB和Simulink。
  2. 选择新建项目并创建一个名为MBD示例使用GitAndJenkins.
  3. 在“源代码管理”下,启用Git,将Jenkins指向我们的GitLab存储库,然后输入测试要生成的分支。注意:需要登录名或密码和GitLab API令牌。
  1. 将生成触发器配置为在向发出推送请求时运行生成测试GitLab中的分支。在构建触发器部分中,选择高级> 秘密令牌。GitLab使用此令牌请求生成并向Jenkins进行身份验证。记下秘密令牌和GitLab网络挂钩。
  1. 配置生成环境。选择使用MATLAB版本并输入MATLAB根。
  1. 配置生成步骤。

单击添加生成步骤然后选择运行MATLAB命令.输入命令openProject('SltestLaneFollowingExample.prj');车道跟随ExecModelAdvisor
打开项目并运行模型顾问检查。

单击添加生成步骤然后选择运行MATLAB命令再一次。输入命令:openProject('SltestLaneFollowingExample.prj');执行控制器建造后的车道

单击添加生成步骤然后选择运行MATLAB测试.选择TAP测试结果Cobertura代码覆盖率以完成构建配置。

步骤5。发布TAP结果

点击添加构建后操作>发布TAP结果。输入将发布TAP测试结果的相对路径。

此操作分析TAP测试结果,并在选择TAP扩展测试结果时使其可见。输出包含已执行测试用例的概述、结果摘要和MATLAB控制台的日志。

仪表板上下拉菜单的屏幕截图,突出显示“T A P Extended Test Results”。

TAP插件还收集最新测试执行的结果,并显示健康图,如下所示。您可以通过单击图表来访问任何以前的构建。

T A P测试结果图,显示x轴上的Jenkins内部版本号和y轴上的T A P试验计数。测试的颜色编码为失败、通过、跳过或待办。随着内部版本号的增加,通过测试的数量也会增加。

步骤6。发布HTML报告

点击添加构建后操作> 发布HTML报告。输入将发布HTML报告的相对根路径以及路径中索引页的文件名。

添加尽可能多的条目,以便发布HTML报告。在此场景中,有两个web报告:模型顾问摘要和代码生成报告。这些是使用MATLAB内置函数创建的标准报告。您可以添加自定义HTML报告。

您将在Jenkins主工作页面上找到与每个HTML报告的上一次构建相对应的报告链接。如果您激活发布选项下的复选框“始终链接到最后一次构建”,插件将发布最后一次生成的报告,而不管构建状态如何。如果未激活此复选框,插件将仅链接到最后一个“成功”构建。

第7步。配置GitLab以触发Jenkins中的构建

配置GitLab,以便在主分支上发生新的推送时在Jenkins中触发自动构建。要执行此操作,请导航到设置> Webhooks(网钩)。使用webhook URL和Jenkins在Build Trigger配置中提供的秘密令牌,然后选择推送事件.

注意:在URL部分中使用完全限定的域名代替localhost,以便GitLab可以找到Jenkins安装。

Webhooks弹出的屏幕截图,其中填写了U R L表单,未填写Secret Token字段,并在“Trigger”下勾选了“Push Events”,并用表单填写了Trigger。

测试下拉,选择推送事件测试集成。GitLab将显示消息“Hookexecutedsuccessfully:HTTP200”,Jenkins将启动构建。

Project Hooks弹出屏幕截图,其中包含启用的webhook详细信息。

步骤8。配置Jenkins-to-GitLab身份验证

要在GitLab上自动发布Jenkins构建状态,您必须配置Jenkins-To-GitLab身份验证。

  1. 在选定API范围的GitLab上创建个人访问令牌。
个人访问令牌弹出窗口的屏幕截图,其中包含用于添加名为GitLabToJenkins的令牌的名称、到期日期和范围的表单。在“Scopes”下,选中“api”,这将授予对API的完全读/写访问权限。
  1. 复制令牌并在Jenkins配置系统下创建GitLab连接。
    注意:连接可以在多个Jenkins作业上重用,如果用户至少具有“维护者”权限,则可以全局配置。

第9步。将Jenkins集成到GitLab管道中

要将Jenkins集成到GitLab管道中,您必须在Jengins中配置GitLab连接,并将作业状态发布到Git实验室。

  1. 在Jenkins作业的General部分中选择GitLab Connection。
  1. 添加生成后操作以将生成状态发布到GitLab。
    注意:此操作没有参数,将使用现有的GitLab连接在GitLab上发布构建状态,并为每个提交和合并请求创建双向可跟踪性。
添加的构建后操作的屏幕截图,指示将构建状态发布到GitLab。有一个按钮用于高级选项。

步骤10:可视化基于需求的测试指标(R2020 b)

基于需求测试指标让您评估基于需求的测试活动的状态和质量。可以使用模型测试仪表板可视化度量结果。

  1. 创建一个名为收集模型测试结果。基于如下所示的功能。此功能将初始化度量引擎基础结构并收集所有可用的模型度量。
函数collectModelTestingResults()%R2020中增加的度量能力如果存在(“公制”)metricIDs=[。。。“ConditionCoverageBreakdown”“CoverageDataService”。。。“决策覆盖分解”“执行覆盖分解”。。。“MCDCCoverageBreakdown”“OverallConditionCoverage”。。。“OverallDecisionCoverage”“Overall ExecutionCoverage”。。。“总体MCDCCoverage”“RequirementWithTestCase”。。。“RequirementWithTestCaseDistribution”“Requirement WithTestcasePercentage”。。。“RequirementsPerTestCase”“Requirement PerTestCaseDistribution”。。。“TestCaseStatus”“测试用例状态分布”。。。“测试用例状态百分比”“测试用例标记”。。。“TestCaseTagDistribution”“TestCase类型”。。。“TestCaseTypeDistribution”“TestCase WithRequirement”。。。“TestCaseWithRequirementDistribution”“TestCase WithRequrementPercentage”。。。“TestCasesPerRequirement”“TestCasesPerRequirementDistribution”。。。];%收集所有指标以进行初始协调E=公制。发动机();执行(E,metricID);结束结束
  1. 将此文件添加到项目和路径中。
  2. 配置Jenkins,通过调用新的收集模型测试结果功能两次。第一个调用初始化与Simulink测试管理器的度量集成。第二个使用导出的Simulink测试管理器结果收集度量结果。
    1. 点击添加生成步骤然后选择运行MATLAB命令再一次。输入命令:openProject('SltestLaneFollowingExample.prj');集合模型测试结果
      将此生成步骤放置在运行MATLAB测试生成步骤。
    2. 点击添加生成步骤然后选择运行MATLAB命令再一次。再次输入命令:openProject('SltestLaneFollowingExample.prj');集合模型测试结果
      将此生成步骤放置在运行MATLAB测试生成步骤。
  1. 检查Simulink测试管理器结果在中运行MATLAB测试生成步骤。
构建步骤弹出窗口的屏幕截图。Simulink测试管理器结果的表格中填写了文件路径。
  1. 将度量结果归档到派生目录中。您还必须存档导出的测试管理器结果,因为当加载回MATLAB时,它们将允许度量结果的完整导航。

点击添加生成后操作然后选择归档工件。输入路径派生/**,matlabTestArtifacts/*.mldatx将保存到该目录的所有文件存档。

注意:要在测试机器以外的机器上在MATLAB中查看这些结果,请执行以下操作:

  • 下载存档的工件(派生目录和测试结果.mldatx文件)。
  • 提取并复制到用于运行CI作业的同一版本项目的本地副本中。
  • 在MATLAB中打开项目并启动模型测试仪表板。

CI生成的结果将显示在仪表板.

詹金斯®是LF Charities Inc.的注册商标。

2022年出版

面板导航