这个例子展示了如何使用Simulink®Design Ver金宝appifier™函数来记录输入信号,创建一个利用模型,为缺失的覆盖率生成测试用例,合并利用模型,并执行测试用例。
该示例首先将输入信号记录到在其父模型中实现控制器的组件,并从记录的数据为控制器创建驾驭模型。您可以使用Sim金宝appulink Design Verifier来找到一个新的测试用例来实现缺失的覆盖率。然后将第一个工具模型与在Simulink Design Verifier分析后生成的工具模型合并。金宝app最后,您捕获所有的测试用例,并在仿真模式和软件在环(SIL)模式下使用这些测试用例执行控制器,并使用CGV API比较结果。
本示例需要有效的statflow®许可证。为了演示在软件在环(SIL)模式下的测试执行,还需要有效的Simulink®Coder™和Embedded Coder™许可证。金宝app
如果~许可证(“测试”,“Stateflow”)回来;结束canUseSIL=许可证(“测试”,“实时工作坊”)& &...许可证(“测试”,“RTW_Embedded_Coder”);
的slvnvdemo_电动窗
模型包含一个动力窗控制器和一个低阶电厂模型。组件slvnvdemo_powerwindow power_window_control_system /控制
模型块引用模型吗slvnvdemo\u powerwindow\u控制器
,它使用statflow®图表来实现控制器。
要使用模拟工厂模型中的控制器的信号为控制器创建一个利用模型,首先记录输入信号,然后使用记录的数据调用利用模型生成。
开放式系统(“slvnvdemo_powerwindow”);加载系统(“slvnvdemo_powerwindow_controller”);loggedSignalsPlant =...sldvlogsignals (“slvnvdemo_powerwindow / power_window_control_system /控制”);harnessModelFilePath =...sldvmakeharness (“slvnvdemo_powerwindow_controller”,loggedSignalPlant);[~,harnessModel]=fileparts(harnessModelFilePath);
###启动串行模型引用仿真构建### #成功更新了模型引用仿真目标:模型重建行动的原因 ============================================================================================================================ slvnvdemo_powerwindow_controller slvnvdemo_powerwindow_controller_msf代码生成和编译。Mexa64并不存在。###启动串行模型参考仿真构建### # slvnvdemo_powerwindow_controller的模型参考仿真目标是最新的。Build Summary 0 of 1 models built (1 models already up to) Build duration: 0h 0m 0.65053s ### #启动serial model reference simulation Build ###成功更新model reference simulation target for:模型重建行动的原因 =============================================================================== slvnvdemo_powerwindow_controller生成和编译代码1的模型建立(0模型已经更新)构建持续时间:0 h 0米13.436秒
使用cvt
和cvsim
用于测量控制器模型实现的模型覆盖率的函数slvnvdemo\u powerwindow\u控制器
利用利用模型捕获的记录信号。
的cvhtml
函数生成一个报告,该报告指出,通过模拟从闭环模型中捕获的测试用例,可以实现40%的Decision、35%的Condition和10%的MCDC覆盖率。
测试= cvt (harnessModel);test.modelRefSettings.enable =“上”;test.modelRefSettings.excludeTopModel = 1;covDataFromLoggedSignals = cvsim(测试);cvhtml (“使用记录的测试用例的覆盖率”, covDataFromLoggedSignals);
在您可以在测试生成期间使用现有的覆盖率数据之前,必须将数据保存到覆盖率数据文件(.cvt)中。中的覆盖率数据路径可以使用现有的覆盖率数据覆盖率数据文件参数和设置忽略在现有覆盖数据中满足的目标参数在…上
在测试生成Simulink金宝app设计验证程序配置参数窗格。
正如您在报告中所看到的,Simulink Design Ve金宝apprifier将测试生成限制为现有覆盖文件中没有覆盖的覆盖目标。注意状态流程图中有8个覆盖率目标控制
被证明是不可满足的。这表明不必要的冗余逻辑无法测试。
cvsave (“existingCovFromLoggedSignals”, covDataFromLoggedSignals);选择= sldvoptions;选择。IgnoreCovSatisfied =“上”;选择。CoverageDataFile =“existingCovFromLoggedSignals.cvt”; opts.modelCoverage对象=“MCDC”;opts.TestSuiteOptimization=“LongTestcases”;选择。SaveHarnessModel =“上”;选择。ModelReferenceHarness =“上”;opts.MaxProcessTime=500;[状态,文件名]=sldvrun(“slvnvdemo_powerwindow_controller”,opts,true);[~,newHarnessModel]=fileparts(filename.HarnessModel);open_系统(newHarnessModel);
现在使用SLDV安全带
将生成的测试用例与记录的测试用例相结合。该命令将线束模型列表作为参数。
sldvmergeharness (harnessModel newHarnessModel);
以便以编程方式执行模型slvnvdemo\u powerwindow\u控制器
在合并的控制模型中捕获的测试用例,首先使用sldvlogsignals
函数以必要的数据格式获取所有测试用例的输入值。
loggedSignalsMergedHarness = sldvlogsignals (harnessModel);disp (loggedSignalsMergedHarness);
loggedteststunitinfo: [1x1 struct]
使用sldvruncgvtest
函数执行模型slvnvdemo\u powerwindow\u控制器
在仿真模式中,使用从利用模型捕获的测试用例。
runopts = sldvruntestopts (“cgv”);disp (runopts);runopts。cgvConn =“sim卡”;cgvSim = sldvruncgvtest (“slvnvdemo_powerwindow_controller”,...loggedSignalsMergedHarness runopts);
testIdx:[]allowCopyModel:0 cgv组件类型:“topmodel”cgv组件N:“sim”开始执行:组件类型:topmodel连接:sim输入数据:/tmp/Bdoc21b_1757077_40715/tp300809f9/ex67947267/cgv_运行测试/slvnvdemo_powerwindow_控制器/slvvdemo_powerwindow_控制器_cgv_输入_tc_1.mat结束cgv执行:状态完成。开始执行:组件类型:topmodel连接:sim输入数据:/tmp/Bdoc21b\U 1757077\U 40715/tp300809f9/ex67947267/cgv\U运行测试/slvnvdemo\U powerwindow\U控制器/slvnvdemo\U powerwindow\U控制器\U cgv\U输入\U tc\U 2.mat结束cgv执行:状态完成。
现在使用的sldvruncgvtest
函数执行模型slvnvdemo\u powerwindow\u控制器
在SIL模式中,使用相同的测试用例。
如果canUseSIL runopts。cgvConn =“银”;其他的%当不可能使用SIL时,示例运行另一个模拟。runopts。cgvConn =“sim卡”;结束cgvSil=sldvruncgvtest(“slvnvdemo_powerwindow_controller”,...loggedSignalsMergedHarness runopts);
启动执行:ComponentType: topmodel Connectivity: sil InputData: /tmp/Bdoc21b_1757077_40715/tp300809f9/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_1_1。### Starting build procedure for: slvnvdemo_powerwindow_controller ###成功完成build procedure for: slvnvdemo_powerwindow_controller模型重建行动的原因 ================================================================================================================= slvnvdemo_powerwindow_controller代码生成和编译代码生成信息文件不存在。构建时间:0h 0m 23.631 ###准备启动SIL模拟…建筑与gcc。墨西哥人成功完成。### start SIL simulation for component: slvnvdemo_powerwindow_controller ### # Application stopped ### # stop SIL simulation for component: slvnvdemo_powerwindow_controller结束CGV执行:status completed。启动执行:ComponentType: topmodel Connectivity: sil InputData: /tmp/Bdoc21b_1757077_40715/tp300809f9/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_2_1。### Starting build procedure for: slvnvdemo_powerwindow_controller ###成功完成build procedure for: slvnvdemo_powerwindow_controller模型重建行动的原因 ================================================================================================ slvnvdemo_powerwindow_controller代码生成和编译生成的代码是过时了。构建时间:0h 0m 12.356s ### #准备启动SIL模拟…建筑与gcc。 MEX completed successfully. ### Starting SIL simulation for component: slvnvdemo_powerwindow_controller ### Application stopped ### Stopping SIL simulation for component: slvnvdemo_powerwindow_controller End CGV execution: status completed.
的sldvruncgvtest
返回一个cgv。CGV
对象。使用CGV API比较利用模型中设计的每个测试用例在仿真和SIL模式下执行的结果,并表明它们是相等的。
为i=1:length(loggedSignalsMergedHarness.TestCases) simout = cgvSim.getOutputData(i);silout = cgvSil.getOutputData(我);[matchNames, ~, mismatchNames, ~] =...cgv.CGV.compare (simout silout);流(“\n测试用例(%d):%d个信号匹配,%d个信号不匹配”,...我,长度(matchNames),长度(mismatchNames));结束
测试用例(1):4个信号匹配,0个信号不匹配测试用例(2):4个信号匹配,0个信号不匹配
要完成示例,请关闭所有模型。
close_system (harnessModel 0);close_system (newHarnessModel 0);close_system (“slvnvdemo_powerwindow”,0);关闭系统(“slvnvdemo_powerwindow_controller”,0);