24

如何在 Simulink 或者最好是 Stateflow 中执行单元测试?

我是敏捷软件方法的粉丝,包括测试驱动开发。我负责安全关键控制软件的开发,我们使用 Matlab/Simulink/Stateflow 进行开发。之所以选择此工具集,是因为它与工厂(硬件)模型有关联。(模型在环,硬件在环)

我在 Stackoverflow 上找到了一些链接:MATLAB 的单元测试框架xunitslunitdoctest

  • 有没有人有使用这些或不同单元测试框架的经验?
  • 如何将此链接到持续集成系统(即 Hudson)?
4

8 回答 8

9

编辑:现在使用MATLAB 的 Jenkins 插件变得更加容易并且越来越容易

原始答案:

正如 Craig 提到的,R2013a 中确实有一个在 MATLAB 中引入的框架。此外,该框架在 R2014a 中添加了一个TAPPlugin,它输出Test Anything Protocal使用该协议,您可以使用 TAPPlugin(例如JenkinsTeamCity )设置您的 CI 构建,以便在测试失败时 CI 系统可以使构建失败。

您的 CI 构建可能看起来像一个 shell 命令,用于启动 MATLAB 并运行您的所有测试:

/your/path/to/matlab/bin/matlab -nosplash -nodisplay -nodesktop -r "runAllMyTests"

然后 runAllMyTests 创建要运行的套件并在将点击输出重定向到文件的情况下运行它。您需要在此处调整细节,但也许这可以帮助您入门:

function runAllMyTests

import matlab.unittest.TestSuite;
import matlab.unittest.TestRunner;
import matlab.unittest.plugins.TAPPlugin;
import matlab.unittest.plugins.ToFile;

try
    % Create the suite and runner
    suite = TestSuite.fromPackage('packageThatContainsTests', 'IncludingSubpackages', true);
    runner = TestRunner.withTextOutput;
    
    % Add the TAPPlugin directed to a file in the Jenkins workspace
    tapFile = fullfile(getenv('WORKSPACE'), 'testResults.tap');
    runner.addPlugin(TAPPlugin.producingOriginalFormat(ToFile(tapFile)));

    runner.run(suite); 
catch e;
    disp(e.getReport);
    exit(1);
end;
exit force;

编辑:我将此主题用作今年推出的面向开发人员的新博客的 两篇文章

于 2014-04-28T17:43:24.703 回答
4

不幸的是,单元测试 Simulink 并不简单。Mathworks 有SystemTest。或者,您可以推出自己的 Simulink 测试框架,这是我们采用的方法,难度不大,但您可能需要以编程方式构建测试工具。

为了与 CI 集成,您需要创建一个执行所有测试的函数/脚本,然后您可以使用 MATLAB.exe 的命令行参数在启动时运行脚本。不过,我不确定是否有人有将测试报告与 CI 软件集成的好方法。只需看看Unit-testing framework for MATLAB中的注释数量即可。

于 2011-09-29T09:31:12.787 回答
3

随着 2015a,Matlab 引入了一个新产品名称“Simulink Test”。也许这会简化这个混乱。

http://www.mathworks.com/products/simulink-test/features.html#manage-test-plans-and-test-execution

于 2015-03-07T12:16:33.903 回答
3

R2016b 引入了Simulink TestMATLAB 单元测试框架之间的集成。使用测试管理器 (*.mldatx) 使用 Simulink Test 创建的测试可以被 MATLAB Unit Test Runner 识别并且可以在本地运行,因此您可以生成 JUnit 样式的 XML 测试结果或 TAP 测试结果,从而促进持续集成工作流程。

有关更多信息,请参阅此参考:https ://www.mathworks.com/help/sltest/ug/run-test-files-using-matlab-unit-test.html?s_tid=gn_loc_drop

该文档显示了使用 matlab.unittest.plugins.TAPPlugin 生成 TAP 结果的示例,但您可以使用 XMLPlugin ( https://www.mathworks.com/help/matlab/ref/matlab.unittest.plugins.xmlplugin-class.html ) 而不是同样容易。

这应该会在仅 MATLAB 环境中打开更好的集成,即使图中没有 CI,并且能够将 MATLAB 和 Simulink 测试一起放在同一个测试套件中,并让它们无缝地一起运行。例如,如果您有一个包含本地 MATLAB 单元测试和 Simulink 测试的目录 MYDIR,您可以执行如下简单的操作来一次性执行这两种测试:

结果 = 运行测试(MYDIR)

于 2017-01-14T14:36:29.350 回答
2

如果您的系统很复杂,您应该使用模型参考对其进行分解并独立测试其中的每一个。

另一种解决方案(更“老派”)是将主要块放入库中并创建小型模型。

要测试这些子模型,尤其是那些带有状态机 (Stateflow) 的子模型,最好的方法是使用模块创建时间测试用例Signal builder。你有一个强大的功能signalbuilder来与这个块交互并加载测试用例。我的方法是为每个子模型的每种情况获取一个输入文件和一个输出文件。您的模型输出是“正确”输出和块输出。该模型使用sim(无外部输入)运行,并将 2 个输出与指示哪个信号不同(以及何时)的脚本进行比较。

您可以使用现有系统,但我更喜欢使用自己的系统来运行每个案例(或其中一些案例)。

我没有任何公共代码,但这就是我使用的方式。我不使用 CIS,所以我无法回答您问题的第二部分。

于 2011-10-26T07:30:32.200 回答
2

Matlab(自 2013b 起)以Unit Testing Framework的形式内置了对 xUnit 的支持。我没有使用过它,但是因为可以从 Matlab 运行 simulink,sim()所以这个框架可以用来测试你的 simulink 模型。正如其他回答者所指出的那样,您的库和可能的模型将需要一个包装器来执行它。

Mathworks 网站上有很多示例,遗憾的是没有一个示例运行 simulink 模型。我会为你编写一个示例,但我没有 ML2013b :-(

为了从 CI 启动测试(我使用 Jenkins),您可以调用 matlab 来运行运行测试套件的 .m 文件,此示例 cmd 脚本Run_Tests.m将从 Matlab 调用:

IF EXIST "C:\Program Files (x86)\MATLAB\R2013b\bin\win32\matlab.exe" (
    REM WinXP
    "C:\Program Files (x86)\MATLAB\R2013b\bin\win32\matlab.exe" -r "Run_Tests;exit" -logfile matlab.log
) ELSE (
    REM Win7
    "C:\Program Files\MATLAB\R2013b\bin\win32\matlab.exe" -r "Run_Tests;exit" -logfile matlab.log
)

请注意,如果是startup.m exists in the directory that you call Matlab from, then it'll be executed automatically beforeRun_Tests.m`。

于 2014-04-14T16:22:20.827 回答
0

我认为您正在寻找类似EZTEST的东西。它适用于您的特殊目的:单元级别的 Simulink 和 Stateflow 的测试驱动开发。对于安全关键软件,还包括一份安全手册,其中描述了 ISO 26262 所涵盖的内容。

编辑:我是这个软件的开发者,所以我的意见可能有偏见。但我不参与产品的营销或销售。我只是发布这个,因为我知道几乎没有单元测试框架可以满足提问者的需求(正如答案可能假设的那样)。

还支持使用 SIL 和 PIL 的测试单元。不幸的是,我对 Hudson 不熟悉,所以我无法解决这部分问题。

于 2016-02-15T07:33:38.387 回答
0

我已经看到了对 Simulink 模型进行单元测试的不同解决方案。Simulink Verification & Validation在考试时不支持测试运行器和测试套件的 xUnit 概念,TPT功能超载,不易使用且在可更改性和可维护性方面非常困难。

此外,我还看到了带有 Matlab 脚本和 Excel 表格的自定义解决方案,这些解决方案很轻量级,但在可理解性和可维护性方面也很困难。我仍然不推荐使用这些方法中的任何一种,至少不推荐用于单元测试。

最后,我们最终使用 C 单元测试框架 ( CUnit ) 测试生成的代码。虽然这肯定有你必须在测试之前生成代码的缺点,但它也有很多优点,比如易于集成到 CI 系统中,编写单元测试的高度灵活性,单元测试的快速执行以及最后但并非最不重要的重构能力从 Simulink 切换到另一个基于模型的环境或手写代码的术语。尤其是最后一点不容小觑,因为我见过很多原本应该是手写模块的 Simulink 模型。如今,我建议使用GoogleTest而不是单位

于 2016-06-24T12:16:38.190 回答