詹金斯 - 如何保持Matlab热身

时间:2017-07-08 14:45:11

标签: matlab performance unit-testing jenkins warm-up

我在用Matlab编写的项目上运行Jenkins。我的构建脚本正在启动Matlab,其中包含运行构建脚本和退出的必要参数。

由于Matlab是一种解释型语言,因此连续运行速度要快得多,所以我试图找到一种方法来运行Matlab并保持它的未来测试。

我也不认为这个问题只与Matlab有关,Java是一样的。

所以问题是:有没有办法保持进程(在我的情况下是Matlab)为未来的测试运行开放?

欢迎提供有关Java或其他解释语言的解决方案的答案。

1 个答案:

答案 0 :(得分:1)

免责声明:我从未尝试过以下建议,可能会遇到一些我没有考虑过的困难。但我认为它可能会奏效。

我认为你应该可以使用MATLAB Engine for Python(R2014b及以上版本)或MATLAB Engine for Java(R2016b及以上版本)。

每次运行Jenkins作业时,不是启动MATLAB,而是使用matlab -r 'matlab.engine.shareEngine'启动它一次。这将在启动时运行MATLAB命令matlab.engine.shareEngine,使MATLAB可用于Python或Java的连接。

然后,您的Jenkins作业可以运行一个小PythonJava脚本,该脚本将连接到正在运行的MATLAB会话,执行测试代码,清除并断开与MATLAB的连接。

您需要确保将结果从MATLAB传递回Python / Java以指示您的测试是否已通过或失败,然后使Python / Java退出并显示反映该状态的状态代码,以便Jenkins了解成功/失败。

在每次运行结束时,您还需要注意清理,因为MATLAB最终会在测试运行之间共享状态。而且你还需要确保你的测试运行永远不会崩溃MATLAB(或者有一些方法来监视它并在它崩溃的情况下重新启动它。)

编辑:请求的示例。

所以(假设您已经运行了一个MATLAB会话,如上所述已经设置了共享),您可以从Python连接到MATLAB,并使用以下内容运行测试:

import matlab.engine
eng = matlab.engine.connect_matlab()
import StringIO
out = StringIO.StringIO()
err = StringIO.StringIO()
ret = eng.runmytests(nargout=1,stdout=out,stderr=err)
print(out.getvalue())
print(err.getvalue())
if ret:
    sys.exit(0)
else:
    sys.exit(1)

注意eng.runmytests。在这里,您将调用MATLAB函数runmytests。您可能希望实现类似于以下内容的MATLAB函数runmytests.m

function output = runmytests
import matlab.unittest.TestSuite;
try
    suite = TestSuite.fromPackage('testcases','IncludingSubpackages',true);
    results = run(suite);
    display(results);
catch e
    display(getReport(e,'extended'));
    output = false;
    return
end
output = ~any([results.Failed]);

上面的例子没有完全解决;我担心我的机器上没有Python环境可以测试它 - 你可能需要稍微调整一下。但我希望它可能是一个不错的起点。