Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

runtests

运行一组测试

说明

results = runtests 运行当前文件夹中的所有测试,并以 TestResult 数组形式返回结果。

示例

results = runtests(tests) 运行一组指定的测试。

示例

results = runtests(tests,Name,Value) 通过由一个或多个 Name,Value 对组参数指定的附加选项运行一组测试。

示例

全部折叠

在当前工作文件夹中创建一个文件夹 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 中运行这些测试。

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

Running runtestsExampleSubFolderTest
.
Done runtestsExampleSubFolderTest
__________

runtests 同时在当前文件夹和子文件夹中运行这些测试。

如果您不指定 runtests 函数的 'IncludeSubfolders' 属性,则它不会在子文件夹中运行测试。

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 的名称将其保存到 MATLAB® 路径上。

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','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.05059 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.062586 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.012159 seconds testing time.

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

输入参数

全部折叠

测试套件,指定为字符串数组、字符向量或字符向量元胞数组。元胞数组中的每个字符向量均可包含测试文件的名称、测试类、测试套件元素、包含您的测试类的包、包含您的测试文件的文件夹或者包含测试文件的工程文件夹的名称。

示例: runtests('ATestFile.m')

示例: runtests('ATestFile/aTest')

示例: runtests('mypackage.MyTestClass')

示例: runtests(pwd)

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

示例: runtests('C:/projects/project1/')

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

示例: runtests(tests,'Name','productA_*') 运行名称以 'productA_' 开头的测试元素。

包含用于定义测试类、函数或脚本的文件的基本文件夹的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参数筛选 TestSuite 数组元素。要使测试框架包含套件中的一个测试,Test 元素必须包含在 BaseFolder 指定的基本文件夹之一中。如果没有 Test 元素与基本文件夹匹配,将返回空测试套件。使用通配符 * 以匹配任何数量的字符。使用问号字符 ? 只匹配一个字符。对于包中定义的测试文件,基本文件夹是顶级包文件夹的父级。

在运行 tests 时应用调试功能的指示符,指定为 falsetrue01)。例如,如果遇到测试失败,框架将暂停执行测试以进入调试模式。

指示是否运行子文件夹中测试的指示符,指定为 falsetrue01)。默认情况下,框架只运行指定文件夹(而不包含其子文件夹)中的测试。

指示是否运行子包中的测试的指示符,指定为 falsetrue01)。默认情况下,框架只运行指定包(而不包含其子包)中的测试。

指示是否包含来自引用工程的测试的指示符,指定为逻辑值 falsetrue。有关引用工程的详细信息,请参阅大型工程组件化

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

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

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

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

无信息

1Terse

最少的信息

2Concise

适中信息量

3Detailed

部分补充信息

4Verbose

大量补充信息

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

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

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

无信息

1Terse

最少的信息

2Concise

适中信息量

3Detailed

部分补充信息

4Verbose

大量补充信息

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

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

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

  • 如果属性值是字符向量元胞数组,MATLAB 将根据元胞数组中的值生成参数名称。否则,MATLAB 将参数名称指定为 value1value2、…、valueN

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

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

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

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

代码覆盖率报告中要涵盖的源代码的路径,指定为字符串数组、字符向量或字符向量元胞数组。将此选项用于 runtests 可运行指定的测试,并为指定的代码文件生成代码覆盖率报告。该报告会显示测试执行了源代码中的哪些行。

源代码位置可以是一个或多个文件夹的绝对或相对路径,也可以是扩展名为 .m.mlx.mlapp 的文件的绝对或相对路径。

示例: runtests(tests,'ReportCoverageFor','mySource.m')

数据类型: char | string | cell

在运行 tests 时应用严格检查的指示符,指定为 falsetrue01)。例如,如果测试发出警告,框架会生成验证失败。

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

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

并行运行测试的指示符,指定为 falsetrue01)。

默认情况下 runtests 串行运行测试。如果您将 UseParallel 设置为 true,则 runtests 会将测试套件分成若干单独的组且并行运行这些组,前提是满足以下条件:

  • 安装了 Parallel Computing Toolbox。

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

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

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

创建或更新在使用特定验证方法的测试中使用的 MAT 文件的指示符,指定为 falsetrue01)。您必须安装 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)

提示

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

  • 从 R2020b 开始,您可以创建支持并行运行测试的独立应用程序(需要 MATLAB Compiler™ 和 Parallel Computing Toolbox)。在代码中使用指令 %#function parallel.Pool,以便 MATLAB Compiler 可以找到并打包并行运行测试所需的所有组件。有关详细信息,请参阅编译 MATLAB 单元测试

  • 从 R2021a 开始,您可以通过启动线程工作进程并行池,然后使用 UseParallel 名称-值对组参数调用 runtests 函数,在基于线程的池上运行测试(需要 Parallel Computing Toolbox)。

    在基于线程的池上使用 runtests 运行的测试存在以下限制:

    • 您的测试和源代码必须只使用线程工作进程支持的功能。有关基于线程的环境的限制的详细信息,请参阅Choose Between Thread-Based and Process-Based Environments (Parallel Computing Toolbox)

    • 定义测试内容的文件夹必须位于 MATLAB 搜索路径中。

    • 必须使用类或函数的名称来指定测试名称,不带文件扩展名。

    • 基于线程的池不支持存储测试工件。

    • 基于线程的环境不支持 Simulink。因此,使用 Simulink Test 编写的测试无法在基于线程的池上运行。

扩展功能

在 R2013b 中推出