В этом примере показано, как использовать функции Simulink ® Design Verifier™ для регистрации входных сигналов, создания модели тестовой обвязки, генерации тестов для недостающего покрытия, объединения моделей тестовой обвязки и выполнения тестов.
Пример начинается с регистрации входных сигналов к компоненту, который реализует контроллер в его родительской модели и создания модели тестовой обвязки для контроллера из этих записанных данных. Вы используете Simulink Design Verifier, чтобы найти новый тест, который достигает недостающего покрытия. Затем вы объединяете первую модель тестовой обвязки с моделью тестовой обвязки, сгенерированной после анализа Simulink Design Verifier. Наконец, вы захватываете все тесты и выполняете контроллер с этими тестами в режиме симуляции и в режиме Software-In-the-Loop (SIL), и сравниваете результаты с помощью CGV API.
Для этого примера требуется действительная лицензия Stateflow ®. Для демонстрации тестирования в режиме Software-In-the-Loop (SIL) также требуются действительные лицензии Simulink ® Coder™ и Embedded Coder™.
if ~license('test','Stateflow') return; end canUseSIL = license('test','Real-Time_Workshop') && ... license('test','RTW_Embedded_Coder');
The slvnvdemo_powerwindow
модель содержит контроллер окна со степенью и модель объекта управления порядка. Область компонента slvnvdemo_powerwindow/power_window_control_system/control
является блоком Model, который ссылается на модель slvnvdemo_powerwindow_controller
, который реализует контроллер с графиком Stateflow ®.
Чтобы создать модель тестовой обвязки для контроллера с сигналами, которые моделируют контроллер в модели объекта управления, сначала запишите входные сигналы, а затем активируйте генерацию обвязки с помощью этих записанных данных.
open_system('slvnvdemo_powerwindow'); load_system('slvnvdemo_powerwindow_controller'); loggedSignalsPlant = ... sldvlogsignals('slvnvdemo_powerwindow/power_window_control_system/control'); harnessModelFilePath = ... sldvmakeharness('slvnvdemo_powerwindow_controller',loggedSignalsPlant); [~,harnessModel] = fileparts(harnessModelFilePath);
### Starting serial model reference simulation build ### Successfully updated the model reference simulation target for: slvnvdemo_powerwindow_controller Build Summary Simulation targets built: Model Action Rebuild Reason ============================================================================================================================ slvnvdemo_powerwindow_controller Code generated and compiled slvnvdemo_powerwindow_controller_msf.mexa64 does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 20.595s ### Starting serial model reference simulation build ### Model reference simulation target for slvnvdemo_powerwindow_controller is up to date. Build Summary 0 of 1 models built (1 models already up to date) Build duration: 0h 0m 0.55742s ### Starting serial model reference simulation build ### Successfully updated the model reference simulation target for: slvnvdemo_powerwindow_controller Build Summary Simulation targets built: Model Action Rebuild Reason =============================================================================== slvnvdemo_powerwindow_controller Code generated and compiled 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 11.29s
Используйте cvtest
и cvsim
функции для измерения покрытия модели, достигнутого для моделей контроллеров slvnvdemo_powerwindow_controller
с записанными сигналами, которые захватываются в модели тестовой обвязки.
The cvhtml
функция создает отчет, который указывает, что 40% Decision, 35% условие и 10% покрытия MCDC достигаются путем симуляции тестов, полученных из модели с обратной связью.
test = cvtest(harnessModel); test.modelRefSettings.enable = 'On'; test.modelRefSettings.excludeTopModel = 1; covDataFromLoggedSignals = cvsim(test); cvhtml('Coverage with Logged Test Cases',covDataFromLoggedSignals);
Перед использованием существующих данных покрытия во время генерации тестов данные должны быть сохранены в файле данных покрытия (.cvt). Можно использовать существующие данные о покрытии, задав путь данных о покрытии в параметре Файл данных о покрытии и задав значение Цели игнорирования, удовлетворенные в существующем параметре данных о покрытии on
на панели «Генерация тестов» параметров конфигурации Simulink Design Verifier.
Как видно из отчета, Simulink Design Verifier ограничивает генерацию тестов целями покрытия, которые не охвачены существующим файлом покрытия. Заметьте, что 8 целей покрытия на диаграмме Stateflow control
доказаны неудовлетворительными. Это указывает на ненужную избыточную логику, которая не может быть протестирована.
cvsave('existingCovFromLoggedSignals',covDataFromLoggedSignals); opts = sldvoptions; opts.IgnoreCovSatisfied = 'on'; opts.CoverageDataFile = 'existingCovFromLoggedSignals.cvt'; opts.ModelCoverageObjectives = 'MCDC'; opts.TestSuiteOptimization = 'LongTestcases'; opts.SaveHarnessModel = 'on'; opts.ModelReferenceHarness = 'on'; opts.MaxProcessTime = 500; [status, fileNames] = sldvrun('slvnvdemo_powerwindow_controller',opts,true); [~, newHarnessModel] = fileparts(fileNames.HarnessModel); open_system(newHarnessModel);
Теперь используйте sldvmergeharness
для объединения сгенерированных тестов с зарегистрированным тестом. Команда принимает в качестве аргументов список моделей тестовой обвязки.
sldvmergeharness(harnessModel, newHarnessModel);
В порядок программно выполнить модель slvnvdemo_powerwindow_controller
с тестов, захваченной в объединённой модели тестовой обвязки, сначала используйте sldvlogsignals
функция для получения входных значений всех тестов в необходимом формате данных.
loggedSignalsMergedHarness = sldvlogsignals(harnessModel); disp(loggedSignalsMergedHarness);
LoggedTestUnitInfo: [1x1 struct] TestCases: [1x2 struct]
Используйте sldvruncgvtest
функция для выполнения модели slvnvdemo_powerwindow_controller
в режиме симуляции с тестами, полученными из модели тестовой обвязки.
runopts = sldvruntestopts('cgv'); disp(runopts); runopts.cgvConn = 'sim'; cgvSim = sldvruncgvtest('slvnvdemo_powerwindow_controller',... loggedSignalsMergedHarness,runopts);
testIdx: [] allowCopyModel: 0 cgvCompType: 'topmodel' cgvConn: 'sim' Starting execution: ComponentType: topmodel Connectivity: sim InputData: /tmp/BR2021ad_1584584_202060/publish_examples0/tp6e10a940/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_1.mat End CGV execution: status completed. Starting execution: ComponentType: topmodel Connectivity: sim InputData: /tmp/BR2021ad_1584584_202060/publish_examples0/tp6e10a940/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_2.mat End CGV execution: status completed.
Теперь используйте sldvruncgvtest
функция для выполнения модели slvnvdemo_powerwindow_controller
в режиме SIL с теми же тестами.
if canUseSIL runopts.cgvConn = 'sil'; else % When SIL is not possible, the example runs another simulation. runopts.cgvConn = 'sim'; end cgvSil = sldvruncgvtest('slvnvdemo_powerwindow_controller',... loggedSignalsMergedHarness,runopts);
Starting execution: ComponentType: topmodel Connectivity: sil InputData: /tmp/BR2021ad_1584584_202060/publish_examples0/tp6e10a940/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_1_1.mat ### Starting build procedure for: slvnvdemo_powerwindow_controller ### Successful completion of build procedure for: slvnvdemo_powerwindow_controller Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================================= slvnvdemo_powerwindow_controller Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.243s ### Preparing to start SIL simulation ... Building with '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. Starting execution: ComponentType: topmodel Connectivity: sil InputData: /tmp/BR2021ad_1584584_202060/publish_examples0/tp6e10a940/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_2_1.mat ### Starting build procedure for: slvnvdemo_powerwindow_controller ### Successful completion of build procedure for: slvnvdemo_powerwindow_controller Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================ slvnvdemo_powerwindow_controller Code generated and compiled Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 6.9951s ### Preparing to start SIL simulation ... Building with '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.
The sldvruncgvtest
возвращает cgv.CGV
объект после выполнения тестов. Используйте CGV API, чтобы сравнить результаты выполнения в режимах симуляции и SIL для каждого теста, разработанного в модели тестовой обвязки, и показать, что они равны.
for i=1:length(loggedSignalsMergedHarness.TestCases) simout = cgvSim.getOutputData(i); silout = cgvSil.getOutputData(i); [matchNames, ~, mismatchNames, ~ ] = ... cgv.CGV.compare(simout, silout); fprintf('\nTest Case(%d): %d Signals match, %d Signals mismatch', ... i, length(matchNames), length(mismatchNames)); end
Test Case(1): 4 Signals match, 0 Signals mismatch Test Case(2): 4 Signals match, 0 Signals mismatch
Чтобы завершить пример, закройте все модели.
close_system(harnessModel,0); close_system(newHarnessModel,0); close_system('slvnvdemo_powerwindow',0); close_system('slvnvdemo_powerwindow_controller',0);