使用模型切片器调试增强的修正条件/决策覆盖率
此示例显示如何使用模型切片器查找与特定模型对象相关的Simulink® Design Verifier™ 生成的目标。一旦确定了目标,模型切片器就会在目标可观察到的步骤中突出显示切片。
此示例使用以下产品来演示调试增强修正条件/决策覆盖率(MCDC):
Simulink Design Verifier
Model Slicer
增强型MCDC分析模型中每个目标的可检测性,并为每个目标生成非掩蔽测试用例。它协调下游模块的效果以避免掩盖效应。它还计算每个可检测目标的检测地点,在这些地点可以观察到目标的效果。该数据可在分析生成的sldvdemo_cruise_control_sldvdata.mat
文件中找到。这些检测点可以添加到背靠背测试的等效性准则中。
此示例使用以下切片器配置:
起点设置为要观察的模型对象。
排除点设置为与Simulink Design Verifier生成的目标相关的检测点。
信号传播设置为下游(前向切片)。
步骤 1:准备模型
1.打开模型。
model = 'sldvdemo_cruise_control';
open_system(model);
2.加载由Simulink Design Verifier(sldvData)生成的数据文件,以使用增强型 MCDC 进行测试生成。
load('sldvdemo_cruise_control_sldvdata.mat');
3.选择必须突出显示目标的模型对象并找到其 SID。
modelObjIdentifier = 'sldvdemo_cruise_control/Controller/Switch3';
modelobjSID = Simulink.ID.getSID(modelObjIdentifier);
步骤 2:设置模型切片器
1.为模型启用快速重启。
set_param(model,'FastRestart','on');
启用 FastRestart 将仿真模型并在各个时间戳收集仿真数据。这将允许我们使用后退和前进选项。
2.创建并激活模型切片器对象。
slicerObject = slslicer(model); activate(slicerObject);
3.将信号传播设置为下游。
slicerObject.Configuration.SignalPropagation = 'downstream';
步骤 3:查找与模型对象相关的目标
1.使用 SldvDataExplorer 类的对象访问 sldvData。
sldvObj = SldvDataExplorer(sldvData);
注意:SldvDataExplorer类是一个辅助类。您可以根据您的需求进行编辑。
2.查找与模型对象相关的所有目标以及目标的详细信息。
[objectives, tableOfObjectives] = sldvObj.getObjectivesForModelObj(modelobjSID); disp(tableOfObjectives);
ObjectiveNum Type Description Detectability Status TestCaseId ____________ __________ _____________________________________________________________ _____________ ___________ __________ 1 "Decision" "logical trigger input false (output is from 3rd input port)" "Detectable" "Satisfied" 1 2 "Decision" "logical trigger input true (output is from 1st input port)" "Detectable" "Satisfied" 1
目标的以下详细信息保存在tableOfObjectives
表中:
ObjectiveNum-目标编号。
类型 — MCDC/决策/条件。
描述 - 由 Simulink Design Verifier 生成的目标描述。
可探测性 -目标的可探测状态。
状态——目标的状态。
TestCaseId - 表示解决目标的测试用例或反例的索引的整数。
步骤 4:突出目标
对于此示例,我们将突出显示表中的第一个目标。
1.根据目标对应的测试用例获取设置了输入值的仿真输入对象。
[simIn, atStep, ~] = sldvObj.getSimInObjForObjective(objectives(1));
2.允许在模型中回滚,以便可以在模型中向后退,并将仿真回滚步数设置为 1。
simIn = simIn.setModelParameter('EnableRollBack','on'); simIn = simIn.setModelParameter('NumberOfSteps', 1);
3.将Simulink输入对象应用到模型。
slicerObject.applySimInToModel(simIn);
4.查找选定目标的所有检测站点。
objectDetectionSites = sldvObj.getObjectDetectionSites(objectives(1));
5.添加所有检测站点作为排除点。
for n = 1:length(objectDetectionSites) detectionSite = objectDetectionSites(n).modelObj; slicerObject.addExclusionPoint(detectionSite); end
6.添加模型对象作为起点。
slicerObject.addStartingPoint(modelobjSID);
7.步进到测试用例中可观察到目标的点。
for q = 1:atStep slicerObject.stepForward(); end
现在您可以观察到切片已突出显示。
清理
执行以下操作来清理模型:
1.清除切片器对象。
2.清除Simulink输入对象。
clear slicerObject simIn
3.重置模型的FastRestart参数。
set_param(model,'FastRestart','off');