在闭环仿真模型中实现缺失覆盖
如果您有一个子系统或 Stateflow® 图未实现 100%覆盖率,并且您不想将子系统或图转换为 Model 模块,请按照此示例实现完全覆盖。
该示例采用闭环控制器模型。闭环控制器将指令传递给受控系统,并在执行控制指令时从环境接收信息。控制器在收到此信息时可以调整和改变其指令。
sldvdemo_autotrans
模型是一个闭环仿真模型。ShiftLogic Stateflow 图代表该模型的控制器部分。ManeuversGUI Signal Editor 模块中设计的测试用例驱动模块仿真。
记录模型的覆盖数据
要仿真 ShiftLogic 控制器的模型、记录条件、决策和 MCDC 覆盖率:
打开此示例中的示例模型
sldvdemo_autotrans
:openExample('sldv/UsingExistingCoverageDataSubsystemAnalysisExample')
在 App 选项卡上,点击 App 部分右侧的箭头。
在模型验证、确认和测试下,点击覆盖率分析器。
在覆盖率选项卡上,点击设置。
在“配置参数”对话框的覆盖率窗格上,设置以下选项:
选择启用覆盖率分析。
选择子系统并点击选择子系统。
在子系统选择对话框中,选择
ShiftLogic
并点击确定。
在覆盖率度量下,选择修正条件决策覆盖率(MCDC)。
如果选择了其他度量,则清除它们。
在“配置参数”对话框的 覆盖率 > 结果窗格中,设置以下选项:
启用将上次运行保存在工作区变量中
在 cvdata 对象名称字段中,输入
covdata_original_controller
来为覆盖率数据工作区变量指定一个唯一的名称。选择分析后自动生成报告。
点击确定。
启动
sldvdemo_autotrans
模型的仿真,记录覆盖率数据。仿真结束后,覆盖率报告打开。报告表明,ShiftLogic Stateflow 图实现了以下覆盖率:
决策:87%(27/31)
条件:67%(8/12)
MCDC:33%(2/6)的情况扭转了结果
仿真将覆盖率数据保存在 MATLAB® 工作区变量
covdata_original_controller
中,其中包含覆盖率数据的cvtest
对象。将覆盖率数据保存在 MATLAB 路径上的文件中:
cvsave('existingcov',covdata_original_controller);
查找缺失覆盖率的测试用例
要找到 ShiftLogic 图中缺失的覆盖率,请对该模块运行子系统分析。使用此技术可以将分析重点放在模型的单个部分上。
为了实现 ShiftLogic 控制器的 100%覆盖率,请运行使用现有覆盖率数据的测试生成分析。
右键点击 ShiftLogic 模块并选择 Design Verifier > 选项。
在“配置参数”对话框中,在选择树下,选择 Design Verifier 节点。在模式字段的分析选项下,选择测试生成。在模型覆盖率目标下,选择 MCDC。
在 Design Verifier 节点下,选择测试生成。在针对缺失覆盖率添加测试下,选择使用现有覆盖率数据进行扩展。
在覆盖率数据字段中,输入包含您在仿真期间记录的覆盖率数据的文件的名称:
existingcov.cvt
点击应用保存这些设置。点击确定。
右键点击
ShiftLogic
模块,在 Design Verifier 窗格下选择生成子系统测试。分析将 Stateflow 图提取到名为
ShiftLogic
的新模型中。该分析对新模型进行分析,忽略先前满足并记录在existingcov.cvt
文件中的覆盖率目标。当测试生成分析完成后,在 Simulink® Design Verifier™ 日志窗口中,选择仿真测试并生成模型覆盖率报告。
报告表明,使用 Simulink Design Verifier 生成的测试用例,ShiftLogic 图在仿真中实现了以下覆盖率:
决策:97% (30/31)
条件:83%(10/12)
MCDC:67%(4/6)的情况扭转了结果
Simulink Design Verifier 报告列出了提取模型的六个测试用例,这些测试用例满足了
existingcov.cvt
文件中未涵盖的目标。Simulink Design Verifier 报告表明 Stateflow 图 ShiftLogic 中的两个覆盖率目标被证明无法满足。隐式事件
tick
永远不会是false
,因为 ShiftLogic 图在每个时间步都会更新。对于时间事件after(TWAIT, tick)
的任一实例,分析无法满足条件或 MCDC 覆盖率。after(TWAIT, tick)
在语义上等同于Event == tick && temporalCount(tick) >= TWAIT
如果将
after(TWAIT, tick)
移到条件中,例如[after(TWAIT, tick) && speed < down_th]
Simulink Design Verifier 确定
tick
始终是true
,因此它仅测试temporalCount(tick) >= TWAIT
的after(TWAIT, tick)
部分。分析能够找到满足after(TWAIT, tick)
条件和 MCDC 覆盖率的测试目标。