开发区

高级软件开发与MATLAB

另一种持续集成

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

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

首先,在我们博客的第一篇文章中,我认为描述MATLAB如何与CI系统进行接口是很合适的,而CI系统是与他人合作构建高质量软件的必备条件。

CI吗?c他吗?

等等,我在说什么,情报系统吗?那么,当您听到“持续集成”这个术语时,您会想到什么?你是否考虑过计算连续函数的不定积分和定积分,或者与一个帮助构建和测试软件的系统连接?快速的谷歌检查显示,大多数人认为是后者,尽管可能那些涉及数学的人可能有不同的倾向。

无论情况如何,使用持续集成(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中运行一些东西。这取决于您如何组织测试,以及您希望运行哪些测试。这个练习演示了运行位于“测试用例”包及其子包中的测试。以下是更新后的shell脚本:

/Applications/MATLAB_R2014b.app/bin/MATLAB-nodisplay-r“运行所有测试”

这里是内容runAll_THE_TESTS脚本:

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

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

让我们运行另一个作业,看看我们的测试是否有效

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

这里发生的事情是,Jenkins CI系统不知道此测试运行的结果。作业通过查看我们启动的MATLAB过程的退出状态代码来确定通过或失败。当测试失败时,MATLAB非常高兴,因为它开始运行失败的测试套件,然后干净地退出。如果遇到任何测试失败,我们需要告诉MATLAB使用非零状态代码退出。我们只需将运行脚本的最后一行更改为:

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

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

为赢!

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

您是否使用CI系统自动测试MATLAB代码更改?如果有,是哪一个?您在开发过程中意识到哪些好处?一路上你学到了什么技巧和窍门?请在下面的评论部分告诉我们。




发布与MATLAB®R2014b

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。