技术文章和通讯

Simulink模型验证的连续集成金宝app

作者:大卫·博伊斯、保罗·厄本、克里希纳·巴拉苏布拉曼尼安、帕布罗·罗梅罗·坎布雷拉斯和科林·布兰奇


持续集成(CI)越来越受欢迎,成为基于模型的设计的组成部分。但是ci是什么?它有什么好处,它试图解决的问题是什么?Simulink如金宝app何如何®适合CI生态系统?您如何为您的项目提供最佳利用CI?

如果您熟悉基于模型的设计,但不熟悉CI,您可能会问自己以下问题。在这篇技术文章中,我们将探讨一个常见的CI工作流,并将其应用于基于模型的设计。然后,我们使用Jenkins遍历该工作流的一个示例™, GitLab®,以及Sim金宝appulink测试™.

该示例中使用的项目是可供下载

什么是ci?

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

图1所示。CI工作流。

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

构建:源代码和模型变成了目标文件和可执行文件。

测试:测试作为质量门进行。

包裹:可执行文件、文档、工件和其他可交付内容被捆绑在一起,以交付给最终用户。

部署:软件包部署到生产环境。

在一起,这四个步骤称为CI“管道”。管道通常是自动化的,具体情况可能需要几分钟到数天才能完成,具体取决于系统。值得注意的是,在整个步骤中,创建了许多文物,例如材料账单,测试结果和报告。

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

CI的好处是什么?

已实施CI的团队通常报告以下福利:

  • 重复性。CI管道为构建、测试、打包和部署提供了一致且可重复的自动化过程。可重复的自动化允许开发人员专注于必要的工作并节省项目时间。这也是降低风险的一个重要方面,通常也是认证的一项要求。
  • 质量保证。手动测试是有效的,但它通常基于天龄快照并缺乏可重复性。使用CI,始终针对最新的代码库进行更改。
  • 减少开发时间。具有内置质量保证的可重复流程导致高质量产品的速度更快。下载188bet金宝搏自动部署意味着您的代码始终准备好。
  • 改进的协作。使用CI,开发人员具有定义的过程,用于管理更改集并将其代码合并到生产线中。一致的过程使管理大型团队成为可能并降低新开发人员升高的成本。
  • 审核准备代码。CI工作流提供了广泛的审核跟踪。对于通过CI管道进行的每一项更改,都可以确定谁进行了更改、谁对其进行了审查、更改的性质、依赖关系、测试及其结果,以及沿途生成的任何数量的相关报告和工件。

模型的设计如何适合CI?

按照设计,CI工作流和工具是与语言和领域无关的。这意味着挑战是CI工具,系统和流程说话基于模型的设计——换句话说,就是制作Simulink金宝app®和相关工具Lingua FrancaCI工作流程。

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

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

下面是我们如何ci工作流程说话基于模型的设计:

发展。马铃薯®,S金宝appimulink,Coders和Toolboxes用于开发活动。MATLAB项目用于组织与版本控制系统的工作,协作和接口。

测试。金宝appSimulink Check™用于在仿真和代码生成之前进行模型质量检查。金宝appSimulink Test™用于开发,管理和执行基于仿真的测试。金宝appSimulink Coverage™用于测量覆盖率并评估测试效果。然后,质量检查,测试结果和覆盖度量可以用作开发人员的优质门,以资格获得他们的工作。

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

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

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

验证金宝appSimulink检查,用于本地验证的相同工具,用于CI系统内的自动验证。

构建。MATLAB CODER™,S金宝appIMULINK CODER™和EMBEDDER编码器®用于生成用于循环(SIL)测试的代码。

测试。金宝appSimulink测试,使用用于本地测试的相同工具,用于CI系统内的自动化测试。

包和部署。包装是可执行文件,文档,工件和其他可交付成型的位置,以便向最终用户提供交付。部署是打包软件的版本。在基于模型的设计的工作流程中,这些阶段在组织和群体之间变化很大,并且通常涉及将不同的构建和认证工件捆绑到准备交付给其他团队的产品中。

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

下面的案例研究描述了一个集成了CI和基于模型的设计的工作流。

案例研究:在CI系统中验证,金宝app构建和测试的Simulink模型

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

图3。Lane-following系统模型。

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

图4.道路后示例的管道。

管道中的阶段如下:

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

工作流程步骤

工作流包括以下步骤(图5):

  1. 扳机在Jenkins中构建并观察到验证和构建阶段通过。
  2. 探测Jenkins中的测试用例失败。
  3. 复制我们桌面Matlab上的问题。
  4. 解决问题通过放松评估标准,在模型中。
  5. 在本地测试以确保测试用例通过。
  6. 合并和审查测试分支上的更改。
  7. 犯罪Git的变化并在Jenkins中触发构建。
  8. 验证,构建和测试在詹金斯。

图5.示例工作流程。

左上角显示了我们第一次失败的CI循环。它显示了CI测试失败、局部复制、标准放松和CI工作流成功完成。

工作流程详细信息

  1. 我们首先开始触发通过选择在Jenkins中构建现在建立.Simu金宝applink检查检查和代码生成通过。
  1. 接下来,我们发现第二验证阶段的测试用例失败。测试用例LFACC_曲线_角质_接近在测试套件LaneFollowingTestScenarios不符合评估标准。
  1. 我们更好地了解失败,我们复制使用Simulink测试本地故障。金宝app我们打开测试文件lanefollowingtestscenarios.mldatx.并运行测试用例LFACC_曲线_角质_接近. 请注意,它不符合安全距离评估标准。需要更灵活地确定领导车和自我车之间的时间间隔。
  1. 随着对这个问题的了解,我们现在解决问题.我们打开了lanefollowtingtestbenchexample.slx.建模并导航到碰撞检测/测试评估测试序列块。第一项评估断言,自我与领头车之间的时间间隔一次不应低于1.5秒,持续时间不得超过2秒。

这种评估对正在测试的激进驾驶机动有太多的限制。出于本例的目的,我们放宽了评估标准,以确保时间间隔每次不会低于0.8秒,时间间隔每次不会超过5秒。

  1. 这个问题在我们的模拟中已经修复。确认,我们本地测试,保存模型并在测试管理器中重新运行测试。注意,它通过了新的评估标准。
  1. 我们已修复问题并在本地核实。我们现在使用模型比较工具来审查将它们提交到版本控制之前的更改。

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

  1. 通过修复错误,我们将这些更改推向Gitlab与Matlab项目,添加提交消息以记录评估标准的更改。

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

Gitlab会自动触发Jenkins的构建。Jenkins项目仪表板显示构建状态和进度。

  1. Jenkins Build运行。我们看到了验证、构建和测试管道阶段现在通过。

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

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

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

使用示例:工具,资源和要求

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

配置系统

Jenkins是我们的CI系统,GitLab是我们的版本控制系统。MATLAB、Jenkins和GitLab必须被配置成协同工作。下面的教程将帮助您进行设置。

配置我们的MATLAB项目

配置Jenkins.

配置GitLab触发Jenkins

本教程专门针对GitLab和Jenkins,但其概念也适用于其他版本控制和CI系统。

需要工具

此示例需要以下工具:

CI的许可证注意事项

如果您计划在许多主机或云上执行CI,请联系continuous-integration@mathworks.com求助。注意:Mathworks编码器和编译器产品等变下载188bet金宝搏革产品可能需要客户端访问许可证(CAL)。

附录:配置Matlab,Gitlab和Jenkins

步骤1.配置MATLAB项目以使用源控制

我们示例中的第一步是配置我们的项目以使用GitLab的源代码控制。

  1. 创建一个名为mbdexamplewithgitandjenkins.,将示例加载到它中,打开matlab项目mbdexamplewithgitandjenkins.prj.
  2. 在GitLab中,创建一个将作为远程存储库的新项目。它的名字mbdexamplewithgitandjenkins.并记录其托管的URL。
  3. 在MATLAB中,将项目转换为使用源控制。在“项目”选项卡上,单击使用源控制

点击将项目添加到源代码控制

  1. 点击转换
    1. 点击开放项目完成后。

    该项目现在处于本地Git源代码控制之下。

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

    1. 在“项目”选项卡上,单击偏僻的
    1. 指定Gitlab中远程源的URL。

    点击证实要确保与远程存储库的连接成功,请单击. 该项目现在配置为使用GitLab推拉更改。

    1. 点击犯罪执行初始提交。
    1. 点击将所有更改从本地存储库推到远程GitLab存储库。
    1. 刷新Gitlab仪表板并遵守MATLAB项目的内容。

    第3步:创建测试分支

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

    1. 点击分支机构
    1. 扩大分支和标签创建部分,名称分支“测试”,然后单击创建
    1. 在分支浏览器中观察测试。从测试分支点击转变然后
    1. 在Matlab选择将这些更改推向Gitlab并在Gitlab中观察测试分支。

    第4步:配置Jenkins调用MATLAB

    1. 安装两个必需的插件:
      • Gitlab插件- 此插件允许Gitlab触发Jenkins构建并在Gitlab UI中显示其结果。
      • MATLAB插件- 此插件将Matlab与Jenkins集成并提供Jenkins接口来调用Matlab和Simulink。金宝app
    2. 选择新物品并创建一个名为mbdexampleusinggitandjenkins.
    3. 在源代码管理下,使能Git,Point Jenkins指向我们的Gitlab存储库,然后输入测试建立分支。注意:需要登录或密码和GitLab API令牌。
    1. 配置构建触发器,以便在向GitLab中的Test分支发出推请求时运行构建。在“构建触发器”部分中选择先进>秘密令牌.Gitlab使用该令牌来请求构建并与Jenkins进行身份验证。记下秘密令牌和Gitlab Webhook。
    1. 配置构建环境。选择使用MATLAB版本并输入MATLAB根。
    1. 配置构建步骤。

    点击添加构建步骤并选择运行MATLAB命令. 输入命令OpenProject('sltestlanefollowingexample.prj');lanefollowingexecmodeladvisor.
    打开项目并运行模型顾问检查。

    点击添加构建步骤并选择运行MATLAB命令再一次。输入命令:OpenProject('sltestlanefollowingexample.prj');LaneFollowingExecControllerBuild.

    点击添加构建步骤并选择运行MATLAB测试.选择利用测试结果Cobertura代码覆盖范围填写构建配置。

    第5步。出版挖掘结果

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

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

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

    步骤6。发布HTML报告

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

    添加多个条目,因为有许多要发布的HTML报告。在这种情况下,有两个Web报告:模型顾问摘要和代码生成报告。这些是使用MATLAB内置功能创建的标准报告。您可以添加自定义HTML报告。

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

    步骤7.配置Gitlab触发Jenkins的构建

    将GitLab配置为在主分支上发生新推送时触发Jenkins中的自动生成。要执行此操作,请导航到设置>Webhooks..使用Jenkins提供的WebHook URL和jenkins提供的秘密令牌在构建触发器配置中,然后选择推动事件

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

    在里面测试下拉,选择推动事件测试集成。Gitlab将显示“成功执行的挂钩:HTTP 200”,Jenkins将开始构建。

    步骤8.配置Jenkins-to-Gitlab身份验证

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

    1. 使用API​​范围在Gitlab上创建个人访问令牌。
    1. 复制令牌并在Jenkins配置系统下创建Gitlab连接。
      注意:可以在多个Jenkins作业中重用连接,如果用户至少有“维护者”版权,则可以全局配置。

    步骤9.将Jenkins集成到GitLab管道中

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

    1. 在Jenkins作业的常规部分中选择Gitlab连接。
    1. 添加后构建操作以将构建状态发布到Gitlab。
      注意:此操作没有参数,将使用现有的GitLab连接在GitLab上发布构建状态,并为每个提交和合并请求创建双向跟踪。

    步骤10:可视化基于要求的测试指标(R2020B)

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

    1. 创建一个名为collectModelTestingResults.m基于下面所示的函数。这个函数将初始化指标引擎基础架构并收集所有可用的模型指标。
    函数collectmodeltingresults()%在R2020A中添加的%度量能力如果存在('metric')MetricIds = [...“ConditionCoverageBreateDrown”...“DecondedCoverageBreateBrea”...“McDCCoverageBreateBreake”......“McDccoverageBreakDown”......“SaleConditionCoverage”......“SalidEcisionCoverage”“OverallexecutionCoverage”...“ResementWithTestCaseDistRibution”的“Residmemcdcomoverage”......“ResignderTestCaseDistrage”的要求“ResignderTestCaseDistRibution”...“TestCasestatusDistribution”...“TestCasestatusPercentAction”“TestCaseTag“......”testCaseTagdistribution“”testCaseType“...”TestCaseTypeDistribution“”TestCaseWithRequirement“...”TestCaseWithRequirmentDistribution“”TestCasePerrequirmentPercentage“......”TestCasesPerrequirement“”TestCasesPerrequirmentDistibution“......];%收集初始协调e = metric.engine()的所有指标;执行(e,MetricID);结束
    1. 将此文件添加到项目和路径中。
    2. 配置Jenkins通过调用新的来收集度量结果CollectModeltestingResults.函数两次。第一个调用初始化与Simulink Test Manager的度量集成。金宝app第二种方法使用导出的Simulink Test Manager结果收集度量结果。金宝app
      1. 点击添加构建步骤并选择运行MATLAB命令再一次。输入命令:openProject('SltestLaneFollowingExample.prj');收集模型测试结果
        将此生成步骤定位到运行MATLAB测试建立步骤。
      2. 点击添加构建步骤并选择运行MATLAB命令再一次。再次输入命令:openProject('SltestLaneFollowingExample.prj');收集模型测试结果
        将这个构建步骤放置在运行MATLAB测试建立步骤。

    三、支票金宝appSimulink测试管理器结果在里面运行MATLAB测试建立步骤。

    1. 将度量结果归档到派生目录中。您还必须归档导出的测试管理器结果,因为它们将允许在加载回MATLAB时对Metric结果进行完整导航。

    点击添加后构建操作并选择归档工件。进入路径派生/ **,matlabtestartifacts / *。mldatx归档保存到该目录的所有文件。

    注意:要在Matlab上查看Matlab,而不是测试机器以外的机器,请执行以下操作:

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

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

    2021年出版的