定义和扩展现有测试用例
此示例展示了 Simulink® Design Verifier™ 如何使用额外的时间步扩展测试用例,以有效地生成完整的测试套件。
该示例从包含时间延迟特性的模型开始,这使得测试生成具有挑战性。通过创建默认的测试框架模型并手动编写一个测试,可以消除高效测试生成的关键障碍。Simulink Design Verifier 将来自框架模型的记录值作为输入,并有效地扩展此测试以创建完整的测试套件。
激励测试用例扩展的模型特征
sldvdemo_sbr_extend_design 模型包括使用时间逻辑的 Stateflow® 图 SBR,因此需要非常长的测试用例才能从 KEY_OFF 状态转移到 KEY_ON 状态。这种类型的时间延迟特性在使用延迟来拒绝虚假行为或等待物理系统或用户响应的设计中很常见。在这种设计中,满足此转换中的时态逻辑是测试 KEY_ON 状态内的任何状态和转移的常见障碍。
此类时间延迟特性通常易于识别,且可通过手动编写的测试用例轻松满足。
open_system('sldvdemo_sbr_extend_design'); sf('Open',sldvdemo_ssid_to_sfid('sldvdemo_sbr_extend_design/SBR',11));

创建框架模型并定义起始测试
Simulink Design Verifier 函数 sldvmakeharness 使用一个模块创建一个框架模型,该模块通过 Model 模块为包含的测试模型生成输入值。
在此示例中,您指定一个测试用例,使系统保持 KEY_OFF 状态 5 秒:
[~, harnessModelFilePath] = sldvmakeharness('sldvdemo_sbr_extend_design',[],[],true); [~, harnessModel] = fileparts(harnessModelFilePath); sigEditorBlk = [harnessModel '/Inputs']; fileName = get_param(sigEditorBlk, 'FileName'); tcData = load(fileName); % Prepare a test case of length 5 seconds TemporalTestCase = tcData.TestCase_1; TemporalTestCase{1}.Values.Speed = timeseries(fi(zeros(2,1), 0, 16, 2), [0;5], 'Name', 'Speed'); TemporalTestCase{1}.Values.SeatBeltFasten = timeseries(false(2,1), [0;5], 'Name', 'SeatBeltFasten'); TemporalTestCase{1}.Values.KEY = timeseries(zeros(2,1,'int8'), [0;5], 'Name', 'SeatBeltFasten'); save(fileName, 'TemporalTestCase'); % Set TemporalTestCase as active scenario set_param(sigEditorBlk, 'ActiveScenario', 'TemporalTestCase');

记录开始测试
为了利用上面定义的起始测试用例,您可以使用 sldvlogsignals 函数以必要的记录数据格式捕获输入值。
sldvlogsignals 的第一个输入是 Model 模块的路径,第二个输入是框架模型内的信号组的索引。当您调用 sldvlogsignals 时,包含 Model 模块的父模型会被仿真。
父模型不限于 Simulink Design Verifier 框架模型。或者,您可以记录使用 Model 模块包含控制器的闭环仿真模型的数据,以便控制器测试用例更真实地反映闭环系统中预期的连续时间行为。
[~, modelBlock] = find_mdlrefs(harnessModel, false);
loggeddata = sldvlogsignals(modelBlock{1});
在测试生成期间扩展现有测试
在测试生成期间使用现有测试数据之前,必须将数据保存到 MAT 文件中。您可以在 Simulink Design Verifier 配置参数的测试生成窗格中启用测试用例扩展。选择扩展现有测试用例,并在数据文件字段中指定 MAT 文件。
生成的测试要么使用一个或多个新的时间步扩展其中一个起始测试用例,要么从初始或默认配置开始指定一个或多个时间步。
save('existingtestcase.mat', 'loggeddata'); opts = sldvoptions; opts.ExtendExistingTests = 'on'; opts.ExistingTestFile = 'existingtestcase.mat'; opts.SaveHarnessModel = 'off'; opts.SaveReport = 'off'; [~, fileNames] = sldvrun('sldvdemo_sbr_extend_design', opts, true);
验证完整覆盖率
sldvruntest函数验证新的测试套件是否实现完整的模型覆盖率。cvhtml (Simulink Coverage) 函数生成覆盖率报告,表明使用生成的测试向量实现了 100% 的决策覆盖率。
[~, finalCov] = sldvruntest('sldvdemo_sbr_extend_design', fileNames.DataFile, [], true); cvhtml('Final Coverage', finalCov);

清理
为了完成演示,请关闭所有模型并删除已保存的记录数据文件。
close_system(harnessModel,0); close_system('sldvdemo_sbr_extend_design'); delete('existingtestcase.mat');