このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
テスト ケースの作成と実行
この例では、Simulink® Design Verifier™ の関数を使用して、入力信号のログ作成、ハーネス モデルの作成、未達カバレッジのテスト ケースの生成、ハーネス モデルのマージおよびテスト ケースの実行を行う方法を説明します。
この例では、コントローラーを親モデルに実装しているコンポーネントへの入力信号をログに記録し、そのログ データからコントローラーのハーネス モデルを作成することから開始します。Simulink Design Verifier を使用して、未達カバレッジに対応する新しいテスト ケースを検索します。次に、Simulink Design Verifier 解析の後に生成されたハーネス モデルと最初のハーネス モデルをマージします。最後に、すべてのテスト ケースをキャプチャし、それらのテスト ケースを使用してコントローラーをシミュレーション モードとソフトウェアインザループ (SIL) モードで実行して、CGV API を使用して結果を比較します。
製品の可用性のチェック
この例では、有効な Stateflow® ライセンスが必要です。ソフトウェアインザループ (SIL) モードでテスト実行のデモを行うには、有効な Simulink® Coder™ ライセンスおよび Embedded Coder™ ライセンスも必要です。
if ~license('test','Stateflow') return; end canUseSIL = license('test','Real-Time_Workshop') && ... license('test','RTW_Embedded_Coder');
コンポーネントへの入力信号ログの記録およびハーネス モデルの作成
slvnvdemo_powerwindow
モデルには、パワー ウィンドウ コントローラーおよび低次のプラント モデルが含まれます。コンポーネント slvnvdemo_powerwindow/power_window_control_system/control
は、Stateflow® チャートでコントローラーを実装するモデル slvnvdemo_powerwindow_controller
を参照する Model ブロックです。
プラント モデルのコントローラーをシミュレートする信号をもつコントローラーのハーネス モデルを作成するには、まず入力信号のログを記録してから、そのログ データを使用してハーネスの生成を呼び出します。
open_system('slvnvdemo_powerwindow'); load_system('slvnvdemo_powerwindow_controller'); loggedSignalsPlant = ... sldvlogsignals('slvnvdemo_powerwindow/power_window_control_system/control'); harnessModelFilePath = ... sldvmakeharness('slvnvdemo_powerwindow_controller',loggedSignalsPlant); [~,harnessModel] = fileparts(harnessModelFilePath);
### Starting serial model reference simulation build. ### Successfully updated the model reference simulation target for: slvnvdemo_powerwindow_controller Build Summary Simulation targets built: Model Action Rebuild Reason ============================================================================================================================= slvnvdemo_powerwindow_controller Code generated and compiled. slvnvdemo_powerwindow_controller_msf.mexa64 does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 32.185s ### Starting serial model reference simulation build. ### Model reference simulation target for slvnvdemo_powerwindow_controller is up to date. Build Summary 0 of 1 models built (1 models already up to date) Build duration: 0h 0m 0.91029s ### Starting serial model reference simulation build. ### Successfully updated the model reference simulation target for: slvnvdemo_powerwindow_controller Build Summary Simulation targets built: Model Action Rebuild Reason ================================================================================ slvnvdemo_powerwindow_controller Code generated and compiled. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 15.663s
ログ信号によるカバレッジの測定
関数 cvtest
および cvsim
を使用して、ハーネス モデルでキャプチャされたログ信号でコントローラー モデル slvnvdemo_powerwindow_controller
について達成されるモデル カバレッジを測定します。
関数 cvhtml
は、閉ループ モデルからキャプチャされたテスト ケースのシミュレーションの実行によって、40% の判定、35% の条件、10% の MCDC のカバレッジが達成されたことを示すレポートを生成します。
test = cvtest(harnessModel); test.modelRefSettings.enable = 'On'; test.modelRefSettings.excludeTopModel = 1; covDataFromLoggedSignals = cvsim(test); cvhtml('Coverage with Logged Test Cases',covDataFromLoggedSignals);
未達カバレッジのテスト ケースの検索
テスト生成で既存のカバレッジ データを使用する場合は、まずデータをカバレッジ データ ファイル (.cvt) に保存しなければなりません。既存のカバレッジ データを使用するには、Simulink Design Verifier のコンフィギュレーション パラメーターの [テスト生成] ペインで、[既存のカバレッジ データで条件が満たされているオブジェクティブを無視する] パラメーターを on
に設定し、[カバレッジ データ ファイル] パラメーターにカバレッジ データ パスを指定します。
このレポートでもわかるように、Simulink Design Verifier はテストの生成を既存のカバレッジ ファイルでカバーされていないカバレッジ オブジェクティブに制限しています。Stateflow チャート control
の 8 つのカバレッジ オブジェクティブは非達成と証明されています。これは、テストできない不要で冗長なロジックであることを示します。
cvsave('existingCovFromLoggedSignals',covDataFromLoggedSignals); opts = sldvoptions; opts.IgnoreCovSatisfied = 'on'; opts.CoverageDataFile = 'existingCovFromLoggedSignals.cvt'; opts.ModelCoverageObjectives = 'MCDC'; opts.TestSuiteOptimization = 'LongTestcases'; opts.SaveHarnessModel = 'on'; opts.ModelReferenceHarness = 'on'; opts.MaxProcessTime = 500; [status, fileNames] = sldvrun('slvnvdemo_powerwindow_controller',opts,true); [~, newHarnessModel] = fileparts(fileNames.HarnessModel); open_system(newHarnessModel);
ハーネス モデルからのテスト ケースのマージ
ここで、sldvmergeharness
を使用して、生成されたテスト ケースとログに記録されたテスト ケースを結合します。このコマンドは、対象となるハーネス モデルのリストを引数とします。
sldvmergeharness(harnessModel, newHarnessModel);
ハーネス モデルのテスト ケースのログ記録
マージされたハーネス モデルでキャプチャされたテスト ケースを使用してモデル slvnvdemo_powerwindow_controller
をプログラム実行するには、最初に関数 sldvlogsignals
を使用してすべてのテスト ケースの入力値を必要なデータ形式で取得します。
loggedSignalsMergedHarness = sldvlogsignals(harnessModel); disp(loggedSignalsMergedHarness);
LoggedTestUnitInfo: [1x1 struct] TestCases: [1x2 struct]
CGV API によるシミュレーション モードでのモデルの実行
関数 sldvruncgvtest
で、ハーネス モデルからキャプチャされたテスト ケースを使い、シミュレーション モードでモデル slvnvdemo_powerwindow_controller
を実行します。
runopts = sldvruntestopts('cgv'); disp(runopts); runopts.cgvConn = 'sim'; cgvSim = sldvruncgvtest('slvnvdemo_powerwindow_controller',... loggedSignalsMergedHarness,runopts);
testIdx: [] allowCopyModel: 0 cgvCompType: 'topmodel' cgvConn: 'sim' Starting execution: ComponentType: topmodel Connectivity: sim InputData: /tmp/Bdoc23a_2181783_2486966/tpb4f80982/sldv-ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_1.mat End CGV execution: status completed. Starting execution: ComponentType: topmodel Connectivity: sim InputData: /tmp/Bdoc23a_2181783_2486966/tpb4f80982/sldv-ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_2.mat End CGV execution: status completed.
CGV API によるソフトウェアインザループ (SIL) モードでのモデルの実行
今度は関数 sldvruncgvtest
で、同じテスト ケースを使って SIL モードでモデル slvnvdemo_powerwindow_controller
を実行します。
if canUseSIL runopts.cgvConn = 'sil'; else % When SIL is not possible, the example runs another simulation. runopts.cgvConn = 'sim'; end cgvSil = sldvruncgvtest('slvnvdemo_powerwindow_controller',... loggedSignalsMergedHarness,runopts);
Starting execution: ComponentType: topmodel Connectivity: sil InputData: /tmp/Bdoc23a_2181783_2486966/tpb4f80982/sldv-ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_1_1.mat ### Starting build procedure for: slvnvdemo_powerwindow_controller ### Successful completion of build procedure for: slvnvdemo_powerwindow_controller Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================================== slvnvdemo_powerwindow_controller Code generated and compiled. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 20.192s ### Preparing to start SIL simulation ... Building with 'gcc'. MEX completed successfully. ### Starting SIL simulation for component: slvnvdemo_powerwindow_controller ### Application stopped ### Stopping SIL simulation for component: slvnvdemo_powerwindow_controller End CGV execution: status completed. Starting execution: ComponentType: topmodel Connectivity: sil InputData: /tmp/Bdoc23a_2181783_2486966/tpb4f80982/sldv-ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_2_1.mat ### Starting build procedure for: slvnvdemo_powerwindow_controller ### Successful completion of build procedure for: slvnvdemo_powerwindow_controller Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================= slvnvdemo_powerwindow_controller Code generated and compiled. Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 15.114s ### Preparing to start SIL simulation ... Building with 'gcc'. MEX completed successfully. ### Starting SIL simulation for component: slvnvdemo_powerwindow_controller ### Application stopped ### Stopping SIL simulation for component: slvnvdemo_powerwindow_controller End CGV execution: status completed.
シミュレーション モードと SIL モードの結果の比較
sldvruncgvtest
はテストの実行後に cgv.CGV
オブジェクトを返します。CGV API を使用してハーネス モデルで設計された各テスト ケースでシミュレーション モードと SIL モードの実行結果を比較し、それらが同じであることを示します。
for i=1:length(loggedSignalsMergedHarness.TestCases) simout = cgvSim.getOutputData(i); silout = cgvSil.getOutputData(i); [matchNames, ~, mismatchNames, ~ ] = ... cgv.CGV.compare(simout, silout); fprintf('\nTest Case(%d): %d Signals match, %d Signals mismatch', ... i, length(matchNames), length(mismatchNames)); end
Test Case(1): 4 Signals match, 0 Signals mismatch Test Case(2): 4 Signals match, 0 Signals mismatch
クリーン アップ
すべてのモデルを閉じて例を完了します。
close_system(harnessModel,0); close_system(newHarnessModel,0); close_system('slvnvdemo_powerwindow',0); close_system('slvnvdemo_powerwindow_controller',0);