使用脚本分析覆盖率数据
此示例展示如何使用脚本加载、解析和查询覆盖率数据。
加载覆盖率数据
加载模型,然后使用辅助脚本 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 的开关模块的决策覆盖率数据。这将返回一个包含决策和结果的结构体。
[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 case executionCount
字段的值为 0
。如果预期会出现这种行为,并且您不打算在测试中执行这种 case,则可以添加过滤器规则,以使用 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