主要内容

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

在子系统分析期间使用现有的覆盖率数据

此示例展示了 Simulink® Design Verifier™ 如何将其分析定位到连续时间闭环仿真中的单个子系统,并为该子系统中缺失的覆盖率生成测试用例。

该示例首先测量闭环仿真模型中子系统的覆盖率。Simulink Design Verifier 找到实现子系统缺失覆盖率的新测试用例。

测量子系统的覆盖率

sldvdemo_autotrans 模型是一个闭环仿真模型。子系统 ShiftLogic 是 Stateflow® 图,代表该模型的控制器部分。在 Signal Editor 模块 ManeuversGUI 中设计的测试用例驱动闭环仿真。您可以使用 cvtest (Simulink Coverage)cvsim (Simulink Coverage) 函数来测量闭环仿真模型中该子系统实现的模型覆盖率。在此示例中,将 cvtest 的输入指定为子系统的路径而不是模型名称,导致仅测量子系统的覆盖率。此外,cvsim 的第二个输入指定了仿真模型的时间区间,它源自模块 ManeuversGUI 中当前窗格的时间范围。

cvhtml (Simulink Coverage) 函数生成的报告表明,通过仿真模块 ManeuversGUI 中编写的测试用例,实现了 87% 的决策覆盖率、67% 的条件覆盖率和 33% 的 MCDC 覆盖率。

open_system('sldvdemo_autotrans');
open_system('sldvdemo_autotrans/ManeuversGUI');

test = cvtest('sldvdemo_autotrans/ShiftLogic');
test.settings.decision = 1;
test.settings.condition = 1;
test.settings.mcdc = 1;

signalEditorBlock = sldvdemo_signaleditor_block('sldvdemo_autotrans');
signalEditorTime = sldvdemo_signaleditor_DataTime(signalEditorBlock);
simulationStopTime = signalEditorTime{1,1}(end);

existingCovData = cvsim(test,[0 simulationStopTime]);
cvhtml('Existing Coverage', existingCovData);

查找缺失覆盖率的测试用例

要在测试生成期间使用现有覆盖率数据,请将现有覆盖率数据保存到 .cvt 覆盖率数据文件中。您可以通过在覆盖率数据文件参数中指定覆盖率数据路径,并在 Simulink Design Verifier 配置参数的测试生成窗格中将忽略现有覆盖率数据中满足的目标参数设置为 on 来使用现有的覆盖率数据。

在此示例中,sldvrun 的第一个输入指定要分析的子系统。当需要单独测试模型的控制器部分或者想要将大型模型的分析分成更小、更易于管理的部分时,指示 Simulink Design Verifier 分析子系统会很有用。

正如您在报告中看到的,Simulink Design Verifier 仅查找现有覆盖率文件中未涵盖的覆盖率目标的测试用例。请注意,子系统 ShiftLogic 中的 4 个覆盖率目标被证明是无法满足的。这是符合预期的,因为 Stateflow 图 ShiftLogic 内部的逻辑使用了时间事件,并且由于该图在每个采样时间更新,因此时间条件的使用应该是令人满意的。还要注意,子系统内的死代码将始终是包含该子系统的模型中的死代码。

为了生成框架模型,Simulink Design Verifier 将子系统 ShiftLogic 的内容提取到测试单元组件中,该组件由包含生成的测试用例的 Signal Editor 模块提供。

cvsave('existingcov',existingCovData);

opts = sldvoptions;
opts.IgnoreCovSatisfied = 'on';
opts.CoverageDataFile = 'existingcov.cvt';
opts.ModelCoverageObjectives = 'MCDC';
opts.SaveHarnessModel = 'on';
opts.SaveReport = 'on';

[status, fileNames] = sldvrun('sldvdemo_autotrans/ShiftLogic',opts,true);
[~, harnessModel] = fileparts(fileNames.HarnessModel);
open_system(harnessModel);

清理

为了完成演示,请关闭所有模型并删除已保存的覆盖率数据文件。

close_system('sldvdemo_autotrans');
close_system(fileNames.ExtractedModel,0);
close_system(fileNames.HarnessModel,0);
delete('existingcov.cvt');