Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

テスト ケースの作成と実行

この例では、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 31.945s
### 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.5846s
### 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.033s

ログ信号によるカバレッジの測定

関数 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/Bdoc21a_1669600_218335/tp95884528/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/Bdoc21a_1669600_218335/tp95884528/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/Bdoc21a_1669600_218335/tp95884528/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 18.926s
### Preparing to start SIL simulation ...
Building with 'gcc'.
MEX completed successfully.
### Starting SIL simulation for component: slvnvdemo_powerwindow_controller
### Stopping SIL simulation for component: slvnvdemo_powerwindow_controller
End CGV execution: status completed.
Starting execution:
  ComponentType: topmodel
  Connectivity: sil
  InputData:
  /tmp/Bdoc21a_1669600_218335/tp95884528/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 12.132s
### Preparing to start SIL simulation ...
Building with 'gcc'.
MEX completed successfully.
### Starting SIL simulation for component: slvnvdemo_powerwindow_controller
### 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);