Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

扩展基于函数的测试

通常,使用基于函数的测试,您可以创建测试文件并将文件名传递到 runtests 函数,而无需显式创建 Test 对象套件。不过,如果您创建显式测试套件,则基于函数的测试中会提供其他功能。这些功能包括:

  • 测试日志记录和详细程度

  • 测试选择

  • 用于自定义测试运行器的插件

有关其他功能,请考虑使用基于类的单元测试

设置和拆解代码的脚手架

编写测试时,请使用 applyFixture 方法处理设置和拆解代码,以用于以下操作:

  • 更改当前工作文件夹

  • 向路径中添加文件夹

  • 创建临时文件夹

  • 取消警告的显示

使用这些fixtures,您就不必在基于函数的测试的 setupOnceteardownOncesetupteardown 函数中对操作进行手动编码。

例如,如果您手动编写设置和拆解代码,为每个测试设置一个临时文件夹,然后您将该文件夹作为当前工作文件夹,则您的 setupteardown 函数可能类似于如下所示。

function setup(testCase)
% store current folder
testCase.TestData.origPath = pwd;

% create temporary folder
testCase.TestData.tmpFolder = ['tmpFolder' datestr(now,30)];
mkdir(testCase.TestData.tmpFolder)

% change to temporary folder
cd(testCase.TestData.tmpFolder)
end

function teardown(testCase)
% change to original folder
cd(testCase.TestData.origPath)

% delete temporary folder
rmdir(testCase.TestData.tmpFolder)
end

然而,您还可以使用脚手架将这两个函数替换为一个经过修改的 setup 函数。该脚手架会存储必要信息以还原初始状态并执行拆解操作。

function setup(testCase)
% create temporary folder
f = testCase.applyFixture(matlab.unittest.fixtures.TemporaryFolderFixture);

% change to temporary folder
testCase.applyFixture(matlab.unittest.fixtures.CurrentFolderFixture(f.Folder));
end

测试日志记录和详细程度

您的测试函数可以使用 log 方法。默认情况下,测试运行器会报告使用详细级别 1 (Terse) 记录的统计信息。使用 matlab.unittest.plugins.LoggingPlugin.withVerbosity 方法对其他详细级别的消息做出响应。构造一个 TestRunner 对象,添加 LoggingPlugin,并使用 run 方法运行该套件。有关创建测试运行器的详细信息,请参阅测试运行器自定义

测试套件创建

调用基于函数的测试会返回一套 Test 对象。您也可以使用 testsuite 函数或 matlab.unittest.TestSuite.fromFile 方法。如果您需要特定测试并且知道测试名称,则可以使用 matlab.unittest.TestSuite.fromName。如果您要根据特定文件夹中的所有测试来创建套件,则可以使用 matlab.unittest.TestSuite.fromFolder

测试选择

对于显式测试套件,请使用选择器优化您的套件。其中有几个选择器仅适用于基于类的测试,但您可以根据测试名称为您的套件选择测试:

在套件生成方法(如 matlab.unittest.TestSuite.fromFile)中使用这些方法,或使用 selectIf 方法创建套件并对其进行过滤。例如,在此列表中,suite 的四个值等效。

import matlab.unittest.selectors.HasName
import matlab.unittest.constraints.ContainsSubstring
import matlab.unittest.TestSuite.fromFile

f = 'rightTriTolTest.m';
selector = HasName(ContainsSubstring('Triangle'));

% fromFile, name-value pair
suite = TestSuite.fromFile(f,'Name','*Triangle*')

% fromFile, selector
suite = TestSuite.fromFile(f,selector)

% selectIf, name-value pair
fullSuite = TestSuite.fromFile(f);
suite = selectIf(fullSuite,'Name','*Triangle*')

% selectIf, selector
fullSuite = TestSuite.fromFile(f);
suite = selectIf(fullSuite,selector)

如果您对选择器或名称-值对组使用其中一个套件创建方法,则测试框架会创建经过过滤的套件。如果您使用 selectIf 方法,则测试框架会创建完整的测试套件,然后对套件进行过滤。对于大型测试套件,此方法可能会影响性能。

测试运行

可以通过多种方式运行基于函数的测试。

运行所有测试使用函数
文件中runtests 替换为测试文件的名称
在套件中具有套件的 run
在包含自定义测试运行器的套件中run.(请参阅测试运行器自定义。)

有关详细信息,请参阅为各个工作流运行测试

以编程方式访问测试诊断

在某些情况下,测试框架使用 DiagnosticsRecordingPlugin 插件来记录对测试结果的诊断。如果您执行以下任一操作,框架将默认使用该插件:

运行测试后,您可以使用 TestResult 对象上 Details 属性中的 DiagnosticRecord 字段访问记录的诊断数据。例如,如果您的测试结果存储在变量 results 中,则 result(2).Details.DiagnosticRecord 包含套件中第二个测试记录的诊断信息。

记录的诊断信息是 DiagnosticRecord 对象。要访问某测试的特定类型测试诊断信息,请使用 DiagnosticRecord 类的 selectFailedselectPassedselectIncompleteselectLogged 方法。

默认情况下,DiagnosticsRecordingPlugin 插件会记录在 matlab.automation.Verbosity.Terse 详细级别记录的验证失败和事件。有关详细信息,请参阅 DiagnosticsRecordingPluginDiagnosticRecord

测试运行器自定义

使用 TestRunner 对象自定义框架运行测试套件的方式。通过 TestRunner 对象,您可以:

  • 使用 withNoPlugins 方法不在命令行窗口中生成任何输出。

  • 使用 runInParallel 方法并行运行测试。

  • 使用 addPlugin 方法向测试运行器添加插件。

例如,使用测试套件 suite 创建一个静默测试运行器,并使用 TestRunnerrun 方法运行测试。

runner = matlab.unittest.TestRunner.withNoPlugins;
results = runner.run(suite);

使用插件可进一步自定义测试运行器。例如,您可以重定向输出,确定代码覆盖率,或更改测试运行器响应警告的方式。有关详细信息,请参阅向测试运行器添加插件plugins 类。

另请参阅

| | | | |

相关主题