Main Content

スクリプトを使用したカバレッジ データの解析

この例では、スクリプトを使用してカバレッジ データを読み込み、解析し、クエリする方法を説明します。

カバレッジ データの読み込み

モデルを読み込み、補助スクリプト setupCoverage を使用します。このスクリプトは、カバレッジを有効にしたシミュレーション シナリオを作成します。これを使用してモデルをシミュレートし、カバレッジ結果を含む Simulink.SimulationOutput オブジェクトを生成します。

load_system('slvnvdemo_ratelim_harness');
setupCoverage
simOut = sim(covSet);
covData = simOut.covData;

カバレッジ データ オブジェクトからの情報の抽出

decisioninfoを使用して、ブロック パスまたはブロック ハンドルからカバレッジ情報を取得します。出力は、単一のモデル オブジェクトの達成された結果と全体の結果を含むベクトルです。

subsysCov = decisioninfo(covData,...
                   'slvnvdemo_ratelim_harness/Adjustable Rate Limiter')
subsysCov =

     5     6

decisioninfo を使用して、達成されたカバレッジの割合を判別します。

percentCov = 100 * (subsysCov(1)/subsysCov(2))
percentCov =

   83.3333

decisioninfo を使用して、Apply Limited Gain と呼ばれる switch ブロックの判定カバレッジ データを抽出するかどうかを指定します。判定と結果を含む構造体が返されます。

[blockCov,desc] = decisioninfo(covData, ...
         ['slvnvdemo_ratelim_harness/Adjustable Rate Limiter'...
                                       '/Apply limited gain']);
descDecision = desc.decision;
outcome1 = desc.decision.outcome(1)
outcome2 = desc.decision.outcome(2)
outcome1 = 

  struct with fields:

               text: 'false (out = in3)'
     executionCount: 0
         executedIn: []
         isFiltered: 0
        isJustified: 0
    filterRationale: ''


outcome2 = 

  struct with fields:

               text: 'true (out = in1)'
     executionCount: 101
         executedIn: []
         isFiltered: 0
        isJustified: 0
    filterRationale: ''

decisioninfo 出力から、false の場合の executionCount フィールドが 0 の値であるため、Apply Limited Gain と呼ばれる switch ブロックが false になることはなかったことがわかります。この動作が想定される場合で、かつテストでこの場合を実行する意図がなかった場合、slcoverage.Filterクラスを使用してフィルターの規則を追加してこの未達カバレッジを正当化できます。

最初に、フィルター対象とするブロック インスタンスをクエリします。これは、不完全なカバレッジを受け取った 1 つのブロック インスタンスをフィルター処理することだけが必要なのであって、そのブロック タイプのすべてのインスタンスをフィルター処理する必要はないためです。次に、slcoverage.BlockSelectorクラスを BlockInstance セレクター タイプと共に使用して、フィルター処理する 1 つのブロック インスタンスを特定します。

id = getSimulinkBlockHandle( ...
   'slvnvdemo_ratelim_harness/Adjustable Rate Limiter/Apply limited gain');
sel = slcoverage.BlockSelector( ...
    slcoverage.BlockSelectorType.BlockInstance,id);

slcoverage.Filterクラスおよびslcoverage.FilterRuleクラスを使用して、フィルター オブジェクトとフィルターの規則を作成します。

filt = slcoverage.Filter;
rule = slcoverage.FilterRule( ...
    sel,'Edge case',slcoverage.FilterMode.Justify);

addRule メソッドを使用して、規則をフィルターに追加します。次に、新しいフィルター ファイルを save メソッドを使用して保存します。

filt.addRule(rule);
filt.save('blfilter');

カバレッジ データにフィルターを適用するには、cvdata オブジェクトの filter プロパティをフィルター ファイルの名前に設定します。フィルターされたカバレッジ データに対して decisioninfo を使用して、正当化されたオブジェクティブが達成としてカウントされているため、100% の判定カバレッジとなっていることを確認します。

covData.filter = 'blfilter';
newCov = decisioninfo(covData,...
                   'slvnvdemo_ratelim_harness/Adjustable Rate Limiter')
percentNewCov = 100 * (newCov(1)/newCov(2))
newCov =

     6     6


percentNewCov =

   100

参考

| | | | | |

関連するトピック