主要内容

创建和执行测试用例

这个例子展示了如何使用Simulink®Design Ver金宝appifier™函数来记录输入信号,创建一个harness模型,为缺失的覆盖率生成测试用例,合并harness模型,并执行测试用例。

该示例通过将输入信号记录到实现控制器在其父模型中的组件中,并从该记录数据创建控制器的线束模型。您可以使用Sim金宝appulink设计验证程序查找实现缺失覆盖范围的新测试用例。然后,您将第一个线束模型与Simulink设计验证程序分析后生成的线束模型合并。金宝app最后,您捕获所有测试用例并在仿真模式和循环(SIL)模式下使用这些测试用例执行控制器,并使用CGV API进行比较结果。

检查产品的可用性

此示例需要有效的statflow®许可证。为了演示在software - in - loop (SIL)模式下的测试执行,还需要有效的Simulink®Coder™和Embedded Coder™许可。金宝app

如果〜许可证(“测试”'eventflow'返回;结束canusesil =许可证(“测试”'实时_workshop')&&......执照(“测试”'rtw_embedded_coder');

将输入信号记录到组件并创建线束模型

slvnvdemo_powerwindow.模型包含电源窗口控制器和低阶工厂模型。组成部分SLVNVDEMO_POWERWINDOW / POWER_WINDOW_CONTROL_SYSTEM / CONTROL模型块是否引用了模型slvnvdemo_powerwindow_controller.使用StateFlow®Chart实现控制器。

要为控制器创建一个带信号的管理模型,该信号模拟工厂模型中的控制器,首先记录输入信号,然后使用记录的数据调用管理生成。

Open_System('slvnvdemo_powerwindow');load_system(“slvnvdemo_powerwindow_controller”);LoggedSignAlnalPlant =.......sldvlogsignals (“slvnvdemo_powerwindow / power_window_control_system /控制”);harnessModelFilePath =......SLDVMakeharness(“slvnvdemo_powerwindow_controller”,loggedSignalAlplant);[〜,harnessmodel] = fileparts(harnessmodelfilepath);
###启动串行模型参考模拟构建###成功更新了模型参考仿真目标:slvnvdemo_powerwindow_controller构建摘要模拟仿真目标:模型动作重建原因====================================================================================================================================================================================== slvnvdemo_powerwindow_controller代码生成和编译的slvnvdemo_powerwindow_controller_msf.mexa64不存在。1个中构建(0型号已最新的0型号)构建持续时间:0H 0M 29.351S ###启动串行模型参考仿真构建### SLVNVDEMO_POWERWINDOM_CONTROLLER的模型参考仿真目标是最新的。构建摘要0中构建的1型号(已最新的1型号)构建持续时间:0H 0M 0.8083S ###启动串行模型参考仿真构建###成功更新了模型参考仿真目标:SLVNVDEMO_POWERWINDOM_CONTROLLER构建摘要模拟仿真目标:模型动作重建原因=============================================================================== slvnvdemo_powerwindow_controller代码生成和编译1个模型构建(0型号已最新)构建持续时间:0H 0m 15.55s

用记录信号测量覆盖范围

使用CVTest.CVSIM用于测量控制器模型所实现的模型覆盖的功能slvnvdemo_powerwindow_controller.使用在线束模型中捕获的记录信号。

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;opts.ignorecovsatisfied ='上';opts.CoverageDatafile ='现有录帧romloggedsignals.cvt';opts.modelcoverageObjectives ='MCDC';opts.testsuiteoptimization =.'longtestcases';Opts.SaveHarnessModel ='上';opts.modelreferenceharness ='上';opts.maxprocesstime = 500;[状态,文件名] = sldvrun(“slvnvdemo_powerwindow_controller”,选择,真实);[〜,newharnessmodel] = fileparts(filenames.harnessmodel);Open_System(NewHarnessModel);

合并Harness模型的测试用例

现在使用SLDVMerGeharness.将生成的测试用例组合在记录的测试用例中。该命令将线束模型列表作为参数。

Sldvergeharness(Harnessmodel,Newharnessmodel);

利示模型的测井测试用例

为了以编程方式执行模型slvnvdemo_powerwindow_controller.对于在合并的管理模型中捕获的测试用例,首先使用sldvlogsignals.函数以必要的数据格式获取所有测试用例的输入值。

loggedSignalsMergedHarness = sldvlogsignals (harnessModel);disp (loggedSignalsMergedHarness);
loggedtestunitinfo:[1x1 struct] testcases:[1x2 struct]

使用CGV API执行模拟模式的模型

使用sldvruncgvtest函数来执行模型slvnvdemo_powerwindow_controller.在仿真模式下,具有从线束模型捕获的测试用例。

runopts = sldvruntestopts ('cgv');disp(rounopts);RONOPTS.CGVCONN ='sim';cgvsim = sldvruncgvtest(“slvnvdemo_powerwindow_controller”......LoggedSignalSmergergharness,Rousopts);
testIdx:[] allowCopyModel:0 cgvCompType: 'TOPMODEL' cgvConn: 'SIM' 开始执行:COMPONENTTYPE:TOPMODEL连接:SIM InputData:/tmp/Bdoc21a_1606923_115738/tp63569e3a/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_1.mat结束CGV执行:状态完成。起始执行:ComponentType:TopModel Connectivity:SIM输入数据:/tmp/bdoc21a_1606923_115738/tp63569e3a/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_2.mat结束CGV执行:状态已完成。

使用CGV API执行软件循环(SIL)模式中的模型

现在使用sldvruncgvtest函数来执行模型slvnvdemo_powerwindow_controller.在SIL模式下,具有相同的测试用例。

如果Canusesil Rounopts.cgvconn =.“银”;其他的%当SIL不可能时,示例运行另一个模拟。RONOPTS.CGVCONN ='sim';结束cgvsil = sldvruncgvtest(“slvnvdemo_powerwindow_controller”......LoggedSignalSmergergharness,Rousopts);
开始执行:ComponentType: topmodel Connectivity: sil InputData: /tmp/Bdoc21a_1606923_115738/tp63569e3a/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_1_1。### start build procedure for: slvnvdemo_powerwindow_controller模型重建行动的原因  ================================================================================================================= slvnvdemo_powerwindow_controller代码生成和编译代码生成信息文件不存在。构建时间:0h 0m 21.862 ###准备开始SIL模拟…建筑与gcc。墨西哥人成功完成。###启动SIL模拟组件:slvnvdemo_powerwindow_controller开始执行:ComponentType: topmodel Connectivity: sil InputData: /tmp/Bdoc21a_1606923_115738/tp63569e3a/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_2_1。### start build procedure for: slvnvdemo_powerwindow_controller模型重建行动的原因  ================================================================================================ slvnvdemo_powerwindow_controller代码生成和编译生成的代码是过时了。构建时间:0h 0m 16.519s ### #准备开始SIL模拟…建筑与gcc。 MEX completed successfully. ### Starting SIL simulation for component: slvnvdemo_powerwindow_controller ### Stopping SIL simulation for component: slvnvdemo_powerwindow_controller End CGV execution: status completed.

比较模拟和SIL模式的结果

sldvruncgvtest返回A.cgv.cgv.运行测试后对象。使用CGV API将每个测试用例的模拟和SIL模式中的执行结果进行比较,并显示它们相等。

i = 1:长度(loggedsignsallmergedharness.TestCases)Simout = CGVSIM.GetOutputData(i);silout = cgvsil.getoutputdata(i);[匹配名,〜,mismatchnames,〜] =......cgv.cgv.compare(SIMOUT,SILOUT);fprintf('\ ntest案例(%d):%d信号匹配,%d信号不匹配'......我,长度(匹配法),长度(mismatchnames));结束
测试用例(1):4信号匹配,0信号不匹配测试案例(2):4信号匹配,0信号不匹配

清理

要完成示例,请关闭所有型号。

close_system (harnessModel 0);close_system (newHarnessModel 0);close_system ('slvnvdemo_powerwindow',0);close_system (“slvnvdemo_powerwindow_controller”,0);