Main Content

本页采用了机器翻译。点击此处可查看英文原文。

使用基于 MATLAB 的 Simulink 测试的测试模型

基于 MATLAB® 的 Simulink® 测试在您在 MATLAB 中创建的 MATLAB 代码(.m)文件中定义,然后在测试管理器中打开、运行并查看结果。测试文件是一个从 sltest.TestCase 继承的类定义文件。继承使您能够在测试管理器中打开测试文件。当您在测试管理器中打开 MATLAB 测试文件时,它的外观和行为与在测试管理器中创建的测试相同,但功能有限(参见 基于 MATLAB 的测试的局限性)。除了在测试管理器中使用 MATLAB 测试之外,您还可以在命令行中使用 MATLAB 测试,就像任何其他单元测试文件一样。

因为这些测试文件是文本(.m)文件,所以您可以编辑、比较和合并其他 .m 测试文件,并将文件链接到需求。相比之下,在测试管理器中或使用 Simulink Test™ API 创建的测试文件将保存为二进制 MLDATX 文件。

类和方法

TestCase 类和方法

sltest.TestCase 类及其方法专门用于 MATLAB 测试。您可以在测试文件和命令行中使用这些方法,但 sltest.TestCase.forInteractiveUse 除外,它只能在命令行中使用。除了这些方法之外,您还可以将 matlab.unittest.TestCase 方法与 MATLAB 测试一起使用。

sltest.TestCase

继承自的类

loadSystem

负荷模型

simulate

仿真模型

assumeSignalsMatch

假设两组数据等价

assertSignalsMatch

断言两组数据是等价的

fatalAssertSignalsMatch

致命断言两组数据是等效的

verifySignalsMatch

验证两组数据是否等效

sltest.TestCase.forInteractiveUse

创建在命令行使用的测试用例

createTemporaryFolder

创建临时文件夹,当测试用例超出范围时删除该文件夹
createSimulationInput创建 Simulink.SimulationInputsltest.harness.SimulationInput 对象。

测试框架类

sltest.harness.SimulationInput 创建一个对象,您可以使用它来指定在仿真期间应用于测试框架的更改。除了使用此类进行基于 MATLAB 的 Simulink 测试之外,您还可以在其他 MATLAB 代码中使用它。

测试运行器方法

这些 matlab.unittest.TestRunner 方法专门适用于基于 MATLAB 的 Simulink 测试。

  • addModelCoverage — 使用测试运行器启用模型覆盖率收集。如果您不使用此方法,而是在测试管理器中打开基于 MATLAB 的 Simulink 测试文件,则可以在那里启用覆盖率收集。

  • addSimulinkTestResults — 将测试结果推送至 Simulink 测试管理器。

插件类

这些 sltest.plugins 类为基于 MATLAB 的测试启用功能。除了这些方法之外,您还可以在这些测试中使用其他 sltest.plugins 类。可以将插件附加到 matlab.unittest.TestRunner 以在运行 sltest.TestCase 测试时启用功能。

sltest.plugins.MATLABTestCaseIntegrationPlugin

启用将 MATLAB 测试仿真和测试结果与测试管理器集成

sltest.plugins.ToTestManagerLog

允许将文本输出写入测试管理器测试管理器记录的信号窗格

sltest.plugins.ModelCoveragePlugin

启用收集模型覆盖率

创建基于基线 MATLABSimulink 测试

要创建基线 MATLAB 测试:

  1. 创建定义测试用例的 MATLAB 代码(.m)文件。您可以从命令行启动 MATLAB 编辑器,或者使用 新建 > 测试用例 > 基于 MATLAB 的 Simulink 测试 从测试管理器启动。

    参见 在 MATLAB 中编写基于类的单元测试。对于 MATLAB 测试来说,唯一的区别是该类必须继承自 sltest.TestCase,而不是继承自 matlab.unittest.TestCase

    此示例 MATLAB 测试文件包含一个测试,该测试在 testOne 函数中定义。当您在测试管理器中运行测试时,测试会加载名为 sltestMATLABBasedTestExample 的模型。然后它设置 gain2_var 变量的值,并仿真模型。最后,测试将模型仿真输出与基线数据 MAT 文件进行比较。

    classdef myTest < sltest.TestCase
       methods (Test)
          function testOne(testCase)
             testCase.loadSystem...
               ('sltestMATLABBasedTestExample');
             evalin('base','gain2_var = 2.01;');
             simOut = testCase.simulate...
               ('sltestMATLABBasedTestExample');
             testCase.verifySignalsMatch(simOut,'baselineOne.mat',...
               'AbsTol',0.015);
          end
       end
    end
    
  2. 如果您正在使用测试框架,请将上述 MATLAB 测试文件中的 simOut 行替换为

    simOut = testCase.simulate('sltestMATLABBasedTestExample',...
      'WithHarness','sltestMATLABBasedTestExample_harness1');
    或者,要指定停止仿真时间,请将 simOut 替换为
    in = testCase.createSimulationInput('sltestMATLABBasedTestExample',...
      'WithHarness','sltestMATLABBasedTestExample_harness1');
    in = in.setModelParameter("StopTime","10")
    simOut = testCase.simulate(in);
    

  3. 如果基线数据 MAT 文件尚不存在或者您需要更新它,请在 MATLAB 命令行中使用:

    runtests(<test>,'GenerateBaselines',true)

    对于示例文件,<test> 是 ''myTest/testOne'

    当您生成基线时,测试就开始运行。它会暂停以打开仿真数据检查器报告,并提示您在 MATLAB 命令行上查看基线数据。当您批准数据时,它会将基线数据保存到新的 MAT 文件或更新现有的 MAT 文件。然后,测试继续运行,但由于当前运行中不包含新的或更新的基线数据而失败。使用 runtests 命令重新运行测试以使用新的或更新的基线并产生通过结果。您还可以使用命令行中的黄色 rerun 超链接重新运行测试。

  4. 或者,如果您拥有 Simulink Coverage™ 许可证,则可以使用 sltest.plugins.ModelCoveragePlugin 在测试中包含覆盖率收集。请参阅使用基于 MATLAB 的 Simulink 测试收集覆盖率 了解示例和有关覆盖率收集的信息。

    或者,您可以使用测试管理器来收集覆盖率。在测试管理器中打开测试文件后,选择测试文件,选择覆盖率设置选项,然后选择覆盖率度量。文件中的测试套件和测试用例从测试文件继承覆盖率设置。如果您在测试管理器中设置了覆盖率收集和度量,则无需将覆盖率插件导入或添加到 runner

    如果您在测试管理器中设置覆盖率度量,然后关闭测试管理器,则覆盖率设置不会保存到基于 MATLAB 的 Simulink 测试代码(.m)文件中。

  5. 或者,如果您有 Requirements Toolbox™ 许可证,您可以添加需求。打开测试管理器并更新测试文件。

    1. 单击打开 > 打开基于 MATLAB 的 Simulink 测试( m)并选择测试文件。测试文件加载并且其测试层次结构显示在测试浏览器窗格中。如果您选择测试文件,测试管理器中将出现需求测试文件内容窗格。

    2. 通过单击添加展开需求部分来打开传出链接编辑器,从而添加需求。有关添加需求的信息,请参阅链接至需求

  6. 要从测试管理器更新 MATLAB 代码(.m)测试文件,点击在 MATLAB 编辑器中打开测试链接。

  7. 编辑代码文件并保存更改后,或者添加覆盖率或需求后,返回测试管理器并点击测试浏览器窗格中测试文件旁边的同步按钮

  8. 运行测试,查看结果并创建测试结果报告。

    1. 单击运行运行测试。

    2. 要查看结果,请展开结果和工件窗格中的行。

    3. 要查看覆盖率结果,请在结果和工件窗格中选择结果项并展开聚合覆盖率部分。请参阅收集测试覆盖率了解信息。

    4. 或者,创建测试结果报告。参见 创建、设置选项并使用测试结果报告模板

或者,您不需要在测试管理器中添加覆盖率(步骤 4)和运行测试(步骤 8),而是可以在 MATLAB 命令行中使用这些命令来添加覆盖率、运行测试,并将结果推送到测试管理器。然后,当您打开测试管理器时,就会显示测试结果。

suite = testsuite('myTests');
runner = testrunner('textoutput');
runner.addModelCoverage(...
   "CollectMetrics",["MCDC","Condition"]);
runner.addSimulinkTestResults("ExportToFile",...
   "testmgr_results.mldatx");
runner.run(suite);

从基于 MATLABSimulink 测试文件链接到需求

注意

您必须有 Requirements Toolbox 才能包含需求链接。

要从 MATLAB 编辑器中正在编辑的文件中添加需求链接,请参阅 MATLAB 代码的需求可追溯性 (Requirements Toolbox)。对于 MATLAB 测试文件,您可以使用相同的过程添加链接。但是,您在 MATLAB 代码(.m)文件中选择的文本决定了链接的类型以及要添加该链接的测试。如果您选择:

  • 类定义行(例如,classdef myClass < sltest.TestCase)— 为整个测试文件添加 Verified By 链接

  • 测试函数内的文本 — 为该函数添加 Verified By 链接

  • 跨多个测试函数的文本 — 为所选中的第一个函数添加 Verified By 链接

  • 选定任何其他文本 — 为选定内容添加 Related To 链接

添加需求链接后,您可以通过单击 显示 > 验证状态 在需求编辑器中查看验证状态。要更新 Verified By 需求的状态,请右键单击该需求并选择运行测试。参见 审查需求验证状态 (Requirements Toolbox)

您在 MATLAB 代码(.m)文件中创建的链接会出现在测试管理器的需求部分中。从测试管理器中链接到需求与 链接至需求 中描述的相同。

当您打开需求编辑器并点击用于 MATLAB 测试的传入链接时,如果您拥有 Simulink Test 许可证,则测试管理器将打开并转到相关测试。如果没有可用的许可证,则 MATLAB 编辑器将打开并转到与该需求相关的代码行。

对于参数化测试,Requirements Toolbox 不支持链接到测试的单独参数化版本。在您的 .m 文件中,如果您创建从参数化测试到需求的链接,则该链接将与该测试的所有版本相关联。在测试管理器中,如果您创建从参数化测试的某个版本到某个需求的链接,则该链接将与该测试的所有版本相关联。

基于 MATLAB 的测试的局限性

基于 MATLAB 的 Simulink 测试不支持:

  • 除基线测试之外的测试类型。

  • 并行运行测试。

  • 在多个版本中运行测试。

  • 测试标签和描述。

  • 回调。(但是,虽然测试管理器不支持基于 MATLAB 的测试的回调,但您可以使用 TestClassSetupTestMethodSetup,或 .m 文件中的装置来实现类似的功能。参见 使用类来编写设置代码和拆解代码。)

  • 逻辑和时序评估。

  • 在测试管理器中,在测试套件或测试文件级别启用覆盖率收集或更改覆盖率度量。

  • 从测试管理器将覆盖率设置保存到基于 MATLAB 的 Simulink 测试 MATLAB 代码(.m)文件。

另请参阅

| | | |

相关主题