开发区域

MATLAB的高级软件开发

另一种持续整合

嗨。我非常兴奋地介绍我们新的开发区博客!我在MathWorks的一个小组中工作,负责构建基础设施和体系结构,作为一家公司,我们需要交付高质量、按时交付并满足客户需求的软件。简而言之,我们开发构建、测试和集成工具,以在多个平台上使用许多不同的技术生产生产级软件。我的团队专注于测试基础设施,是MATLAB的主要开发人员单元测试框架

正如您所想象的,我对开发方法和构建生产软件非常感兴趣。这个博客承认了一个事实,那就是我们并不是唯一对这个有热情的人。事实上,我们听到你们中的许多人正面临类似的任务,使用MATLAB®作为技术堆栈的关键部分来构建生产级软件,我们有成千上万的世界级的MATLAB开发人员在内部做同样的事情。我很高兴能分享我们用来开发用MATLAB编写的健壮的、可扩展的、灵活的软件的一些构建模块,我同样也很高兴听到你们是如何做同样的事情的。

首先,在我们博客的第一篇文章中,我认为应该描述MATLAB如何与CI系统交互,这是与他人合作构建高质量软件的必备条件。

CI吗?c他吗?

等等,我在说什么,CI系统吗?当你听到"持续集成"这个词时,你会想到什么?你是否考虑过计算不定积分和连续函数的定积分,或者与一个有助于构建和测试软件的系统进行交互?快速的谷歌调查表明,大多数人认为是后者,尽管从事数学的人可能有不同的倾向。

无论是什么情况,开发软件使用持续集成(CI)系统已经被证明是生产级软件必不可少的。这些系统提供的服务和安全网使软件的创建能够上升到高水平的安全和质量。

那么如何用MATLAB实现这个呢?

持续集成系统有几个共同的目的。三个重要的目的是:

  1. 与源代码控制系统的接口
  2. 构建需要编译步骤的软件,如c++或Java®
  3. 测试已经更改或重新构建的软件

连接CI系统和源代码控制系统依赖于这两个系统,这可以独立于MATLAB完成。

至于构建软件,MATLAB的许多特性确实需要构建步骤,例如编写MEX文件,编写与MATLAB一起工作的Java类,或编写用于分发的MATLAB文件的p编码。然而,最常见的MATLAB活动可能是使用MATLAB语言编写代码,它不需要构建步骤。现在,让我们将讨论的范围扩大到这些没有任何构件要构建的MATLAB活动类型(即MATLAB代码本身就是构件)。

连接MATLAB

如果你正在制作和共享MATLAB代码文件,并且它们已经在你的源代码控制系统中配置好了,那么很好,我们差不多完成了。我们只需要确保当您更改您的MATLAB源代码时,您的测试在您的CI系统中运行并触发构建失败。这就是我今天想深入探讨的问题。注意有一个各种各样的CI系统,但让我们看看如何将MATLAB测试连接到詹金斯™,它很受欢迎,集成了多种系统。

为此,我们需要:

  1. 配置Jenkins启动MATLAB,运行测试,并关闭MATLAB
  2. 将测试运行的结果从MATLAB传达到Jenkins软件
  3. 在海滩上悠闲地度过我们的日子,而不是手动集成我们的代码更改

启动MATLAB可以在Jenkins中创建一个新的自由形式的项目。这种类型的项目将允许我们建立一个简单的构建脚本来启动MATLAB并运行测试。在这种情况下,我已经指定了工作“做所有的测试”。

现在我们可以创建构建操作来运行shell脚本。

我们使用的shell命令需要简单地启动MATLAB并运行一些东西。我们可以使用这个简单的shell命令来确认我们可以运行这个MATLAB。使用这个脚本并在Jenkins中运行一个测试构建:

/应用程序/ MATLAB_R2014b。app/bin/matlab -nodisplay -r "disp('Hello World!');exit"

连接测试!

太棒了!我们正在联系。下一步是在MATLAB中实际运行一些东西。这取决于您如何组织测试,以及您希望运行哪些测试。本练习演示如何运行位于“testcases”包及其子包中的测试。以下是更新后的shell脚本:

/应用程序/ MATLAB_R2014b。app/bin/matlab -nodisplay -r "runALL_THE_TESTS"

这里是内容runAll_THE_TESTS脚本:

进口matlab.unittest.TestSuite试一试套件= TestSuite.fromPackage (“测试”“IncludingSubpackages”,真正的);结果=运行(套);显示(结果);e disp (getReport (e,“扩展”));退出(1);结束退出;

因此,简而言之,我们希望从我们的包及其子包创建一个TestSuite,然后使用默认的TestRunner运行测试。try-catch的使用是为了允许MATLAB在发生一些不可预见的问题时快速退出,但请注意,在这样做之前,代码打印扩展的错误细节并使用非零状态代码退出。这将确保如果出现严重错误,Jenkins任务将导致构建失败。

让我们运行另一个作业并查看测试的运行情况

我们是做测试的!不幸的是,我们只是运行它们,并没有以任何方式对测试失败做出反应。您可以从上面的蓝色作业标记中看到,Jenkins作业实际上通过了,尽管许多测试实际上失败了。这样不好!查看测试日志的底部,我们看到通过了163个测试,70个测试失败,还有80个测试没有完成,那么为什么作业通过了呢?

这里发生的情况是Jenkins CI系统不知道这个测试运行的结果。该作业通过查看我们启动的MATLAB进程的退出状态代码来确定通过或失败。虽然测试失败了,但MATLAB在启动时非常高兴,运行失败的测试套件,然后干净地退出。如果遇到任何测试失败,我们需要告诉MATLAB使用非零状态代码退出。我们可以通过简单地改变运行脚本的最后一行来做到这一点:

退出(任何([results.Failed]));

运行该作业,我们可以看到我们现在将测试失败视为作业失败

为赢!

仅仅几分钟后,我们现在在业务与MATLAB连接到我们的Jenkins CI系统,运行测试和失败的工作时,这些测试失败。太棒了!这将在支持测试框架的所有版本中工作(一直追溯到R2013a),现在您可以设置Jenkins定期运行这些构建,例如每晚或每当文件检入SCM系统时。如果你有R2014a或更高版本,我们可以做得更好,但我将把它留到下一篇博文中。

您是否自动测试您的MATLAB代码更改与CI系统?如果有,是哪一个?您在开发过程中获得了哪些好处?在这个过程中你学到了什么技巧和技巧?请在下面的评论区告诉我们。




发布与MATLAB®R2014b

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。

Baidu
map