Main Content

本页采用了机器翻译。点击此处可查看英文原文。

使用脚本分析覆盖率数据

此示例展示如何使用脚本加载、解析和查询覆盖率数据。

加载覆盖率数据

加载模型,然后使用辅助脚本 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.Filterslcoverage.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

另请参阅

| | | | | |

相关主题