スクリプトを使用したカバレッジ データの解析
この例では、スクリプトを使用してカバレッジ データを読み込み、解析し、クエリする方法を説明します。
カバレッジ データの読み込み
モデルを読み込み、補助スクリプト 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
参考
cvdata
| decisioninfo
| slcoverage.Filter
| slcoverage.FilterRule
| slcoverage.BlockSelector
| slcoverage.MetricSelector
| slcoverage.Selector