【问题标题】:Unit testing/continuous integration with Simulink/Stateflow单元测试/与 Simulink/Stateflow 的持续集成
【发布时间】:2011-09-07 14:07:43
【问题描述】:

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

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

我在 Stackoverflow 上找到了一些链接:Unit-testing framework for MATLAB:xunit、slunit 和 doctest。

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

【问题讨论】:

    标签: unit-testing matlab continuous-integration simulink stateflow


    【解决方案1】:

    编辑:现在使用Jenkins plugin for MATLAB 变得更加容易并且越来越容易

    原始答案:

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

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

    /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;
    

    编辑:我将此主题用作今年推出的 new developer oriented blog 的 first two 帖子

    【讨论】:

    • 是的,最后。 R2013 开始成为专业软件开发的真正平台,R2014 变得更好。基本配置管理也是一个很好的补充。早在 2011 年,它就严重丢失了,很高兴他们赶上了。
    • 我也在尝试在 simulink 模型上设置单元测试,并使用 matlab.unittest 框架,使用上面的示例我得到一个带有测试结果的 tapFile,但也想导出覆盖信息,即我从测试中运行 cvsim 得到。有什么想法吗?
    【解决方案2】:

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

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

    【讨论】:

    • 非常正确。通常将 Simulink 模型视为整体块;还有 Mathworks,但我更喜欢的方法是小型、可独立测试的块,可以由一组人并行处理。此外,Mathworks 倾向于提出另一种新工具(具有独立的许可方案,并非所有团队成员都很少需要)。生活中一些美好的事物是免费的;我相信 xUnit 就是其中之一......可能是 Matlab/Simulink/Stateflow 社区还没有为敏捷/测试驱动开发做好准备。感谢您为此提供赏金。
    【解决方案3】:

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

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

    【讨论】:

    • Simulink Test 看起来非常有用,并且解决了问题的测试部分,您对与 CI 系统集成有什么想法吗?
    • 您可以从命令行运行 matlab 脚本。我使用 teamcity 进行编排,使用 matlab 脚本运行测试。查看 matlab.unittest.plugins.TAPPlugin 以在 CI 前端查看您的测试报告。
    【解决方案4】:

    R2016b 引入了 Simulink Test 和 MATLAB Unit Testing framework 之间的集成。使用测试管理器 (*.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 测试一起放在同一个测试套件中,并让它们无缝地一起运行。例如,如果您的目录 MYDIR 包含原生 MATLAB 单元测试和 Simulink 测试,您可以执行如下简单的操作来一次性执行两种测试:

    结果 = 运行测试(MYDIR)

    【讨论】:

      【解决方案5】:

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

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

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

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

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

      【讨论】:

      • 这个答案并没有真正的帮助,但看起来它会得到赏金,除非有人想出更好的东西。
      • 我已经这样做了,目的是使用 SVN 进行版本管理。对于测试,我预见到了大问题。特别是,因为一个小的变化将需要编译一个新的“正确”输出。
      【解决方案6】:

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

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

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

      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`。

      【讨论】:

      • 快速修正。 MATLAB 单元测试框架是在 R2013a 中引入的。但是在 R2013b 和 R2014a 中添加了其他功能。
      【解决方案7】:

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

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

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

      【讨论】:

        【解决方案8】:

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

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

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

        【讨论】:

        • 当然,您可以对生成的代码进行单元测试。但我一直在寻找模型和算法的证据。单元测试可以在代码生成后重用,以证明生成的代码产生相同的结果。我已经通过对大型数据集的集成测试完成了这项工作。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多