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

Этот пример показывает, как использовать функции верификации компонента Simulink® Coverage™, чтобы регистрировать входные сигналы, создать модель тестовой обвязки и выполнить тесты.

Пример запускается путем журналирования входных сигналов к компоненту, реализующему контроллер в его родительской модели и создающему модель тестовой обвязки для контроллера от этого записанные данные. Вы создаете новый тест в модели тестовой обвязки. Затем вы получаете все тесты и моделируете модели контроллеров для покрытия модели. Наконец, вы выполняете контроллер с теми тестами в режиме симуляции и режиме (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 = ...
    slvnvlogsignals('slvnvdemo_powerwindow/power_window_control_system/control');

harnessModelFilePath = ...
    slvnvmakeharness('slvnvdemo_powerwindow_controller',loggedSignalsPlant);
[~,harnessModel] = fileparts(harnessModelFilePath);
### Successfully updated the model reference simulation target for model: slvnvdemo_powerwindow_controller
### Successfully updated the model reference simulation target for model: slvnvdemo_powerwindow_controller

Автор новые тесты в модели тестовой обвязки

Можно изменить тестовые данные в модели тестовой обвязки путем ручного редактирования значений данных с помощью пользовательского интерфейса Signal Builder. Можно также создать новые тесты путем создания новых групп сигнала в блоке. Также можно использовать команду signalbuilder, чтобы выполнить то же самое программно.

load('slvnvdemo_powerwindow_controller_newtestcase.mat');

signalBuilderBlock = slvnvdemo_signalbuilder_block(harnessModel);
signalbuilder(signalBuilderBlock,'Append',...
    newTestTime, newTestData,...
    {'endstop','obstacle','driver(1)','driver(2)','driver(3)',...
    'passenger(1)','passenger(2)','passenger(3)'},'New Test Case');

Журналирование тестов модели тестовой обвязки

По порядку, чтобы программно выполнить модель slvnvdemo_powerwindow_controller с тестами, разработанными в модели тестовой обвязки, сначала необходимо использовать функцию slvnvlogsignals, чтобы получить входные значения всех тестов в необходимом формате данных.

loggedSignalsHarness = slvnvlogsignals(harnessModel);
disp(loggedSignalsHarness);
    LoggedTestUnitInfo: [1×1 struct]
             TestCases: [1×2 struct]

Симуляция тестов для покрытия модели

Используйте функцию slvnvruntest, чтобы моделировать контроллер со всеми тестами, разработанными в обвязке и измерить покрытие модели.

runopts = slvnvruntestopts;
runopts.coverageEnabled = true;

[~, covdata] = slvnvruntest('slvnvdemo_powerwindow_controller',...
    loggedSignalsHarness,runopts);
cvhtml('Coverage with Test Cases from Harness', covdata);

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

Используйте функцию slvnvruncgvtest, чтобы выполнить модель slvnvdemo_powerwindow_controller в режиме симуляции с тестами, полученными от модели тестовой обвязки.

runopts = slvnvruntestopts('cgv');
disp(runopts);

runopts.cgvConn = 'sim';
cgvSim = slvnvruncgvtest('slvnvdemo_powerwindow_controller',...
    loggedSignalsHarness,runopts);
           testIdx: []
    allowCopyModel: 0
       cgvCompType: 'topmodel'
           cgvConn: 'sim'

Starting execution:
  ComponentType: topmodel
  Connectivity: sim
  InputData:
  Q:\matlab\toolbox\slcoverage\slcovdemos\cgv_runtest\slvnvdemo_powerwindow_controller\slvnvdemo_powerwindow_controller_cgv_input_tc_1_2.mat
End CGV execution: status completed.
Starting execution:
  ComponentType: topmodel
  Connectivity: sim
  InputData:
  Q:\matlab\toolbox\slcoverage\slcovdemos\cgv_runtest\slvnvdemo_powerwindow_controller\slvnvdemo_powerwindow_controller_cgv_input_tc_2_2.mat
End CGV execution: status completed.

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

Теперь используйте функцию slvnvruncgvtest, чтобы выполнить модель 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 = slvnvruncgvtest('slvnvdemo_powerwindow_controller',...
    loggedSignalsHarness,runopts);
Starting execution:
  ComponentType: topmodel
  Connectivity: sil
  InputData:
  Q:\matlab\toolbox\slcoverage\slcovdemos\cgv_runtest\slvnvdemo_powerwindow_controller\slvnvdemo_powerwindow_controller_cgv_input_tc_1_3.mat
### Starting build procedure for model: slvnvdemo_powerwindow_controller
### Successful completion of build procedure for model: slvnvdemo_powerwindow_controller
### Preparing to start SIL simulation ...
Building with 'Microsoft Visual C++ 2015 Professional (C)'.
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:
  Q:\matlab\toolbox\slcoverage\slcovdemos\cgv_runtest\slvnvdemo_powerwindow_controller\slvnvdemo_powerwindow_controller_cgv_input_tc_2_3.mat
### Starting build procedure for model: slvnvdemo_powerwindow_controller
### Successful completion of build procedure for model: slvnvdemo_powerwindow_controller
### Preparing to start SIL simulation ...
Building with 'Microsoft Visual C++ 2015 Professional (C)'.
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

slvnvruncgvtest возвращает объект cgv.CGV после запущения тестов. Используйте API CGV, чтобы сравнить результаты выполнения в симуляции и режимах SIL для каждого теста, разработанного в модели тестовой обвязки и показать, что они равны.

for i=1:length(loggedSignalsHarness.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

Используя API CGV, чтобы обнаружить несоответствия

Наконец, вы сознательно сравниваете результаты выполнения для различных тестов, которые не должны совпадать и видеть, как API CGV может быть усилен, чтобы обнаружить и построить несоответствия в результатах.

simout   = cgvSim.getOutputData(1);
silout   = cgvSil.getOutputData(2);
[matchNames , ~, mismatchNames, ~ ] = ...
        cgv.CGV.compare( simout, silout, 'Plot', 'mismatch');
fprintf('\n%d Signals match, %d Signals mismatch\n', ...
    length(matchNames), length(mismatchNames));
disp('Mismatched Signal Names:');
disp(mismatchNames);
2 Signals match, 2 Signals mismatch
Mismatched Signal Names:
    'simout.get('logsout_slvnvruncgv…'    'simout.get('yout_slvnvruncgvtes…'

Просмотр и сравнение модели Выходные параметры графически

Используйте Инспектора Данных моделирования, чтобы построить образцовые выходные параметры и графически сравнить результаты симуляции и выполнения SIL. Вы запускаете Инспектора Данных моделирования с Симуляцией-> вывод-> Инспектор Данных моделирования... пункт меню. Можно загрузить результаты CGV с данными о пункте меню File-> Import... по интерфейсу Simulation Data Inspector. Выберите все восемь записей, связанных с этими переменными результата:

simout1 = cgvSim.getOutputData(1);
silout1 = cgvSil.getOutputData(1);

simout2 = cgvSim.getOutputData(2);
silout2 = cgvSil.getOutputData(2);

Очистка

Чтобы завершить пример, закройте все модели.

close_system(harnessModel,0);
close_system('slvnvdemo_powerwindow');
close_system('slvnvdemo_powerwindow_controller');