Main Content

スクリプトを使用したカバレッジの結果のフィルター

この例では、プログラムでカバレッジ結果からオブジェクトと結果をフィルター処理する方法を説明します。

モデルを開きカバレッジ解析を有効にする

まず、モデルをメモリに読み込みます。

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');

参考

| | | | | | |

関連するトピック