更新:这在 R2017a 中现在更加精简,包括FigureDiagnostic和ScreenshotDiagnostic。在沿着这条路走得太远之前先检查一下!
原始答案
您不仅可以针对失败条件执行此操作,还可以结合自定义诊断和 DiagnosticsValidationPlugin 为通过条件执行此操作。您可以使用函数句柄快速完成此操作,但如果这是您发现您希望在许多测试中经常执行的操作,请考虑创建您自己的 Diagnostic 子类:
classdef PlotDiagnostic < matlab.unittest.diagnostics.Diagnostic
properties
Title
Actual
Expected
end
methods
function diag = PlotDiagnostic(title, actual, expected)
diag.Title = title;
diag.Actual = actual;
diag.Expected = expected;
end
function diagnose(diag)
diag.DiagnosticResult = sprintf('Generating plot with title "%s"', diag.Title);
f = figure('Title', diag.Title);
ax = axes('Parent', f);
plot(ax, 1:numel(diag.Actual), diag.Actual, 'r', 1:numel(diag.Expected), diag.Expected','b');
end
end
end
然后你可以有一个像这样使用它的测试:
classdef FooTest < matlab.unittest.TestCase
methods(Test)
function testFails(testCase)
actual = 1:10;
expected = fliplr(actual);
testCase.verifyEqual(actual, expected, PlotDiagnostic('Title1', actual, expected));
end
function testPasses(testCase)
actual = 1:10;
expected = actual;
testCase.verifyEqual(actual, expected, PlotDiagnostic('Title2', actual, expected));
end
end
end
现在,一旦您将它们作为测试诊断,您将在故障条件下看到它们。但是,您也可以使用 DiagnosticsValidationPlugin 在通过条件下查看它们,即使在通过条件下也会评估诊断,以确保诊断代码没有错误(如果无法从真正的故障中捕获诊断信息,那将是超级蹩脚的,因为存在错误通常不使用的诊断代码)。这看起来像:
>> import matlab.unittest.*;
>> runner = TestRunner.withNoPlugins;
>> runner.addPlugin(matlab.unittest.plugins.DiagnosticsValidationPlugin);
>> suite = TestSuite.fromClass(?FooTest);
>> runner.run(suite)
请注意,从 R2014a 开始,您可以编写自己的插件来监听这些传递的诊断信息,而不是使用 DiagnosticsValidationPlugin。实际上,在这个例子中,我们并没有使用这个插件来验证诊断是否没有错误,所以最好在考虑到这个特定目的的情况下编写一个自定义插件。
此外,在 R2014b 中,您可以利用log 方法将其连接到不同的表盘。如果您愿意,可以致电:
testCase.log(Verbosity.Detailed, PlotDiagnostic('Title2', actual, expected));
例如,当您在“详细”详细级别使用LoggingPlugin时,您只会看到这些图。