我在用Matlab编写的项目上运行Jenkins。我的构建脚本正在启动Matlab,其中包含运行构建脚本和退出的必要参数。
由于Matlab是一种解释型语言,因此连续运行速度要快得多,所以我试图找到一种方法来运行Matlab并保持它的未来测试。
我也不认为这个问题只与Matlab有关,Java是一样的。
所以问题是:有没有办法保持进程(在我的情况下是Matlab)为未来的测试运行开放?
欢迎提供有关Java或其他解释语言的解决方案的答案。
答案 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作业可以运行一个小Python或Java脚本,该脚本将连接到正在运行的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环境可以测试它 - 你可能需要稍微调整一下。但我希望它可能是一个不错的起点。