スクリプトを使用したカバレッジの結果のフィルター
この例では、プログラムでカバレッジ結果からオブジェクトと結果をフィルター処理する方法を説明します。
モデルを開きカバレッジ解析を有効にする
まず、モデルをメモリに読み込みます。
modelName = 'slvnvdemo_covfilt';
load_system(modelName);
Simulink.SimulationInput
オブジェクトを使用してモデルのカバレッジ設定を構成します。
simIn = Simulink.SimulationInput(modelName); simIn = simIn.setModelParameter('CovEnable','on'); simIn = simIn.setModelParameter('CovMetricStructuralLevel','MCDC'); simIn = simIn.setModelParameter('StopTime','20'); simIn = simIn.setModelParameter('CovSaveSingleToWorkspaceVar','on'); simIn = simIn.setModelParameter('CovSaveName','covData');
SimulationInput
オブジェクトを入力として使用してモデルのシミュレーションを行います。
simOut = sim(simIn);
判定カバレッジの結果の表示
フィルターを適用する前に、カバレッジ結果を表示します。decisioninfo
を使用して、判定カバレッジの結果にアクセスできます。
saturationInitial = decisioninfo(covData,'slvnvdemo_covfilt/Saturation');
percentSaturationCov = 100 * saturationInitial(1)/saturationInitial(2)
percentSaturationCov = 50
Saturation ブロックの判定カバレッジは 50% です。このブロックを達成としない場合、未達のオブジェクティブ結果をフィルター処理して、未達カバレッジとしてレポートされることがないようにできます。まず、フィルター処理する非達成のオブジェクティブ結果のセレクターが必要です。
セレクターの作成
適切なコンストラクターを使用してセレクターを直接作成できます。この場合は slcoverage.MetricSelector
を使用します。
正当化されたオブジェクティブが判定結果であるため、メトリクス セレクター コンストラクターへの 1 番目の入力は slcoverage.MetricSelectorType.DecisionOutcome
です。2 番目の入力はブロック ハンドルです。最後の 2 つはそれぞれ、正当化するオブジェクティブのインデックスと、そのオブジェクティブの結果のインデックスです。input > lower limit
判定オブジェクティブが Saturation ブロックの最初のオブジェクティブであるため、そのオブジェクティブのインデックスは 1
です。このオブジェクティブの false
結果が 1 番目の結果であるため、その出力インデックスも 1
です。
metricSel = slcoverage.MetricSelector(... slcoverage.MetricSelectorType.DecisionOutcome,... 'slvnvdemo_covfilt/Saturation',1,1)
metricSel = MetricSelector with properties: ObjectiveIndex: 1 OutcomeIndex: 1 Description: 'N/A' Type: DecisionOutcome Id: 'slvnvdemo_covfilt:5' ConstructorCode: 'slcoverage.MetricSelector(slcoverage.MetricSelectorType.DecisionOutcome, 'slvnvdemo_covfilt:5', 1, 1)'
slcoverage.Selector.allSelectors
を使用して、Saturation ブロックで使用できるセレクターを確認することもできます。
saturationAllSels = ... slcoverage.Selector.allSelectors('slvnvdemo_covfilt/Saturation')
saturationAllSels = 1x6 heterogeneous Selector (BlockSelector, MetricSelector) array with properties: Description Type Id ConstructorCode
allSelectors
メソッドを使用して、オブジェクティブのインデックスと結果のインデックスを確認することもできます。名前と値のペア Description
を使用して F
を検索します。
falseSelectors = ... slcoverage.Selector.allSelectors('slvnvdemo_covfilt/Saturation',... 'Description','F')
falseSelectors = 1x2 MetricSelector array with properties: ObjectiveIndex OutcomeIndex Description Type Id ConstructorCode
Saturation ブロックには false ケースのセレクターが 2 つあります。最初のセレクターは F outcome of input > lower limit
です。
falseSel = falseSelectors(1)
falseSel = MetricSelector with properties: ObjectiveIndex: 1 OutcomeIndex: 1 Description: 'F outcome of input >= lower limit in Saturate block "Saturation"' Type: DecisionOutcome Id: 'slvnvdemo_covfilt:5' ConstructorCode: 'slcoverage.MetricSelector(slcoverage.MetricSelectorType.DecisionOutcome, 'slvnvdemo_covfilt:5', 1, 1)'
falseSel
セレクターは、slcoverage.MetricSelector
を使用して手動で作成したものと同じです。オブジェクティブのインデックスと結果のインデックスは、結果として得られる selector オブジェクトのプロパティです。
正当化規則の作成
slcoverage.Filter
を使用してフィルター オブジェクトを作成します。フィルター ファイル名とフィルターの説明を、メソッド setFilterName
およびメソッド setFilterDescription
をそれぞれ使用して設定できます。
filt = slcoverage.Filter; setFilterName(filt,'slcoverage_filter'); setFilterDescription(filt,'Example Filter');
slcoverage.FilterRule
を使用してフィルターの規則を作成します。FilterRule
への 1 番目の入力は、フィルター処理するブロックまたは結果のセレクターです。これは、自分で作成するセレクターである場合も、allSelectors
から取得するものである場合もあります。
2 番目の入力は、結果またはブロックをフィルター処理するための根拠です。これは文字配列として指定されます。
3 番目の入力は、使用するフィルターのモードです。2 つのカバレッジ フィルターのモードは、正当化と除外です。正当化モードを使用して、F outcome of input > lower limit
などの個別のカバレッジ オブジェクティブの結果をフィルター処理します。除外モードを使用して、モデル要素全体またはブロック全体をフィルター処理します。これは、ブロックとその子孫 (ある場合) が無視されることを意味しています。この例では、正当化モードを使用して、ある特定の結果をフィルター処理するよう指定します。
rule = slcoverage.FilterRule(... metricSel,'rate > 0',slcoverage.FilterMode.Justify);
addRule
を使用してフィルターに規則を追加します。
filt.addRule(rule);
save
メソッドを使用して、フィルター ファイルにフィルターを保存します。次に、filter
プロパティを新しいフィルター ファイルに割り当てて、cvdata
オブジェクトにフィルター ファイルを適用します。
filt.save('covfilter'); covData.filter = 'covfilter';
フィルター処理された cvdata
オブジェクトを使用して Saturation ブロックのカバレッジ結果を再生成します。
filteredSaturation = decisioninfo(covData,'slvnvdemo_covfilt/Saturation');
percentSaturationFilt = 100 * filteredSaturation(1)/filteredSaturation(2)
percentSaturationFilt = 75
Saturation ブロックの判定カバレッジは 75% になります。
Stateflow® チャートでの MCDC オブジェクティブの正当化
同じワークフローを適用して特定の Stateflow アクションを正当化できます。この例では、after(4, tick)
遷移の一部である tick
MCDC オブジェクティブを正当化します。
まず、sfroot
(Stateflow)を使用して Stateflow ルート オブジェクトを取得します。
chartID = sfroot;
find
(Stateflow)メソッドを使用して 'after(4, tick)'
遷移 ID を取得します。'-isa'
フラグを 'Stateflow.Transition'
に指定して使用し、find
を使用して遷移を検索できます。追加の入力を使用したラベル文字列の検索を使用して、さらに厳密な遷移を指定できます。
transitionID = chartID.find('-isa','Stateflow.Transition',... 'LabelString','after(4, tick)');
allSelectors
を使用して、フィルター処理する MCDC オブジェクティブの結果のセレクターを取得します。Stateflow 遷移の Simulink ID を 1 番目の入力として渡します。tick
の結果を正当化するため、説明で "tick"
を検索します。
sfSelectors = slcoverage.Selector.allSelectors(transitionID,... 'Description','"tick"')
sfSelectors = 1x3 MetricSelector array with properties: ObjectiveIndex OutcomeIndex Description Type Id ConstructorCode
allSelectors
はセレクターの候補を 3 つ返します。フィルター対象とする遷移は 3 番目に返されるセレクターです。
sfSel = sfSelectors(3)
sfSel = MetricSelector with properties: ObjectiveIndex: 1 OutcomeIndex: 1 Description: 'Condition 1, "tick" outcome of Transition trigger expression in Transition "after(4, tick)" from "Clipped" to "Full"' Type: MCDCOutcome Id: 'slvnvdemo_covfilt:6:5' ConstructorCode: 'slcoverage.MetricSelector(slcoverage.MetricSelectorType.MCDCOutcome, 'slvnvdemo_covfilt:6:5', 1, 1)'
規則を作成し、それをフィルターに追加し、保存します。フィルター ファイルは既に cvdata
オブジェクトに割り当てられています。
rule2 = slcoverage.FilterRule(sfSel,'tick never false'); filt.addRule(rule2); filt.save('covfilter');
Stateflow のプログラム API の詳細については、Stateflow API の概要 (Stateflow)を参照してください。
ブロック セレクターを使用したブロックの除外
slcoverage.BlockSelector
を使用してブロックをフィルター処理できます。この場合では Switchable config サブシステムを除外するため、SubsystemAllContent
セレクター タイプと slcoverage.FilterMode.Exclude
フィルター モードを使用します。
subsysSel = slcoverage.BlockSelector(... slcoverage.BlockSelectorType.SubsystemAllContent,... 'slvnvdemo_covfilt/Switchable config');
セレクター、根拠、除外フィルター モードを入力として渡して、フィルターの規則を作成します。
rule3 = slcoverage.FilterRule(subsysSel,... 'Unused configuration',... slcoverage.FilterMode.Exclude);
その規則をフィルターに追加して保存します。
filt.addRule(rule3);
filt.save('covfilter');
最後に、cvhtml
を使用してカバレッジ レポートを表示できます。[カバレッジ解析からフィルターで除外されたオブジェクト] セクションには、フィルター処理されたモデル オブジェクトとその根拠の概要が表示されます。'-sRT=0'
フラグを使用して、カバレッジ レポートを生成してもそのレポートを自動的には開かないようにすることもできます。
cvhtml('filteredCovReport',covData,'-sRT=0');
参考
slcoverage.BlockSelector
| slcoverage.FilterRule
| slcoverage.MetricSelector
| slcoverage.Selector
| allSelectors
| cvhtml
| decisioninfo
| cvdata