このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
カバレッジ データの演算の実行
この例では、オーバーロードされた演算子 +
、*
、および -
を使用し、カバレッジ結果を組み合わせて、結果の和集合、共通集合、差集合を求める方法を示します。
モデルを開く
slvnvdemo_cv_mutual_exclusion
モデルを開きます。モデルには、2 つのサブシステムのイネーブル端子に接続された Constant ブロックが含まれています。サブシステムの 1 つはイネーブル端子の前に NOT
ブロックが配置されています。これは、一度に有効にできるサブシステムは 1 つのみであることを意味します。
modelName = "slvnvdemo_cv_mutual_exclusion";
open_system(modelName)
Simulink.SimulationInput
オブジェクトを作成し、setModelParameter
を使用してカバレッジ パラメーターを設定します。
simIn = Simulink.SimulationInput(modelName);
CovEnable
パラメーターを on
に設定して、モデルに対してカバレッジ解析を有効にします。
simIn = setModelParameter(simIn,"CovEnable","on");
構造カバレッジ レベルを Decision
に設定します。
simIn = setModelParameter(simIn,"CovMetricStructuralLevel","Decision");
CovSaveOutputData
を off
に設定することで、ファイルの場所ではなく MATLAB® でカバレッジ データを表示します。これにより、シミュレーション後に Simulink® Coverage® がカバレッジ データをファイルに自動保存することもなくなります。
simIn = setModelParameter(simIn,"CovSaveOutputData","off");
sim
への入力として simIn
を使用してモデルをシミュレートします。SimulationOutput
オブジェクトには、CovSaveName
コンフィギュレーション パラメーターの値と等しい名前をもつプロパティとしてカバレッジ データが含まれます。既定値は covdata
です。
simOut1 = sim(simIn); data1 = simOut1.covdata
data1 = ... cvdata version: (R2023b) id: 510 type: TEST_DATA test: cvtest object rootID: 512 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 04-Aug-2023 00:44:36 stopTime: 04-Aug-2023 00:44:36 intervalStartTime: 0 intervalStopTime: 0 simulationStartTime: 0 simulationStopTime: 10 filter: simMode: Normal
setBlockParameter
メソッドを使用して Constant ブロックの値を 0
から 1
に変更して有効なサブシステムを変更し、モデルを再度シミュレートします。
simIn = setBlockParameter(simIn,modelName+"/Constant","value","1"); simOut2 = sim(simIn); data2 = simOut2.covdata
data2 = ... cvdata version: (R2023b) id: 563 type: TEST_DATA test: cvtest object rootID: 512 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 04-Aug-2023 00:44:38 stopTime: 04-Aug-2023 00:44:38 intervalStartTime: 0 intervalStopTime: 0 simulationStartTime: 0 simulationStopTime: 10 filter: simMode: Normal
関数 decisioninfo
を使用して、各シミュレーションから判定カバレッジを抽出し、達成された判定結果の割合 (%) を判別します。
cov1 = decisioninfo(data1,modelName); percent1 = 100*(cov1(1)/cov1(2)) cov2 = decisioninfo(data2,modelName); percent2 = 100*(cov2(1)/cov2(2))
percent1 = 50 percent2 = 50
両方のシミュレーションともカバレッジは 50% です。2 つのシミュレーションが同じ 50% の判定結果をカバーしているかどうかをチェックするには、2 つのオブジェクトの和集合および共通集合を確認します。
カバレッジの和集合の検出
+
演算子を使用して、data1
と data2
の cvdata
オブジェクトの和集合を表す 3 番目の cvdata
オブジェクトを派生させます。2 つ以上の cvdata
オブジェクトの和集合は、"累積カバレッジ" や "集計されたカバレッジ" とも呼ばれます。
その他のシミュレーション結果を組み合わせて cvdata
オブジェクトを作成すると、新しいオブジェクトの type
プロパティは DERIVED_DATA
になります。
dataUnion = data1 + data2
dataUnion = ... cvdata version: (R2023b) id: 0 type: DERIVED_DATA test: [] rootID: 512 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 04-Aug-2023 00:44:36 stopTime: 04-Aug-2023 00:44:38 intervalStartTime: 0 intervalStopTime: 0 filter: simMode: Normal
判定カバレッジの結果を抽出し、dataUnion
で関数 decisioninfo
を呼び出して、達成された判定結果の割合 (%) を判別します。
covU = decisioninfo(dataUnion,modelName); percentU = 100*(covU(1)/covU(2))
percentU = 100
2 つのシミュレーション レポートの和集合で、100% の判定結果が達成されていることがレポートされます。この結果は、2 つのシミュレーションのカバレッジにはオーバーラップがなく、すべての判定結果が達成されていることを示しています。
カバレッジの共通集合の検出
*
演算子を使用して data1
と data2
の共通集合を求めることにより、2 つのシミュレーションの間でカバレッジがオーバーラップしていないことを確認します。共通集合では、両方の cvdata
オブジェクトで達成されているカバレッジ結果のみが返されます。
dataIntersection = data1 * data2 covI = decisioninfo(dataIntersection,modelName); percentI = 100*(covI(1)/covI(2))
dataIntersection = ... cvdata version: (R2023b) id: 0 type: DERIVED_DATA test: [] rootID: 512 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 04-Aug-2023 00:44:36 stopTime: 04-Aug-2023 00:44:38 intervalStartTime: 0 intervalStopTime: 0 filter: simMode: Normal percentI = 0
2 つのシミュレーションのカバレッジにはオーバーラップがないため、共通集合の判定カバレッジは 0% です。
カバレッジの差の計算
-
演算子を使用して、左右のオペランドの差集合を表す cvdata
オブジェクトを作成します。演算の結果には、左のオペランドでは達成され、右のオペランドでは達成されていないカバレッジ結果が含まれます。この演算は、特定のシミュレーションに起因する追加カバレッジの程度を判別する場合に使用します。
この例では、1 番目と 2 番目のシミュレーション カバレッジの和集合と、1 番目のシミュレーション カバレッジの差が、2 番目のシミュレーションで提供された追加カバレッジの程度を示します。判定カバレッジ結果にはオーバーラップがないため、2 番目のシミュレーションによる新しい判定カバレッジは 50% です。
newCov2 = dataUnion - data1
covN = decisioninfo(newCov2,'slvnvdemo_cv_mutual_exclusion');
percentN = 100*(covN(1)/covN(2))
newCov2 = ... cvdata version: (R2023b) id: 0 type: DERIVED_DATA test: [] rootID: 512 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 04-Aug-2023 00:44:36 stopTime: 04-Aug-2023 00:44:38 intervalStartTime: 0 intervalStopTime: 0 filter: simMode: Normal percentN = 50
派生したカバレッジ データ オブジェクトの使用
派生した cvdata
オブジェクトは、レポートや解析のすべての関数で、また、それ以降の演算への入力として使用できます。たとえば、派生した dataIntersection
オブジェクトからカバレッジ レポートを生成し、新しい cvdata
和集合を作成します。
cvhtml('intersect_cov', dataIntersection);
newUnion = dataUnion + dataIntersection
newUnion = ... cvdata version: (R2023b) id: 0 type: DERIVED_DATA test: [] rootID: 512 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 04-Aug-2023 00:44:36 stopTime: 04-Aug-2023 00:44:38 intervalStartTime: 0 intervalStopTime: 0 filter: simMode: Normal
参考
cvdata
| Simulink.SimulationInput
| sim