使用脚本分析覆盖率数据
此示例说明如何使用脚本加载、解析和查询覆盖率数据。
加载覆盖率数据
加载模型,然后使用辅助脚本 setupCoverage。此脚本创建一个启用了覆盖率的仿真场景。使用它对模型进行仿真,并生成包含覆盖率结果的 Simulink.SimulationOutput 对象。
load_system('slvnvdemo_ratelim_harness');
setupCoverage
simOut = sim(covSet);
covData = simOut.covData;
从覆盖率数据对象中提取信息
使用 decisioninfo 从模块路径或模块句柄检索覆盖率信息。输出是一个向量,包含单个模型对象的已实现结果数和总结果数。
subsysCov = decisioninfo(covData,... 'slvnvdemo_ratelim_harness/Adjustable Rate Limiter')
subsysCov =
5 6
使用 decisioninfo 来确定已实现的覆盖率百分比。
percentCov = 100 * (subsysCov(1)/subsysCov(2))
percentCov = 83.3333
使用 decisioninfo 指定您想要提取名为 Apply Limited Gain 的 Switch 模块的决策覆盖率数据。这会返回一个结构体,其中包含决策和对应的结果。
[blockCov,desc] = decisioninfo(covData, ... ['slvnvdemo_ratelim_harness/Adjustable Rate Limiter'... '/Apply limited gain']); descDecision = desc.decision; outcome1 = desc.decision.outcome(1) outcome2 = desc.decision.outcome(2)
outcome1 =
struct with fields:
text: 'false (out = in3)'
executionCount: 0
executedIn: []
isFiltered: 0
isJustified: 0
filterRationale: ''
outcome2 =
struct with fields:
text: 'true (out = in1)'
executionCount: 101
executedIn: []
isFiltered: 0
isJustified: 0
filterRationale: ''
从 decisioninfo 的输出可以看出,名为 Apply Limited Gain 的 Switch 模块从未出现 false 情形,因为在 false 情形下,executionCount 字段的值为 0。如果这是预期行为,并且您不打算在测试中执行这种情形,则可以使用 slcoverage.Filter 类添加过滤器规则,对这种缺失的覆盖率进行申述。
首先,查询要过滤的模块实例,因为我们只需要过滤那个检索到覆盖不完整的模块实例,而不是该模块类型的所有实例。然后使用 slcoverage.BlockSelector 类和 BlockInstance 选择器类型,以指定一个模块实例进行过滤。
id = getSimulinkBlockHandle( ... 'slvnvdemo_ratelim_harness/Adjustable Rate Limiter/Apply limited gain'); sel = slcoverage.BlockSelector( ... slcoverage.BlockSelectorType.BlockInstance,id);
使用 slcoverage.Filter 和 slcoverage.FilterRule 类创建一个过滤器对象和一个过滤器规则。
filt = slcoverage.Filter; rule = slcoverage.FilterRule( ... sel,'Edge case',slcoverage.FilterMode.Justify);
使用 addRule 方法将该规则添加到该过滤器。然后使用 save 方法保存新的过滤器文件。
filt.addRule(rule);
filt.save('blfilter');
要将过滤器应用于覆盖率数据,请将 cvdata 对象的 filter 属性设置为过滤器文件的名称。对已过滤的覆盖率数据使用 decisioninfo,您可以看到现在决策覆盖率为 100%,因为已申述的目标被视为已满足。
covData.filter = 'blfilter'; newCov = decisioninfo(covData,... 'slvnvdemo_ratelim_harness/Adjustable Rate Limiter') percentNewCov = 100 * (newCov(1)/newCov(2))
newCov =
6 6
percentNewCov =
100
另请参阅
cvdata | decisioninfo | slcoverage.Filter | slcoverage.FilterRule | slcoverage.BlockSelector | slcoverage.MetricSelector | slcoverage.Selector