24

Simulink またはできれば Stateflow で単体テストを実行するにはどうすればよいですか?

私は、テスト駆動開発を含むアジャイル ソフトウェア手法のファンです。私はセーフティ クリティカル コントロール ソフトウェアの開発を担当しており、その開発には Matlab/Simulink/Stateflow を使用しています。このツールセットを選択したのは、プラント (ハードウェア) モデルとのリンクのためです。(モデルインザループ、ハードウェアインザループ)

Stackoverflow でいくつかのリンクを見つけました: MATLAB のユニット テスト フレームワーク: xunitslunit、およびdoctest

  • これらまたは別の単体テスト フレームワークを使用した経験のある人はいますか?
  • これを継続的インテグレーション システム (つまり Hudson) にリンクするにはどうすればよいですか?
4

8 に答える 8

9

編集:これは、MATLAB 用の Jenkins プラグインを使用すると、はるかに簡単になり、常に簡単になっています。

元の答え:

Craig が述べたように、R2013a で導入された MATLAB には実際にフレームワークがあります。さらに、このフレームワークはR2014a でTest Anything Protocalを出力する TAPPlugin を追加しました。そのプロトコルを使用すると、テストが失敗した場合に CI システムがビルドに失敗できるように、TAPPlugin ( JenkinsTeamCity など) で CI ビルドをセットアップできます。

CI ビルドは、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;

編集:このトピックは、今年開始された新しい開発者向けブログの最初の 2 つの投稿として使用しました。

于 2014-04-28T17:43:24.703 に答える
4

残念ながら、Simulinkの単体テストは簡単ではありません。MathworksにはSystemTestがあります。または、独自のSimulinkテストフレームワークを使用することもできます。これは、私たちが従ったアプローチであり、それほど難しくはありませんが、プログラムでテストハーネスを構築する必要がある場合があります。

CIと統合するには、すべてのテストを実行する関数/スクリプトを作成する必要があります。次に、MATLAB.exeのコマンドラインパラメーターを使用して、起動時にスクリプトを実行できます。ただし、テストレポートをCIソフトウェアと統合する良い方法があるかどうかはわかりません。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 に答える
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
)

Run_Tests.m` startup.m exists in the directory that you call Matlab from, then it'll be executed automatically before.

于 2014-04-14T16:22:20.827 に答える
2

システムが複雑な場合は、モデル参照を使用して分解し、それぞれを個別にテストする必要があります。

もう 1 つの解決策 (より「古い学校」) は、メイン ブロックをライブラリに配置し、小さなモデルを作成することです。

これらのサブモデル、特にステート マシン (Stateflow) を使用するサブモデルをテストするには、Signal builderブロックを使用して一時的なテスト ケースを作成するのが最適です。signalbuilderこのブロックを操作してテスト ケースをロードするための強力な機能があります。私の方法は、各サブモデルのケースごとに入力ファイルと出力ファイルを取得することです。モデルの出力は、「正しい」出力とブロックからの出力です。モデルはsim(外部入力なし) で実行され、2 つの出力がスクリプトと比較され、どの信号が (いつ) 異なるかが示されます。

既存のシステムを使用することもできますが、私は独自のシステムを使用して各ケース (またはそれらの一部) を実行することを好みます。

そのための公開コードはありませんが、それが私が使用する方法です。私は CIS を使用していないため、質問の 2 番目の部分にはお答えできません。

于 2011-10-26T07:30:32.200 に答える
0

Simulink モデルの単体テストの問題に対するさまざまな解決策を見てきました。テスト ランナーとテスト スイートの xUnit の概念を検討の時点でサポートしていなかったSimulink Verification & Validation 、 TPTは機能が過負荷であり、使いやすくなく、変更性と保守性の点で非常に困難でした。

さらに、Matlab スクリプトと Excel テーブルを使用したカスタム ソリューションを見てきました。これらは軽量ですが、理解しやすさと保守性の点で困難でした。少なくとも単体テストでは、これらのアプローチを使用することはまだお勧めしません。

最終的に、生成されたコードをテストする C 単体テスト フレームワーク ( CUnit ) を使用することになりました。これには、テスト前にコードを生成しなければならないという欠点がありますが、CI システムへの簡単な統合、単体テストを作成する柔軟性の高さ、単体テストの高速実行、および最後に重要なリファクタリング機能など、多くの利点もあります。 Simulink から別のモデルベースの環境または手書きのコードに切り替える条件。特に最後の点を過小評価してはいけません。なぜなら、そもそも手書きのモジュールであるはずの Simulink モデルを数多く見てきたためです。最近では、代わりにGoogleTestを使用することをお勧めしますCUnit

于 2016-06-24T12:16:38.190 に答える
0

EZTESTのようなものを探していると思います。これは、ユニット レベルでの Simulink および Stateflow のテスト駆動型開発という特別な目的のために用意されています。安全性が重要なソフトウェアについては、ISO 26262 に関して何がカバーされているかを説明するセーフティ マニュアルも含まれています。

編集: 私はこのソフトウェアの開発者であるため、私の意見は偏っている可能性があります。しかし、私は製品のマーケティングや販売には関与していません。質問者のニーズを満たすユニットテストフレームワークがほとんどまたはまったくないことを知っているので、これを投稿しているだけです(回答が想定しているように)。

SIL と PIL を使用したユニットのテストもサポートされています。残念ながら、私はハドソンに詳しくないので、質問のこの部分に対処することはできません.

于 2016-02-15T07:33:38.387 に答える