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

В этом примере показано, как использовать функции 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]

Выполните модель в режиме симуляции с CGV API

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

Выполните модель в режиме Software-In-the-Loop (SIL) с CGV API

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

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);