Main Content

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

runtests

运行一组测试

说明

示例

testResults = runtests 运行当前文件夹中的所有测试,并返回测试结果。

示例

testResults = runtests(tests) 运行指定的测试。

示例

testResults = runtests(___,Name,Value) 支持上述语法中的任何输入参量组合,且可使用一个或多个名称-值参量指定选项。例如,testResults = runtests("IncludeSubfolders",true) 运行当前文件夹及其任何子文件夹中的所有测试。

示例

当您指定 ReportCoverageFor 名称-值参量时,[testResults,coverageResults] = runtests(___) 也会返回代码覆盖率分析的结果。 (自 R2023b 起)

示例

全部折叠

在当前工作文件夹中创建一个文件夹 myExample,并进入该文件夹。

myExample 文件夹中,创建一个测试脚本 typeTest.m

%% Test double class
exp = 'double';
act = ones;
assert(isa(act,exp))

%% Test single class
exp = 'single';
act = ones('single');
assert(isa(act,exp))

%% Test uint16 class
exp = 'uint16';
act = ones('uint16');
assert(isa(act,exp))

myExample 文件夹中,创建一个测试脚本 sizeValueTest.m

%% Test size
exp = [7 13];
act = ones([7 13]);
assert(isequal(size(act),exp))

%% Test values
act = ones(42);
assert(unique(act) == 1)

运行当前文件夹中的所有测试。

runtests
Running sizeValueTest
..
Done sizeValueTest
__________

Running typeTest
...
Done typeTest
__________


ans = 

  1x5 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   5 Passed, 0 Failed, 0 Incomplete.
   0.038077 seconds testing time.

MATLAB® 运行了 5 个测试。2 个测试通过 sizeValueTest,3 个测试通过 typeTest

创建如下所示的测试文件,并将其保存为 MATLAB 路径上的 runtestsExampleTest.m

function tests = runtestsExampleTest
tests = functiontests(localfunctions);

function testFunctionOne(testCase)

运行测试。

results = runtests('runtestsExampleTest.m');
Running runtestsExampleTest
.
Done runtestsExampleTest
__________

如果该文件不存在,请根据前面的示例创建 runtestsExampleTest.m 测试文件。

创建一个子文件夹 tmpTest,并在该文件夹中创建以下 runtestsExampleSubfolderTest.m 测试文件。

function tests = runtestsExampleSubfolderTest
tests = functiontests(localfunctions);

function testFunctionTwo(testCase)

通过将 IncludeSubfolders 指定为 true,从上述文件夹 tmpTest 中运行这些测试。runtests 函数同时在当前文件夹和子文件夹中运行这些测试。

results = runtests(pwd,"IncludeSubfolders",true);
Running runtestsExampleTest
.
Done runtestsExampleTest
__________

Running runtestsExampleSubFolderTest
.
Done runtestsExampleSubFolderTest
__________

如果不指定 IncludeSubfolders 名称-值参量,runtests 不会在子文件夹中运行测试。

results = runtests(pwd);
Running runtestsExampleTest
.
Done runtestsExampleTest
__________

如果您的当前文件夹是工程根文件夹,或您将工程根文件夹的路径传递给 runtests 函数,则 runtests 会运行指定工程中标有 Test 分类的所有测试文件。

此示例假设 C:\projects\project1 处的工程文件夹包含标有 Test 分类的测试文件。将当前文件夹更改为工程根文件夹,并在工程中运行测试。

cd 'C:\projects\project1'
runtests

您也可以通过打开 project1 来运行测试。完成后关闭工程。

proj = openProject('C:\projects\project1');
runtests
close(proj)

另一种方法是,通过将工程根文件夹的完整路径传递给 runtests,在工程中运行测试。

runtests('C:\projects\project1')

在当前文件夹中名为 runInParallelTest.m 的文件中创建此基于函数的测试。

function tests = runInParallelTest
tests = functiontests(localfunctions);

function testA(testCase)
verifyEqual(testCase,5,5);

function testB(testCase)
verifyTrue(testCase,logical(1));

function testC(testCase)
verifySubstring(testCase,'SomeLongText','Long');

function testD(testCase)
verifySize(testCase,ones(2,5,3),[2 5 3]);

function testE(testCase)
verifyGreaterThan(testCase,3,2);

function testF(testCase)
verifyEmpty(testCase,{},'Cell array is not empty.');

function testG(testCase)
verifyMatches(testCase,'Some Text','Some [Tt]ext');

并行运行测试。并行运行测试需要 Parallel Computing Toolbox™。测试框架可能会改变组的顺序和数量,或每个组中所包含的测试。

results = runtests("runInParallelTest.m","UseParallel",true);
Split tests into 7 groups and running them on 4 workers.
----------------
Finished Group 2
----------------
Running runInParallelTest
.
Done runInParallelTest
__________


----------------
Finished Group 3
----------------
Running runInParallelTest
.
Done runInParallelTest
__________


----------------
Finished Group 1
----------------
Running runInParallelTest
.
Done runInParallelTest
__________


----------------
Finished Group 4
----------------
Running runInParallelTest
.
Done runInParallelTest
__________


----------------
Finished Group 6
----------------
Running runInParallelTest
.
Done runInParallelTest
__________


----------------
Finished Group 5
----------------
Running runInParallelTest
.
Done runInParallelTest
__________


----------------
Finished Group 7
----------------
Running runInParallelTest
.
Done runInParallelTest
__________

在您的工作文件夹中,创建 testZeros.m。该类包含四种测试方法。

classdef testZeros < matlab.unittest.TestCase
    properties (TestParameter)
        type = {'single','double','uint16'};
        outSize = struct('s2d',[3 3], 's3d',[2 5 4]);
    end
    
    methods (Test)
        function testClass(testCase, type, outSize)
            testCase.verifyClass(zeros(outSize,type), type);
        end
        
        function testSize(testCase, outSize)
            testCase.verifySize(zeros(outSize), outSize);
        end
        
        function testDefaultClass(testCase)
            testCase.verifyClass(zeros, 'double');
        end
        function testDefaultSize(testCase)
            testCase.verifySize(zeros, [1 1]);
        end
        
        function testDefaultValue(testCase)
            testCase.verifyEqual(zeros,0);
        end
    end
end

完整测试套件包含 11 个测试元素:6 来自 testClass 方法,2 个来自 testSize 方法,1 个分别来自 testDefaultClasstestDefaultSizetestDefaultValue 方法。

在命令提示符下,运行 testSize 方法的所有参数化。

runtests('testZeros/testSize')
Running testZeros
..
Done testZeros
__________


ans = 

  1x2 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   2 Passed, 0 Failed, 0 Incomplete.
   0.050904 seconds testing time.

runtests 函数从 testSize 方法执行两个参数化测试。您也可以使用 runtests('testZeros','ProcedureName','testSize') 指定测试过程名称。

运行使用 outSize 参数属性的测试元素。

runtests('testZeros','ParameterProperty','outSize')
Running testZeros
........
Done testZeros
__________


ans = 

  1x8 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   8 Passed, 0 Failed, 0 Incomplete.
   0.066375 seconds testing time.

runtests 函数执行了八个使用 outSize 参数属性的测试:六个来自 testClass 方法,两个来自 testSize 方法。

运行使用 single 参数名称的测试元素。

runtests('testZeros','ParameterName','single')
Running testZeros
..
Done testZeros
__________


ans = 

  1x2 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   2 Passed, 0 Failed, 0 Incomplete.
   0.012586 seconds testing time.

runtests 函数执行了两个来自 testClass 方法并使用 outSize 参数名称的测试。

自 R2023b 起

使用 runtests 函数运行您的测试并收集代码覆盖率结果。

在当前文件夹内一个名为 quadraticSolver.m 的文件中创建 quadraticSolver 函数。该函数接受二次多项式的系数作为输入,并返回该多项式的根。如果系数指定为非数值,该函数将引发错误。

function roots = quadraticSolver(a,b,c)
% quadraticSolver returns solutions to the
% quadratic equation a*x^2 + b*x + c = 0.

if ~isa(a,"numeric") || ~isa(b,"numeric") || ~isa(c,"numeric")
    error("quadraticSolver:InputMustBeNumeric", ...
        "Coefficients must be numeric.")
end

roots(1) = (-b + sqrt(b^2 - 4*a*c)) / (2*a);
roots(2) = (-b - sqrt(b^2 - 4*a*c)) / (2*a);

end

要测试 quadraticSolver 函数,请在当前文件夹内名为 SolverTest.m 的文件中创建 SolverTest 类。针对实数解、虚数解和非数值输入定义三个 Test 方法来测试该函数。

classdef SolverTest < matlab.unittest.TestCase
    methods (Test)
        function realSolution(testCase)
            actSolution = quadraticSolver(1,-3,2);
            expSolution = [2 1];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function imaginarySolution(testCase)
            actSolution = quadraticSolver(1,2,10);
            expSolution = [-1+3i -1-3i];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function nonnumericInput(testCase)
            testCase.verifyError(@()quadraticSolver(1,"-3",2), ...
                "quadraticSolver:InputMustBeNumeric")
        end
    end
end

运行 SolverTest 类中的测试,并通过指定 ReportCoverageFor 名称-值参量来执行代码覆盖率分析。除了生成代码覆盖率报告之外,要以编程方式访问覆盖率结果,请使用两个输出参量调用 runtests 函数。测试运行后,第一个输出包含测试结果,第二个输出包含覆盖率结果。

[testResults,coverageResults] = runtests("SolverTest", ...
    "ReportCoverageFor","quadraticSolver.m")
Running SolverTest
...
Done SolverTest
__________

MATLAB code coverage report has been saved to:
 C:\Temp\tpf83a0edb_55fb_4039_84f8_230a01d5f591\index.html

testResults = 

  1×3 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   3 Passed, 0 Failed, 0 Incomplete.
   1.8685 seconds testing time.


coverageResults = 

  Result with properties:

        Filename: "C:\work\quadraticSolver.m"
    CreationDate: 16-May-2023 15:11:20

Coverage summary (use generateHTMLReport to generate an HTML report):
   Function: 1/1 (100%)
   Statement: 4/4 (100%)

Use coverageSummary to retrieve information from the coverage results.

输入参数

全部折叠

测试,指定为字符串数组、字符向量或字符向量元胞数组。使用此参量指定测试内容。例如,您可以指定测试文件、测试类、包含测试文件的文件夹、包含测试类的包或包含测试文件的工程文件夹。

示例: runtests("myTestFile.m")

示例: runtests(["myTestFile/test1" "myTestFile/test3"])

示例: runtests("mypackage.MyTestClass")

示例: runtests(pwd)

示例: runtests({'mypackage.MyTestClass','myTestFile.m',pwd,'mypackage.subpackage'})

示例: runtests("C:\projects\project1")

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。

示例: results = runtests(tests,Name="productA_*") 运行名称以 "productA_" 开头的 Test 元素。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: results = runtests(tests,"Name","productA_*") 运行名称以 "productA_" 开头的 Test 元素。

测试标识

全部折叠

是否在子文件夹中运行测试,指定为数值或逻辑值 0 (false) 或 1 (true)。默认情况下,框架只运行指定文件夹(而不包含其子文件夹)中的测试。

是否在子包中运行测试,指定为数值或逻辑值 0 (false) 或 1 (true)。默认情况下,框架只运行指定包(而不包含其子包)中的测试。

是否包含来自引用工程的测试,指定为数值或逻辑值 0 (false) 或 1 (true)。有关引用工程的详细信息,请参阅大型工程组件化

对函数正在处理的文件夹或包中的无效测试文件采取的操作,指定为 "warn""error"

  • "warn" - 该函数对文件夹或包中的每个无效测试文件发出警告,并在有效文件中运行测试。

  • "error" - 如果该函数在文件夹或包中发现无效的测试文件,将会引发错误。

无效的测试文件是框架无法运行的测试文件。示例包括:包含语法错误的测试文件、基于函数但缺失局部函数的测试文件,以及具有 Test 方法但向该方法传递了未定义的参数化属性的文件。

测试过滤

全部折叠

包含测试文件的基本文件夹的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参量过滤测试套件。要使测试框架包含经过过滤的套件中的一个测试,Test 元素必须包含在 BaseFolder 指定的基本文件夹之一中。如果没有 Test 元素与基本文件夹匹配,将返回空测试套件。使用通配符 (*) 以匹配任何数量的字符。使用问号字符 (?) 只匹配一个字符。

对于包中定义的测试文件,基本文件夹是顶级包文件夹的父级。

包含源代码的文件和文件夹的名称,指定为字符串向量、字符向量或字符向量元胞向量。此参量过滤测试套件。为了使测试框架在过滤后的套件中包括测试,定义测试的文件必须依赖指定的源代码。如果没有测试文件依赖源代码,则返回空测试套件。

指定的值必须表示至少一个具有 .m.p.mlx.mlapp.mat.slx 扩展名的现有文件。无法用不支持的扩展名显式指定文件名。如果指定文件夹名称,框架将提取该文件夹中受支持文件的路径。

您必须有 MATLAB® Test™ 许可证才能使用 DependsOn。有关通过源代码依存关系选择测试的详细信息,请参阅 matlabtest.selectors.DependsOn (MATLAB Test)

示例: DependsOn=["myFile.m" "myFolder"]

示例: DependsOn=["folderA" "C:\work\folderB"]

测试的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参量过滤测试套件。要使测试框架包含经过过滤的套件中的一个测试,Test 元素的 Name 属性必须匹配 Name 指定的名称之一。如果 Test 元素都没有匹配的名称,将返回空测试套件。使用通配符 (*) 以匹配任何数量的字符。使用问号字符 (?) 只匹配一个字符。

对于一个给定的测试文件,测试的名称唯一地标识测试内容的最小可运行部分。测试名称包括包名称、文件名(不包括扩展名)、过程名称和关于参数化的信息。

定义测试使用的参数的测试类属性的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参量过滤测试套件。要使测试框架包含经过过滤的套件中的一个测试,Test 元素的 Parameterization 属性必须包含 ParameterProperty 指定的至少一个属性名称。如果 Test 元素都没有匹配的属性名称,将返回空测试套件。使用通配符 (*) 以匹配任何数量的字符。使用问号字符 (?) 只匹配一个字符。

测试使用的参数的名称,指定为字符串数组、字符向量或字符向量元胞数组。MATLAB 根据定义参数的测试类属性生成参数名称:

  • 如果属性值是元胞数组,则 MATLAB 根据元胞数组元素的值、类型和维度,基于元胞数组的元素生成参数名称。

  • 如果属性值是结构体,则 MATLAB 将根据结构体字段生成参数名称。

ParameterName 参量过滤测试套件。要使测试框架包含经过过滤的套件中的一个测试,Test 元素的 Parameterization 属性必须包含 ParameterName 指定的至少一个参数名称。如果 Test 元素都没有匹配的参数名称,将返回空测试套件。使用通配符 (*) 以匹配任何数量的字符。使用问号字符 (?) 只匹配一个字符。

测试过程的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参量过滤测试套件。要使测试框架包含经过过滤的套件中的一个测试,Test 元素的 ProcedureName 属性必须匹配 ProcedureName 指定的过程名称之一。如果 Test 元素都没有匹配的过程名称,将返回空测试套件。使用通配符 (*) 以匹配任何数量的字符。使用问号字符 (?) 只匹配一个字符。

在基于类的测试中,测试过程的名称是包含该测试的 Test 方法的名称。在基于函数的测试中,它是包含测试的局部函数的名称。在基于脚本的测试中,它是从测试部分标题生成的名称。与测试套件元素的名称不同,测试过程的名称不包括任何包名称、文件名或关于参数化的信息。

派生测试类的父类的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参量过滤测试套件。要使测试框架包含经过过滤的套件中的一个测试,Test 元素的 TestClass 属性必须指向从 Superclass 指定的类之一派生的一个测试类。如果没有 Test 元素与类匹配,将返回空测试套件。

测试使用的标记的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参量过滤测试套件。要使测试框架包含经过过滤的套件中的一个测试,Test 元素的 Tags 属性必须包含 Tag 指定的至少一个标记名称。如果 Test 元素都没有匹配的标记名称,将返回空测试套件。使用通配符 (*) 以匹配任何数量的字符。使用问号字符 (?) 只匹配一个字符。

测试运行自定义

全部折叠

运行测试时是否应用严格检查,指定为数值或逻辑值 0 (false) 或 1 (true)。例如,如果测试发出警告,框架会生成鉴定失败。

是否并行运行测试,指定为数值或逻辑值 0 (false) 或 1 (true)。

默认情况下,runtests 串行运行测试。如果您将 UseParallel 指定为 true,则 runtests 将测试套件分成组,并在以下情况下并行运行这些组:

  • 安装了 Parallel Computing Toolbox。

  • 存在一个打开的并行池,或者在 Parallel Preferences 中启用了自动池创建。

否则,runtests 以串行方式运行测试,而不管 UseParallel 的值是什么。

并行测试可能与其他选项不兼容。例如,如果 UseParallelDebug 都指定为 true,则以串行方式运行测试。当并行运行测试时,测试框架可能会改变组的顺序和数量,或每个组中所包含的测试。

运行测试时是否应用调试功能,指定为数值或逻辑值 0 (false) 或 1 (true)。例如,如果发生测试失败,框架将暂停执行测试以进入调试模式。

事件详细信息的显示级别,指定为介于 0 和 4 之间的整数值或 matlab.automation.Verbosity 枚举对象。整数值对应于 matlab.automation.Verbosity 枚举的成员。

runtests 函数使用 OutputDetail 指定的信息量来显示失败事件和日志记录事件。默认情况下,runtests 显示 matlab.automation.Verbosity.Detailed 级别(级别 3)的失败事件和记录的事件,以及 matlab.automation.Verbosity.Concise 级别(级别 2)的测试运行进度。

数值表示枚举成员名称详细程度描述
0None

无信息

1Terse

最少的信息

2Concise

适中信息量

3Detailed

部分补充信息

4Verbose

大量补充信息

针对测试运行包含所记录诊断信息的最高详细级别,指定为介于 0 和 4 之间的整数值或 matlab.automation.Verbosity 枚举对象。runtests 函数包含在此级别和更低级别记录的诊断信息。整数值对应于 matlab.automation.Verbosity 枚举的成员。

默认情况下,runtests 包含在 matlab.automation.Verbosity.Terse 级别(级别 1)记录的诊断信息。要排除所记录的诊断信息,请将 LoggingLevel 指定为 Verbosity.None(级别 0)。

记录的诊断信息是您通过调用 log (TestCase)log (Fixture) 方法提供给测试框架的诊断信息。

数值表示枚举成员名称详细程度描述
0None

无信息

1Terse

最少的信息

2Concise

适中信息量

3Detailed

部分补充信息

4Verbose

大量补充信息

工件生成

全部折叠

用于代码覆盖率分析的源文件和文件夹的名称,指定为字符串数组、字符向量或字符向量元胞数组。如果指定相对路径,则该路径必须在当前文件夹中。否则,您必须指定完整路径。您可以指定具有 .m.mlx.mlapp 扩展名的文件夹或文件的路径。

当您指定此参量时,此函数将运行您的测试,并为指定的源代码生成 HTML 代码覆盖率报告。该报告显示由测试执行的源代码的对应部分。如果除了 ReportCoverageFor 之外还指定 coverageResults 输出参量 (自 R2023b 起),则该函数除了生成 HTML 代码覆盖率报告之外,还允许以编程方式访问覆盖率结果。

示例: "ReportCoverageFor",pwd

示例: "ReportCoverageFor",["myFile.m" "myFolder"]

示例: "ReportCoverageFor",["folderA" "C:\work\folderB"]

是否创建或更新在使用特定鉴定方法的测试中使用的 MAT 文件,指定为数值或逻辑值 0 (false) 或 1 (true)。您必须安装 Simulink® Test 才能使用 GenerateBaselines

当您将此参量指定为 true 时,您的测试必须使用 sltest.TestCase (Simulink Test) 类的下列鉴定方法中的至少一个:

  • verifySignalsMatch(例如,testCase.verifySignalsMatch(actVal,"myBaseline.mat")

  • assumeSignalsMatch

  • assertSignalsMatch

  • fatalAssertSignalsMatch

有关详细信息,请参阅Using MATLAB-Based Simulink Tests in the Test Manager (Simulink Test)

输出参量

全部折叠

测试结果,以 matlab.unittest.TestResult 对象的行向量形式返回。向量的每个元素都提供关于运行的测试之一的信息。

自 R2023b 起

覆盖率结果,以 matlab.coverage.Result 对象的列向量形式返回。向量的每个元素都提供关于测试所覆盖的源代码中其中一个文件的信息。

将此参量与 ReportCoverageFor 名称-值参量结合使用,以编程方式访问源代码的代码覆盖率分析结果。

提示

  • 当您在测试中使用共享测试脚手架并将 runtests 函数的输入指定为字符串数组或字符向量元胞数组时,测试框架会对数组进行排序,以减少共享脚手架的设置和拆解操作。因此,测试运行的顺序可能不同于输入数组中元素的顺序。有关详细信息,请参阅 sortByFixtures

  • 当您在远程并行池上运行测试时(需要 MATLAB Parallel Server™ 和 Parallel Computing Toolbox),MATLAB 首先将包含您的测试的本地文件夹复制到远程工作进程。为了最小化与此步骤相关联的开销,请确保这些文件夹只包含与您的测试相关的文件。

扩展功能

版本历史记录

在 R2013b 中推出

全部展开