Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

カバレッジ データの演算の実行

この例では、オーバーロードされた演算子 +*、および - を使用し、カバレッジ結果を組み合わせて、結果の和集合、共通集合、差集合を求める方法を示します。

モデルを開く

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

CovSaveOutputDataoff に設定することで、ファイルの場所ではなく 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 つのオブジェクトの和集合および共通集合を確認します。

カバレッジの和集合の検出

+ 演算子を使用して、data1data2cvdata オブジェクトの和集合を表す 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 つのシミュレーションのカバレッジにはオーバーラップがなく、すべての判定結果が達成されていることを示しています。

カバレッジの共通集合の検出

* 演算子を使用して data1data2 の共通集合を求めることにより、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

参考

| |

関連するトピック