我使用Drone作为持续集成(CI)服务器。
测试是使用以下脚本开始的:
image: drone/matlab:R2014a
script:
- cd test
- matlab -nodesktop -nosplash -r ci_run_tests
notify:
email:
on_failure: blame
函数ci_run_tests基于以下答案:https://stackoverflow.com/a/23347768
至于Jenkins,作者建议将测试结果写在*.tap文件中,在我的情况下是这样的:
1..4
ok 1 - test_annotation_to_pitch/test_with_systematic_scale
ok 2 - test_audio_to_pitch/test_120_vs_360
not ok 3 - test_pitch_to_CENS/test_12_vs_36
ok 4 - test_pitch_to_chroma/test_12_vs_36
测试3失败。Drone不知道这些信息,因为它不会解释这些*.tap文件,它只注册了Matlab正确退出——因此说构建本身是有效的。
我的问题:无人机是否支持某些功能,如Jenkins 中的*.tap文件
谢谢!
大多数连续集成系统不解析结果,也不知道正在使用的测试,而是检查被调用程序的退出状态。
要发出错误信号,程序需要使用除0
之外的其他内容退出。
虽然提到的测试脚本有一个exit(1)
,但当测试失败时,testrunner
似乎不会引发异常。因此,要检查失败的测试,你需要计算它们的数量:
function runAllMyTests
import matlab.unittest.TestSuite;
import matlab.unittest.TestRunner;
import matlab.unittest.plugins.TAPPlugin;
import matlab.unittest.plugins.ToFile;
try
% Create the suite and runner
suite = TestSuite.fromPackage('packageThatContainsTests', 'IncludingSubpackages', true);
runner = TestRunner.withTextOutput;
% Add the TAPPlugin directed to a file in the Jenkins workspace
tapFile = fullfile(getenv('WORKSPACE'), 'testResults.tap');
runner.addPlugin(TAPPlugin.producingOriginalFormat(ToFile(tapFile)));
results = runner.run(suite);
% Count number of failed tests. Exit(1) if greater than 0
if nnz([results.Failed])
exit(1);
end
catch e;
disp(e.getReport);
exit(1);
end;
exit force;
仔细想想,这就是你真正想要的行为:异常总是会停止执行抛出它的任何东西。因此,你的测试套件会在第一次遇到错误时停止,而不会显示任何其他错误。
drone支持JUnit风格的XML工件吗?如果是这样,那么另一个解决方案是使用XMLPlugin作为MATLAB单元TestRunner,而不是TAPPlugin。