2

我在一个用 Matlab 编写的项目上运行 Jenkins。我的构建脚本正在使用必要的参数启动 Matlab 以运行构建脚本并退出。

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

我也不认为这个问题只与 Matlab 有关,Java 也是如此。

所以问题是:有没有办法让进程(在我的例子中是 Matlab)为未来的测试运行开放?

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

4

1 回答 1

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 环境来测试它——你可能需要稍微调整一下。但我希望这可能是一个不错的起点。

于 2017-07-10T08:51:28.537 回答