exponenta event banner

Создание и выполнение тестовых примеров

В этом примере показано, как использовать функции Simulink ® Design Verifier™ для регистрации входных сигналов, создания модели кабельных трасс, создания тестовых примеров для отсутствующего покрытия, объединения моделей кабельных трасс и выполнения тестовых примеров.

Пример начинается с регистрации входных сигналов в компоненте, который реализует контроллер в родительской модели, и создания модели кабельных трасс для контроллера на основе записанных данных. Вы используете Simulink Design Verifier, чтобы найти новый тестовый случай, который достигает недостающего покрытия. Затем первую модель электрического жгута объединяют с моделью электрического жгута, созданной после анализа Simulink Design Verifier. Наконец, вы захватываете все тестовые примеры и выполняете контроллер с этими тестовыми примерами в режиме моделирования и в режиме программного обеспечения в цикле (SIL), а также сравниваете результаты с помощью API CGV.

Проверка доступности продукта

В этом примере требуется действительная лицензия Stateflow ®. Для демонстрации выполнения теста в режиме SIL также требуются действительные лицензии Simulink ® Coder™ и Embedded Coder™.

if ~license('test','Stateflow')
    return;
end

canUseSIL = license('test','Real-Time_Workshop') && ...
    license('test','RTW_Embedded_Coder');

Регистрация входных сигналов в компоненте и создание модели кабельных трасс

slvnvdemo_powerwindow модель содержит контроллер окна питания и модель установки низкого порядка. Компонент slvnvdemo_powerwindow/power_window_control_system/control является блоком модели, который ссылается на модель 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 с записанными сигналами, которые фиксируются в модели кабельных трасс.

cvhtml функция создает отчет, который указывает, что 40% решения, 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 на панели Test Generation конфигурационных параметров 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]

Выполнение модели в режиме моделирования с помощью API CGV

Используйте 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.

Выполнение модели в режиме программного обеспечения в цикле (SIL) с помощью API CGV

Теперь используйте 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.

Сравнение результатов моделирования и режимов SIL

sldvruncgvtest возвращает cgv.CGV объект после выполнения тестов. Используйте API CGV, чтобы сравнить результаты выполнения в режимах моделирования и 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);