从覆盖率数据中提取详细信息
此示例显示如何使用覆盖率实用程序命令从 cvdata 对象中提取有关单个子系统、模块或 Stateflow® 对象的信息。
示例模型
此示例说明了包含各种支持的覆盖率度量方面的小模型的覆盖率数据的命令行访问。
使用以下命令打开模型“slvnvdemo_cv_small_controller”及其子系统“Gain”。
open_system('slvnvdemo_cv_small_controller'); open_system('slvnvdemo_cv_small_controller/Gain');
生成覆盖率数据和 HTML 报告
使用 sim
仿真模型。使用 Simulink.SimulationInput
对象捕获覆盖率设置并将其用作 sim
的输入。仿真结束后,覆盖率数据将存储在 cvdata
对象中。
simIn = Simulink.SimulationInput('slvnvdemo_cv_small_controller'); simIn = simIn.setModelParameter('CovEnable','on'); simIn = simIn.setModelParameter('CovMetricStructuralLevel','MCDC'); simIn = simIn.setModelParameter('CovSaveSingleToWorkspaceVar','on'); simIn = simIn.setModelParameter('CovSaveName','covData'); simIn = simIn.setModelParameter('CovScope','EntireSystem'); simIn = simIn.setModelParameter('CovMetricLookupTable','on'); simIn = simIn.setModelParameter('CovMetricSignalRange','on'); simOut = sim(simIn);
使用报告生成命令 cvhtml
处理从 cvsim
命令返回的覆盖率数据。生成的报告可以方便地表示整个模型的模型覆盖率。
cvhtml('tempfile.html',covData);
覆盖率数据也可在仿真输出对象中获得。
simOut
simOut = Simulink.SimulationOutput: covData: [1x1 cvdata] tout: [59x1 double] yout: [59x1 double] SimulationMetadata: [1x1 Simulink.SimulationMetadata] ErrorMessage: [0x0 char]
提取决策覆盖信息
使用 decisioninfo
命令提取单个 Simulink 模块或 Stateflow 对象的决策覆盖率信息。
以下命令提取整个模型的覆盖率数组。第一个元素是该模型满足的覆盖率目标结果的数量;第二个元素是该模型满足的覆盖率目标结果的总数。
cov = decisioninfo(covData,'slvnvdemo_cv_small_controller')
percent = 100*cov(1)/cov(2)
cov = 4 6 percent = 66.6667
使用该模块的完整路径检索“饱和度”模块的覆盖率信息。为该模块内的覆盖率目标结果的文本描述提供第二个返回参量。
[blkCov, description] = decisioninfo(... covData,'slvnvdemo_cv_small_controller/Saturation') decision1 = description.decision(1).text out_1a = description.decision(1).outcome(1).text count_1a = description.decision(1).outcome(1).executionCount out_1b = description.decision(1).outcome(2).text count_1b = description.decision(1).outcome(2).executionCount
blkCov = 3 4 description = struct with fields: isFiltered: 0 justifiedCoverage: 0 isJustified: 0 filterRationale: '' decision: [1x2 struct] decision1 = 'U >= LL' out_1a = 'false' count_1a = 0 out_1b = 'true' count_1b = 7
对于包含或具有覆盖率目标结果的层次结构中的每个结果,都可以获得定量覆盖率信息。仅针对具有覆盖率目标结果本身的对象生成文本描述。例如,对虚拟子系统 Gain 调用 decisioninfo
,描述返回值为空。
[blkCov, description] = decisioninfo(... covData,'slvnvdemo_cv_small_controller/Gain')
blkCov = 1 2 description = struct with fields: isFiltered: 0 justifiedCoverage: 0 isJustified: 0 filterRationale: ''
在某些情况下,一个对象具有内部覆盖率目标,但也包含具有附加覆盖率目标的后代。覆盖信息通常包括所有后代,除非忽略后代的第三个参量设置为 1。
subsysOnlycov = decisioninfo(... covData,'slvnvdemo_cv_small_controller/Gain',1)
subsysOnlycov = []
decisioninfo
命令还可以用于模块句柄、Stateflow ID 和 Stateflow API 对象。
blkHandle = get_param('slvnvdemo_cv_small_controller/Saturation','Handle') blkCov = decisioninfo(covData,blkHandle)
blkHandle = 335.0027 blkCov = 3 4
如果对象没有决策覆盖率,命令将返回空输出。
missingBlkCov = decisioninfo(covData,'slvnvdemo_cv_small_controller/Sine1')
missingBlkCov = []
提取条件覆盖信息
条件覆盖率表示布尔表达式的逻辑输入是否被评估为 true 或 false。在 Simulink 中,条件是逻辑运算的输入。
用于提取条件覆盖率信息的 conditioninfo
命令与 decisioninfo
命令非常相似。它通常返回有关一个对象及其所有后代的信息,但可以采用第三个参量来指示是否应忽略后代。它还可以返回包含每个条件描述的第二个输出。
cov = conditioninfo(covData,'slvnvdemo_cv_small_controller/Gain/Logic') [cov, desc] = conditioninfo(... covData,'slvnvdemo_cv_small_controller/Gain/Logic'); desc.condition(1) desc.condition(2)
cov = 2 4 ans = struct with fields: isFiltered: 0 isJustified: 0 filterRationale: '' text: 'port1' trueCnts: 59 falseCnts: 0 trueOutcomeFilter: [1x1 struct] falseOutcomeFilter: [1x1 struct] trueExecutedIn: [] falseExecutedIn: [] ans = struct with fields: isFiltered: 0 isJustified: 0 filterRationale: '' text: 'port2' trueCnts: 0 falseCnts: 59 trueOutcomeFilter: [1x1 struct] falseOutcomeFilter: [1x1 struct] trueExecutedIn: [] falseExecutedIn: []
提取修改的条件/决策覆盖信息
如果对布尔表达式中的条件进行两次求值,即独立对,表示条件的值独立地影响整个表达式的结果,则该表达式满足修改后的条件/决策覆盖率 (MCDC)。也就是说,对于这些评估,切换条件的值也会导致表达式结果切换。
在此示例中,对逻辑 AND 模块进行了 MCDC 分析,并且可以使用 mcdcinfo
命令提取该信息。该命令使用与 conditioninfo
和 decisioninfo
命令相同的语法。
[cov, desc] = mcdcinfo(covData,'slvnvdemo_cv_small_controller/Gain/Logic')
desc.condition(1)
desc.condition(2)
cov = 0 2 desc = struct with fields: text: 'Output' condition: [1x2 struct] isFiltered: 0 filterRationale: '' justifiedCoverage: 0 ans = struct with fields: text: 'port1' achieved: 0 trueRslt: '(TT)' falseRslt: '(FT)' isFiltered: 0 isJustified: 0 filterRationale: '' trueExecutedIn: [] falseExecutedIn: [] ans = struct with fields: text: 'port2' achieved: 0 trueRslt: '(TT)' falseRslt: 'TF' isFiltered: 0 isJustified: 0 filterRationale: '' trueExecutedIn: [] falseExecutedIn: []
提取查找表覆盖率信息
查找表覆盖率记录了每个插值区间发生查找的频率。出于覆盖率目的的有效间隔还包括小于最小断点的值和大于最大断点的值。为了与其他命令一致性,此信息将作为一对计数返回,包括执行的间隔数和总间隔数。
第二个输出参量导致 tableinfo
返回所有插值间隔的执行计数。如果表具有 M×N 输出值,则执行计数将以 M+1×N+1 矩阵的形式返回。
第三个输出参量导致 tableinfo
返回输入与断点完全相等的计数。该值以向量元胞数组的形式返回,表中的每个维度对应一个向量。
[cov,execCnts,brkEq] = tableinfo(covData, ... 'slvnvdemo_cv_small_controller/Gain/Gain Table')
cov = 23 121 execCnts = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 12 14 10 2 0 0 0 0 0 4 12 0 0 0 12 0 0 0 0 0 22 0 0 0 0 0 12 0 0 0 0 21 0 0 0 0 0 59 0 0 0 0 21 0 0 0 0 0 29 0 0 0 0 7 28 0 0 0 28 6 0 0 0 0 0 4 22 18 23 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 brkEq = 1x2 cell array {10x1 double} {10x1 double}
提取信号范围信息
信号范围度量记录 Simulink 模块输出和 Stateflow 数据对象的最小值和最大值。sigrangeinfo
命令分别返回最小值和最大值的两个返回参量。
sigrangeinfo
命令仅适用于执行计算的叶模块,否则该命令将返回空参量。叶模块是没有任何子模块的模块,例如产品模块。非叶模块是具有子模块的模块,例如子系统。
例如,将名为 Gain Table 的叶模块的信号范围结果与名为 Gain 的子系统模块的信号范围结果进行比较。
[sigMin, sigMax] = sigrangeinfo(covData,... 'slvnvdemo_cv_small_controller/Gain/Gain Table') [sigMin, sigMax] = sigrangeinfo(covData,... 'slvnvdemo_cv_small_controller/Gain')
sigMin = 3.3656 sigMax = 7.6120 sigMin = [] sigMax = []