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

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

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

Проверьте наличие продукта

Этот пример требует допустимой лицензии Stateflow®. Чтобы продемонстрировать выполнение теста в режиме (SIL) программного обеспечения In the Loop, это также требует допустимого 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 компонента блок 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
### Starting serial model reference simulation build
### Model reference simulation target for slvnvdemo_powerwindow_controller is up to date.
### Starting serial model reference simulation build
### Successfully updated the model reference simulation target for: slvnvdemo_powerwindow_controller

Измерение покрытия с регистрируемыми сигналами

Используйте 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 в панели Генерации тестов параметров конфигурации Simulink Design Verifier.

Как вы видите в отчете, Simulink Design Verifier ограничивает генерацию тестов целями покрытия, которые не покрыты существующим файлом покрытия. Заметьте что 8 целей покрытия в диаграмме Stateflow control как доказывают, невыполнимы. Это указывает на ненужную избыточную логику, которая не может быть протестирована.

cvsave('existingCovFromLoggedSignals',covDataFromLoggedSignals);

opts = sldvoptions;
opts.DisplayUnsatisfiableObjectives = 'off';
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/BR2020ad_1316498_123416/publish_examples0/tpaa228cee/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_1.mat
The signal logging save format setting of ModelDataLogs will be ignored and signals marked for logging will be logged in Dataset format. When you save the model, Simulink will reconfigure the model to use Dataset format for signal logging.
End CGV execution: status completed.
Starting execution:
  ComponentType: topmodel
  Connectivity: sim
  InputData:
  /tmp/BR2020ad_1316498_123416/publish_examples0/tpaa228cee/ex67947267/cgv_runtest/slvnvdemo_powerwindow_controller/slvnvdemo_powerwindow_controller_cgv_input_tc_2.mat
End CGV execution: status completed.

Выполните модель в программном обеспечении In the Loop (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/BR2020ad_1316498_123416/publish_examples0/tpaa228cee/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
### Preparing to start SIL simulation ...
Building with 'gcc'.
MEX completed successfully.
### Starting SIL simulation for component: slvnvdemo_powerwindow_controller
The signal logging save format setting of ModelDataLogs will be ignored and signals marked for logging will be logged in Dataset format. When you save the model, Simulink will reconfigure the model to use Dataset format for signal logging.
### Stopping SIL simulation for component: slvnvdemo_powerwindow_controller
End CGV execution: status completed.
Starting execution:
  ComponentType: topmodel
  Connectivity: sil
  InputData:
  /tmp/BR2020ad_1316498_123416/publish_examples0/tpaa228cee/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
### 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);