技术文章及通讯

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

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


本文 是由 两部分组成的系列文章的第一篇。第一部分介绍如何利用GitLab®用于版本控制和持续集成(CI)的Jenkins。 2部分,连续 集成验证 Simulink模型 使用GitLab金宝app, 介绍了如何使用GitLab进行版本控制和CI。

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

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

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

CI是什么?

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

图1。CI工作流。

图1。CI工作流。

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

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

测试:测试是作为质量检验关进行的。

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

部署:包被部署到生产环境中。

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

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

CI的好处是什么?

已经实现CI的团队通常报告以下好处:

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

基于模型的设计如何融入CI?

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

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

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

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

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

发展。MATLAB®、S金宝appimulink、编码器和工具箱用于开发活动。MATLAB项目用于组织工作,协作,并与版本控制系统接口。

测试。金宝appSimulink Check™用于在模拟和代码生成之前执行模型质量检查。金宝appSimulink Test™用于开发、管理和执行基于模拟的测试。金宝appSimulink Coverage™用于测量覆盖率和评估测试有效性。然后,质量检查、测试结果和覆盖率度量可以作为开发人员验证其工作的质量闸门。

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

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

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

核实。金宝appSimulink Check是用于本地验证的相同工具,用于CI系统中的自动验证。

构建。MATLAB Coder™,S金宝appimulink Coder™和Embedder Coder®用于生成软件在循环(SIL)测试的代码。

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

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

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

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

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

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

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

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

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

图4。用于通道跟踪的管道示例。

图4。用于通道跟踪的管道示例。

目前正在进行的阶段如下:

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

工作流步骤

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

  1. 触发在Jenkins中构建,并观察验证和构建阶段通过。
  2. 检测詹金斯的测试案例失败。
  3. 繁殖这个问题在我们的桌面MATLAB。
  4. 解决问题在模型中通过放宽评估标准。
  5. 在本地测试以确保测试用例通过。
  6. 合并和回顾测试分支上的更改。
  7. 提交更改到Git并在Jenkins中触发构建。
  8. 验证、构建和测试詹金斯。
图5。工作流示例。

图5。工作流示例。

我们第一次失败地通过CI循环,如图左上角所示。它显示了CI测试失败、局部再现、标准放宽以及CI工作流的成功完成。

工作流细节

  1. 我们从触发Jenkins通过选择构建现在构建.Simu金宝applink Check检查代码生成是否通过。
通过选择“立即构建”在Jenkins中触发构建
  1. 接下来,我们检测第二个验证阶段的测试用例失败。测试用例LFACC_Curve_CutInOut_TooClose在测试套件中LaneFollowingTestScenarios不符合评估标准。
在第二个验证阶段检测测试用例失败
  1. 为了更好地理解失败,我们繁殖使用Simulink测试局部故障。金宝app我们打开测试文件LaneFollowingTestScenarios.mldatx并运行测试用例LFACC_Curve_CutInOut_TooClose.注意,它不符合安全距离评估标准。需要更灵活地确定领先车和自我车之间的时间差距。
使用Simulink Test在本地重现故障金宝app
  1. 了解了这个问题之后,我们现在解决问题.我们打开LaneFollowingTestBenchExample.slx模型并导航到碰撞检测/测试评估测试序列块。第一个评估断言,自我和领头车之间的时间差距不应该低于1.5秒,每次不应该超过2秒。
“碰撞检测/测试评估”测试序列块

这个评估对于正在测试的侵略性驾驶机动来说限制太大了。出于本例的目的,我们放宽了评估标准,以确保时间差距不会在一次超过5秒的情况下下降到0.8秒以下。

“碰撞检测/测试评估”测试序列块
  1. 在我们的模拟中,这个问题似乎已经解决。为了确认,我们在本地测试,保存模型并在测试管理器中重新运行测试。请注意,它通过了新的评估标准。
放宽评核准则
  1. 我们已经解决了这个问题,并在本地进行了验证。我们现在使用模型比较工具审查提交给版本控制之前的更改。
审查变化

我们还可以使用模型比较工具的发布特性来检查代码。

通过新的考核标准
  1. 修复了错误后,我们将这些更改与MATLAB项目一起推到GitLab,并添加了一个提交消息来记录评估标准的更改。
提交

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

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

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

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

我们完成表单并提交合并请求。

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

合并成功

举例:工具、资源和需求

以下部分概述了帮助您入门的资源、您将需要的工具,以及应该如何配置它们。

配置系统

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

配置我们的MATLAB项目

配置詹金斯

配置GitLab来触发Jenkins

这些教程是专门针对GitLab和Jenkins的,但是这些概念可以应用于其他版本控制和CI系统。

所需的工具

本例中需要准备以下工具:

  • 詹金斯安装版本2.7.3或更高。Jenkins用于持续集成。
  • Jenkins的MATLAB插件1.0.3或更高版本。MATLAB、S金宝appimulink和Simulink Test都利用这个插件与Jenkins通信。在GitHub上了解更多
  • 所需的额外插件:
  • GitLab帐户。GitLab用于源代码控制,并作为云服务提供。MATLAB项目包括一个用于与GitLab通信的Git接口。

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中,转换项目使用源代码控制。在Project选项卡上,单击使用源代码控制
使用源代码控制

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

将项目添加到源代码控制
  1. 点击转换
选择转换
    1. 点击开放项目当完成。
    开放项目

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

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

    1. 在Project选项卡上,单击远程
    远程
    1. 在GitLab中指定远程源的URL。
    远程源的URL

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

    1. 点击提交执行初始提交。
    选择提交
    输入评论
    1. 点击将所有更改从本地存储库推送到远程GitLab存储库。
    选择推
    1. 刷新GitLab仪表板并观察MATLAB项目的内容。
    GitLab仪表板

    步骤3:创建测试分支

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

    1. 点击分支机构
    选择分支
    1. 扩大分支和标签的创建节,将分支命名为“Test”,然后单击创建
    选择分支和标签创建
    1. 在分支浏览器中观察Test。从Test分支单击开关然后关闭
    在分支浏览器中观察Test
    1. 在MATLAB中选择将这些更改推送到GitLab,并观察GitLab中的测试分支。
    选择Push将这些更改推送到GitLab并观察GitLab中的Test分支

    步骤4:配置Jenkins调用MATLAB

    1. 安装两个必需的插件:
      • GitLab插件这个插件允许GitLab触发Jenkins构建,并在GitLab UI中显示他们的结果。
      • MATLAB插件该插件集成了MATLAB和Jenkins,并提供了Jenkins接口来调用MATLAB和Simulink。金宝app
    2. 选择新项目并创建一个新的自由式项目MBDExampleUsingGitAndJenkins
    3. 在源代码管理下,启用Git,将Jenkins指向我们的GitLab存储库,然后进入测试分支构建。注:需要登录或密码及GitLab API令牌。
    源代码管理
    1. 将构建触发器配置为当向GitLab中的Test分支发出推送请求时运行构建。在“生成触发器”部分中选择先进的>秘密令牌.GitLab使用这个令牌请求构建并通过Jenkins进行身份验证。记录秘密令牌和GitLab网络钩子。
    1. 配置构建环境。选择使用MATLAB版本并输入MATLAB根。
    构建环境
    1. 配置构建步骤。

    点击添加构建步骤并选择运行MATLAB命令.输入命令openProject(“SltestLaneFollowingExample.prj”);LaneFollowingExecModelAdvisor
    打开项目并运行模型顾问检查。

    点击添加构建步骤并选择运行MATLAB命令一次。输入命令:openProject(“SltestLaneFollowingExample.prj”);LaneFollowingExecControllerBuild

    点击添加构建步骤并选择运行MATLAB测试.选择TAP测试结果而且Cobertura代码覆盖完成构建配置。

    构建配置

    第5步。公布评估结果

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

    公布评估结果

    此操作将解析TAP测试结果,并在选择TAP扩展测试结果时显示这些结果。输出包含执行测试用例的概述,结果摘要,以及来自MATLAB控制台的日志。

    TAP扩展测试结果
    TAP扩展测试结果

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

    开发测试

    步骤6。发布HTML报告

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

    发布HTML报告

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

    您将在主Jenkins作业页面上找到与每个HTML报告的最后一个构建相对应的报告链接。如果你激活了发布选项下的“Always link to last build”复选框,插件将发布最新版本的报告,而不管版本状态如何。如果此复选框未激活,插件将只链接到最后一个“成功”构建。

    项目MBD实例

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

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

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

    人则

    测试下拉,选择推动事件来测试积分。GitLab将显示消息“Hook executed successfully: HTTP 200”,Jenkins将开始构建。

    人则

    步骤8。配置Jenkins-to-GitLab认证

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

    1. 在选择API范围的GitLab上创建一个个人访问令牌。
    个人访问令牌
    1. 复制令牌并在Jenkins Configure System下创建一个GitLab连接。
      注意:连接可以在多个Jenkins作业上重用,如果用户至少拥有“维护者”权限,则可以全局配置连接。
    Gitlab

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

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

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

    步骤10:可视化基于需求的测试度量(R2020b)

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

    测试指标
    1. 创建一个名为collectModelTestingResults.m基于如下所示的函数。该函数将初始化度量引擎基础结构并收集所有可用的模型度量。
    function collectModelTestingResults() % R2020a中添加的度量能力,如果存在('metric') metricIDs =[…]“ConditionCoverageBreakdown”“CoverageDataService”…“DecisionCoverageBreakdown”“ExecutionCoverageBreakdown”…“MCDCCoverageBreakdown”“OverallConditionCoverage”…“OverallDecisionCoverage”“OverallExecutionCoverage”…“OverallMCDCCoverage”“RequirementWithTestCase”…“RequirementWithTestCaseDistribution”“RequirementWithTestCasePercentage”…“RequirementsPerTestCase”“RequirementsPerTestCaseDistribution”…“TestCaseStatus”“TestCaseStatusDistribution”…“TestCaseStatusPercentage”“TestCaseTag”… "TestCaseTagDistribution" "TestCaseType"... "TestCaseTypeDistribution" "TestCaseWithRequirement"... "TestCaseWithRequirementDistribution" "TestCaseWithRequirementPercentage"... "TestCasesPerRequirement" "TestCasesPerRequirementDistribution"... ]; % collect all metrics for initial reconcile E = metric.Engine(); execute(E, metricIDs); end end
    1. 将此文件添加到项目和路径中。
    2. 配置Jenkins通过调用newcollectModelTestingResults函数两次。第一个调用初始化与Simulink Test Manager的度量集成。金宝app第二个使用导出的Simulink Test Manager结果收集度量结果。金宝app
      1. 点击添加构建步骤并选择运行MATLAB命令一次。输入命令:openProject(“SltestLaneFollowingExample.prj”);collectModelTestingResults
        将此构建步骤置于运行MATLAB测试构建步骤。
      2. 点击添加构建步骤并选择运行MATLAB命令一次。重新输入命令:openProject(“SltestLaneFollowingExample.prj”);collectModelTestingResults
        将此构建步骤定位在运行MATLAB测试构建步骤。
    测试指标

    3检查金宝appSimulink测试管理器结果运行MATLAB测试构建步骤。

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

    点击添加构建后操作并选择存档工件。输入路径/ * *, matlabTestArtifacts / * .mldatx将保存到该目录下的所有文件存档。

    构建后操作

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

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

    CI生成的结果将显示在指示板

    2021年出版的