对覆盖率数据执行操作
此示例显示如何使用重载运算符 +
、*
和 -
将覆盖率结果组合成并集、交集或差集。
打开模型
打开 slvnvdemo_cv_mutual_exclusion
模型。该模型包含一个连接到两个子系统的使能端口的 Constant 模块。其中一个子系统在启用端口之前放置了一个 NOT
模块,这意味着一次只能启用其中一个子系统。
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");
使用 simIn
作为 sim
的输入来仿真模型。SimulationOutput
对象包含覆盖率数据作为属性,其名称等于 CovSaveName
配置参数的值。默认值为 covdata
。
simOut1 = sim(simIn); data1 = simOut1.covdata
data1 = ... cvdata version: (R2024a) id: 310 type: TEST_DATA test: cvtest object rootID: 312 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 20-Apr-2024 10:48:42 stopTime: 20-Apr-2024 10:48:42 intervalStartTime: intervalStopTime: 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: (R2024a) id: 363 type: TEST_DATA test: cvtest object rootID: 312 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 20-Apr-2024 10:48:43 stopTime: 20-Apr-2024 10:48:43 intervalStartTime: intervalStopTime: 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%。要检查两个仿真是否涵盖相同的 50% 决策结果,请查看两个对象的并集和交集。
找到覆盖率的联盟
使用 +
运算符派生第三个 cvdata
对象,该对象表示 data1
和 data2
cvdata
对象的并集。两个或多个 cvdata
对象的联合也称为累计覆盖率或聚合覆盖率。
当您通过组合其他仿真结果创建 cvdata
对象时,新对象的 type
属性为 DERIVED_DATA
。
dataUnion = data1 + data2
dataUnion = ... cvdata version: (R2024a) id: 0 type: DERIVED_DATA test: [] rootID: 312 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 20-Apr-2024 10:48:42 stopTime: 20-Apr-2024 10:48:43 intervalStartTime: intervalStopTime: filter: simMode: Normal
通过对 dataUnion
调用 decisioninfo
函数来提取决策覆盖率结果并确定满足的决策结果的百分比。
covU = decisioninfo(dataUnion,modelName); percentU = 100*(covU(1)/covU(2))
percentU = 100
两次仿真的结合表明,100% 的决策结果都得到满足。这个结果表明两次仿真之间的覆盖率没有重叠,并且所有决策结果都得到满足。
查找覆盖率的交叉点
通过将 data1
和 data2
与 *
运算符相交,确认两次仿真之间的覆盖率不重叠。交集仅返回两个 cvdata
对象均满足的覆盖率结果。
dataIntersection = data1 * data2 covI = decisioninfo(dataIntersection,modelName); percentI = 100*(covI(1)/covI(2))
dataIntersection = ... cvdata version: (R2024a) id: 0 type: DERIVED_DATA test: [] rootID: 312 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 20-Apr-2024 10:48:42 stopTime: 20-Apr-2024 10:48:43 intervalStartTime: intervalStopTime: filter: simMode: Normal percentI = 0
交叉点的决策覆盖率为 0%,因为两个仿真之间的覆盖率没有重叠。
计算覆盖率差异
使用 -
运算符创建一个 cvdata
对象,表示左操作数和右操作数之间的集合差异。运算结果包含左操作数满足但右操作数不满足的覆盖率结果。使用此操作来确定有多少额外覆盖率归因于特定仿真。
在此示例中,第一次和第二次仿真覆盖率的并集与第一次仿真覆盖率之间的差值表示第二次仿真提供了多少额外覆盖率。由于没有任何决策覆盖率结果重叠,第二次仿真的新决策覆盖率为 50%。
newCov2 = dataUnion - data1
covN = decisioninfo(newCov2,'slvnvdemo_cv_mutual_exclusion');
percentN = 100*(covN(1)/covN(2))
newCov2 = ... cvdata version: (R2024a) id: 0 type: DERIVED_DATA test: [] rootID: 312 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 20-Apr-2024 10:48:42 stopTime: 20-Apr-2024 10:48:43 intervalStartTime: intervalStopTime: filter: simMode: Normal percentN = 50
使用派生的覆盖率数据对象
您可以在所有报告和分析函数中使用派生的 cvdata
对象,并将其作为后续操作的输入。例如,从派生的 dataIntersection
对象生成覆盖率报告并创建一个新的 cvdata
联合。
cvhtml('intersect_cov', dataIntersection);
newUnion = dataUnion + dataIntersection
newUnion = ... cvdata version: (R2024a) id: 0 type: DERIVED_DATA test: [] rootID: 312 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 20-Apr-2024 10:48:42 stopTime: 20-Apr-2024 10:48:43 intervalStartTime: intervalStopTime: filter: simMode: Normal
另请参阅
cvdata
| Simulink.SimulationInput
| sim