扩展基于函数的测试
通常,使用基于函数的测试,您可以创建测试文件并将文件名传递到 runtests
函数,而无需显式创建 Test
对象套件。不过,如果您创建显式测试套件,则基于函数的测试中会提供其他功能。这些功能包括:
测试日志记录和详细程度
测试选择
用于自定义测试运行程序的插件
有关其他功能,请考虑使用基于类的单元测试。
设置和拆解代码的脚手架
编写测试时,请使用 applyFixture
方法处理设置和拆解代码,以用于以下操作:
更改当前工作文件夹
向路径中添加文件夹
创建临时文件夹
取消警告的显示
使用这些脚手架
,您就不必在基于函数的测试的 setupOnce
、teardownOnce
、setup
和 teardown
函数中对操作进行手动编码。
例如,如果您手动编写设置和拆解代码,为每个测试设置一个临时文件夹,然后您将该文件夹作为当前工作文件夹,则您的 setup
和 teardown
函数可能类似于如下所示。
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
)中使用'Name'
名称-值对组参数。使用
selectors
实例和可选的constraints
实例。
在套件生成方法(如 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
方法,则测试框架会创建完整的测试套件,然后对套件进行过滤。对于大型测试套件,此方法可能会影响性能。
测试运行
可以通过多种方式运行基于函数的测试。
有关详细信息,请参阅为各个工作流运行测试。
以编程方式访问测试诊断
在某些情况下,测试框架使用 DiagnosticsRecordingPlugin
插件来记录对测试结果的诊断。如果您执行以下任一操作,框架将默认使用该插件:
使用
runtests
函数运行测试。使用不带输入的
testrunner
函数运行测试。使用
runperf
函数运行性能测试。使用
TimeExperiment
类的run
方法运行性能测试。
运行测试后,您可以使用 TestResult
对象上 Details
属性中的 DiagnosticRecord
字段访问记录的诊断数据。例如,如果您的测试结果存储在变量 results
中,则 result(2).Details.DiagnosticRecord
包含套件中第二个测试记录的诊断信息。
记录的诊断信息是 DiagnosticRecord
对象。要访问某测试的特定类型测试诊断信息,请使用 DiagnosticRecord
类的 selectFailed
、selectPassed
、selectIncomplete
和 selectLogged
方法。
默认情况下,DiagnosticsRecordingPlugin
插件会记录在 matlab.automation.Verbosity.Terse
详细级别记录的验证失败和事件。有关详细信息,请参阅 DiagnosticsRecordingPlugin
和 DiagnosticRecord
。
测试运行程序自定义
使用 TestRunner
对象自定义框架运行测试套件的方式。通过 TestRunner
对象,您可以:
使用
withNoPlugins
方法不在命令行窗口中生成任何输出。使用
runInParallel
方法并行运行测试。使用
addPlugin
方法向测试运行程序添加插件。
例如,使用测试套件 suite
创建一个静默测试运行程序,并使用 TestRunner
的 run
方法运行测试。
runner = matlab.unittest.TestRunner.withNoPlugins; results = runner.run(suite);
使用插件可进一步自定义测试运行程序。例如,您可以重定向输出,确定代码覆盖率,或更改测试运行程序响应警告的方式。有关详细信息,请参阅向测试运行程序添加插件和 plugins
类。
另请参阅
matlab.unittest.TestCase
| matlab.unittest.TestSuite
| matlab.automation.diagnostics.Diagnostic
| matlab.unittest.qualifications
| matlab.unittest.constraints
| matlab.unittest.selectors