主要内容

创建和执行测试用例

此示例演示如何使用Simulink®设计验证程序™ 用于记录金宝app输入信号、创建线束模型、生成缺失覆盖的测试用例、合并线束模型和执行测试用例的功能。

本示例首先记录在其父模型中实现控制器的组件的输入信号,并根据记录的数据创建控制器的线束模型。您可以使用Simulink设计验证器来查找实现缺失覆盖率的新测试用例。然后,将第一个线束模型与Simulink Design Verifier分析后生成的线束模型合并。最后,捕获所有测试用例并在模拟模式和软件在环(SIL)模式下使用这些测试用例执行控制器,并使用CGV API比较结果。金宝app

检查产品可用性

此示例需要有效的Stateflow®许可证。为了演示在软件环路(SIL)模式下的测试执行,还需要有效的Simulink®编码器™ 嵌入式编码器™ 执照。金宝app

如果~z~执照(“测试”,“状态流”)回来;终止canUseSIL=许可证(“测试”,“实时工作坊”) &&...许可证(“测试”,“RTW_嵌入式编码器”);

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

这个slvnvdemo_电动窗模型包含一个电动窗控制器和一个低阶设备模型slvnvdemo\u电动车窗/电动车窗控制系统/控制是参照模型的模型块slvnvdemo\u powerwindow\u控制器,它使用Stateflow®图表实现控制器。

要使用电厂模型中模拟控制器的信号为控制器创建线束模型,请首先记录输入信号,然后使用记录的数据调用线束生成。

开放式系统(“slvnvdemo\u powerwindow”);加载系统(“slvnvdemo\u powerwindow\u控制器”); loggedSignalsPlant=...sldvlogsignals(“slvnvdemo\u电动车窗/电动车窗控制系统/控制”);harnessModelFilePath=...sldvmakeharness(“slvnvdemo\u powerwindow\u控制器”,loggedSignalPlant);[~,harnessModel]=fileparts(harnessModelFilePath);
###正在启动串行模型参考仿真生成###成功更新了以下对象的模型参考仿真目标:slvnvdemo\u powerwindow\u控制器生成摘要生成的仿真目标:模型操作重建原因========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================生成和编译的slvnvdemo_powerwindow_控制器代码slvnvdemo_powerwindow_控制器_msf.mexa64不存在。生成了1个模型中的1个(0个模型已更新)构建持续时间:0h 0m 26.893s##########slvnvdemo(U powerwindow)控制器的模型参考仿真目标是最新的。构建摘要已构建1个模型中的0个(1个模型已更新)生成持续时间:0h 0m 0.65053s####开始串行模型参考模拟生成####成功更新了模型参考模拟目标:slvnvdemo(U powerwindow)控制器生成摘要模拟目标生成:模型操作重建原因=slvnvdemo生成和编译的1个已生成模型(0个已更新模型)中的1个窗口控制器代码生成持续时间:0h 0m 13.436s

用记录的信号测量覆盖范围

使用cvtestcvsim用于测量控制器模型实现的模型覆盖率的函数slvnvdemo\u powerwindow\u控制器使用线束模型中捕获的记录信号。

这个cvhtml函数生成一个报告,表明通过模拟从闭环模型捕获的测试用例,实现了40%的决策、35%的条件和10%的MCDC覆盖率。

测试=cvtest(harnessModel);test.modelRefSettings.enable=“开”;test.modelRefSettings.excludeTopModel=1;covDataFromLoggedSignals=cvsim(测试);cvhtml(“记录测试用例的覆盖率”,covDataFromLoggedSignals);

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

在生成测试期间使用现有覆盖率数据之前,必须将数据保存到覆盖率数据文件(.cvt)中。您可以通过在中指定覆盖率数据路径来使用现有覆盖率数据覆盖率数据文件参数和设置忽略现有覆盖率数据中满足的目标参数到在…上测试生成Simulink金宝app设计验证程序配置参数窗格。

正如您在报告中所看到的,Simulink Design Ve金宝apprifier将测试生成限制为现有覆盖率文件中未涵盖的覆盖率目标。请注意,状态流程图中有8个覆盖目标控制被证明是不可满足的。这表明不必要的冗余逻辑无法测试。

cvsave(“existingCovFromLoggedSignals”,covDataFromLoggedSignals);opts=sldvoptions;选择Ignorecov=“开”; opts.coverage数据文件=“existingCovFromLoggedSignals.cvt”;opts.modelCoverage对象=“MCDC”;opts.TestSuiteOptimization=“最长案例”;opts.saveharnesmodel=“开”; opts.ModelReferenceHarness=“开”;opts.MaxProcessTime=500;[状态,文件名]=sldvrun(“slvnvdemo\u powerwindow\u控制器”,opts,true);[~,newHarnessModel]=fileparts(filename.HarnessModel);open_系统(newHarnessModel);

从线束模型合并测试用例

现在使用SLDV安全带将生成的测试用例与记录的测试用例相结合。该命令将线束模型列表作为参数。

sldvmergeharness(harnessModel、newHarnessModel);

记录线束模型的测试用例

为了以编程方式执行模型slvnvdemo\u powerwindow\u控制器在合并线束模型中捕获测试用例后,首先使用sldvlogsignals函数以必要的数据格式获取所有测试用例的输入值。

loggedSignalsMergedHarness=sldvlogsignals(harnessModel);disp(loggedSignalsMergedHarness);
LoggedTestUnitInfo:[1x1结构]测试用例:[1x2结构]

使用CGV API在仿真模式下执行模型

使用sldvruncgvtest函数来执行模型slvnvdemo\u powerwindow\u控制器在模拟模式下,从线束模型捕获测试用例。

runopts=SLDVRUNTESOPTS(“cgv”);disp(runopts);runopts.cgvConn=“sim”; cgvSim=sldvruncgvtest(“slvnvdemo\u powerwindow\u控制器”,...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执行:状态完成。

使用CGV API以软件在环(SIL)模式执行模型

现在使用sldvruncgvtest函数来执行模型slvnvdemo\u powerwindow\u控制器在SIL模式下,使用相同的测试用例。

如果canUseSIL runopts.cgvConn=“sil”;其他的%当无法实现SIL时,该示例将运行另一个模拟。runopts.cgvConn=“sim”;终止cgvSil=sldvruncgvtest(“slvnvdemo\u powerwindow\u控制器”,...loggedSignalsMergedHarness,runopts);
开始执行:组件类型:topmodel连接:sil输入数据:/tmp/Bdoc21b_1757077_40715/tp300809f9/ex67947267/cgv_运行测试/slvnvdemo_powerwindow_控制器/slvnvdemo_powerwindow_控制器_cgv_输入_tc_1_1.mat###启动构建过程:slvnvdemo##powerwindow#控制器#成功完成构建过程:SLVNPowerwindow\u控制器生成摘要生成的顶级模型目标:模型操作生成原因====================================================================================================================================================================================================================================================================================================生成的SLVNDEMU powerwindow POWERU控制器代码和编译后的代码生成文件不存在。1个生成模型的代码生成信息(0个型号已更新)构建持续时间:0h 0m 23.631s######准备启动SIL模拟…使用“gcc”构建。MEX已成功完成。###启动组件的SIL模拟:slvnvdemo#U powerwindow#控制器#应用程序已停止##停止组件的SIL模拟:slvnvdemo U powerwindow U控制器结束CGV执行:状态已完成。启动execu选项:组件类型:topmodel连接:sil输入数据:/tmp/Bdoc21b_1757077_40715/tp300809f9/ex67947267/cgv_运行测试/slvnvdemo_powerwindow_控制器/slvnvdemo_powerwindow_控制器_cgv_输入_tc_2_1.mat##启动构建过程:slvnvdemo##u powerwindow控制器#成功完成构建过程:powerwindowtroller生成摘要生成的顶级模型目标:模型操作生成原因==================================================================================================================================================================================生成的SLVNMemo\U powerwindow\U控制器代码已过期。生成的1个模型中有1个(0个模型已更新)构建持续时间:0h 0m 12.356s######准备启动SIL模拟…使用“gcc”构建。MEX已成功完成。###启动组件的SIL模拟:slvnvdemo#U powerwindow#U控制器#应用程序已停止###停止组件的SIL模拟:slvnvdemo U powerwindow U控制器结束CGV执行:状态已完成。

比较仿真和SIL模式的结果

这个sldvruncgvtest返回一个cgv.cgv对象在运行测试后。使用CGV API比较线束模型中设计的每个测试用例在模拟和SIL模式下的执行结果,并表明它们相等。

对于i=1:length(loggedSignalsMergedHarness.TestCases)simout=cgvSim.getOutputData(i);silout=cgvSil.getOutputData(i);[matchNames,~,mistchnames,~]=...cgv.cgv.compare(simout,silout);fprintf(“\n测试用例(%d):%d个信号匹配,%d个信号不匹配”,...i、 长度(匹配名称),长度(不匹配名称);终止
测试用例(1):4个信号匹配,0个信号不匹配测试用例(2):4个信号匹配,0个信号不匹配

清理

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

关闭系统(harnessModel,0);关闭系统(newHarnessModel,0);关闭系统(“slvnvdemo\u powerwindow”,0);关闭系统(“slvnvdemo\u powerwindow\u控制器”,0);