Этот пример использует модель slvnvdemo_powerwindow
, чтобы показать, как проверить компонент в контексте модели, которая содержит тот компонент. Когда вы работаете через этот пример, вы используете функции верификации компонента Simulink® Design Verifier™, чтобы создать тесты и покрытие меры для модели, на которую ссылаются. Кроме того, можно выполнить модель, на которую ссылаются, и в режиме симуляции и в программном обеспечении в режиме Loop (SIL) с помощью API Верификации генерации кода (CGV).
У вас должны быть следующие лицензии на продукты, чтобы запустить этот пример:
Stateflow®
Embedded Coder®
Simulink Coder™
Компонент, который вы проверяете, является блоком Model под названием control
. Этот компонент находится в подсистеме power_window_control_system
в верхнем уровне модели slvnvdemo_powerwindow
. Подсистему power_window_control_system
показывают ниже.
Блок Model control
ссылается на модель slvnvdemo_powerwindow_controller
.
Модель, на которую ссылаются, содержит диаграмму Stateflow control
, который реализует логику для контроллера окна со стеклоподъемником.
Чтобы проверить модель slvnvdemo_powerwindow_controller
, на которую ссылаются, создайте модель тестовой обвязки, которая содержит входные сигналы, которые моделируют контроллер в модели объекта управления:
Откройте модель slvnvdemo_powerwindow
в качестве примера и модель, на которую ссылаются:
open_system('slvnvdemo_powerwindow'); open_system('slvnvdemo_powerwindow_controller');
Откройте подсистему power_window_control_system
в модели в качестве примера.
Блок Model под названием control
в подсистеме power_window_control_system
ссылается на компонент, который вы проверяете во время этого примера, slvnvdemo_powerwindow_controller
.
Моделируйте блок Model, который ссылается на модель slvnvdemo_powerwindow_controller
, и регистрируйте входные сигналы к блоку Model:
loggedSignalsPlant = sldvlogsignals( ... 'slvnvdemo_powerwindow/power_window_control_system/control');
sldvlogsignals
хранит регистрируемые сигналы в loggedSignalsPlant
.
Сгенерируйте модель тестовой обвязки с регистрируемыми сигналами:
harnessModelFilePath = sldvmakeharness( ... 'slvnvdemo_powerwindow_controller', loggedSignalsPlant);
sldvmakeharness
создает и открывает модель тестовой обвязки под названием slvnvdemo_powerwindow_controller_harness
. Блок Signal Builder содержит один тест, содержащий регистрируемые сигналы.
Для получения дополнительной информации о моделях тестовой обвязки, смотрите Модели тестовой обвязки Simulink Design Verifier.
Для использования позже в этом примере, сохраните имя модели тестовой обвязки:
[~, harnessModel] = fileparts(harnessModelFilePath);
Оставьте все окна открытыми для следующей части этого примера.
Затем, вы запишете покрытие для модели slvnvdemo_powerwindow_controller
.
Покрытие модели является мерой того, как полностью тест тестирует модель и процент трасс, которые осуществляет тест. Записывать покрытие для модели slvnvdemo_powerwindow_controller
:
Создайте объект опций по умолчанию, требуемый функцией sldvruntest
:
runOpts = sldvruntestopts;
Задайте, чтобы моделировать модель и покрытие записи:
runOpts.coverageEnabled = true;
Моделируйте образцовое и покрытие записи, на которое ссылаются:
[~, covDataFromLoggedSignals] = sldvruntest( ... 'slvnvdemo_powerwindow_controller', loggedSignalsPlant, runOpts);
Отобразите отчет покрытия HTML:
cvhtml('Coverage with Test Cases', covDataFromLoggedSignals);
Модель slvnvdemo_powerwindow_controller
достигла:
Decision Coverage: 40%
Покрытие условия: 35%
Покрытие MCDC: 10%
Для получения дополнительной информации о Decision Coverage, покрытие условия и покрытие MCDC, видят Типы Покрытия модели (Simulink Coverage).
Поскольку вы не достигли 100%-го покрытия для модели slvnvdemo_powerwindow_controller
, затем, вы будете анализировать модель, чтобы записать дополнительное покрытие и создать дополнительные тесты.
Можно использовать Simulink Design Verifier, чтобы анализировать модель slvnvdemo_powerwindow_controller
и собрать покрытие. Можно указать, что анализ игнорирует любые ранее удовлетворенные цели и записывает дополнительное покрытие.
Записывать дополнительное покрытие для модели:
Сохраните данные о покрытии, которые вы записали для регистрируемых сигналов в файле:
cvsave('existingCovFromLoggedSignal', covDataFromLoggedSignals);
Создайте объект опций по умолчанию для анализа:
opts = sldvoptions;
Укажите, что анализ генерирует тесты, чтобы записать решение, условие и измененное условие/Decision Coverage:
opts.ModelCoverageObjectives = 'MCDC';
Укажите, что анализ игнорирует цели, которые вы удовлетворили, когда вы регистрировали сигналы к блоку Model:
opts.IgnoreCovSatisfied = 'on';
Задайте имя файла, который содержит удовлетворенные данные о целях:
opts.CoverageDataFile = 'existingCovFromLoggedSignal.cvt';
Укажите, что анализ не отображает невыполнимые цели в Диагностическом Средстве просмотра:
opts.DisplayUnsatisfiableObjectives = 'off';
В данном примере особое внимание находится на удовлетворении как можно большего количества целей.
Укажите, что анализ создает длинные тесты, которые удовлетворяют несколько целей:
opts.TestSuiteOptimization = 'LongTestcases';
Создание меньшего числа тестов, каждый из которых удовлетворяет несколько целей тестирования, экономит время, когда вы выполняете сгенерированный код в следующем разделе.
Задайте, чтобы создать модель тестовой обвязки, которая ссылается на компонент с помощью блока Model:
opts.saveHarnessModel = 'on'; opts.ModelReferenceHarness = 'on';
Модель тестовой обвязки, в которой вы создали из регистрируемых сигналов, Готовится, Компонент для Верификации использует блок Model, который ссылается на модель slvnvdemo_powerwindow_controller
. Модель тестовой обвязки, которую создает анализ, должна также использовать блок Model, это ссылается на slvnvdemo_powerwindow_controller
. Можно добавить данные о тесте к первой модели тестовой обвязки, создав один тестовый набор.
Анализируйте модель с помощью Simulink Design Verifier:
[status, fileNames] = sldvrun('slvnvdemo_powerwindow_controller', ... opts, true);
Анализ создает и открывает модель тестовой обвязки slvnvdemo_powerwindow_controller_harness
. Блок Signal Builder содержит один длинный тест, который удовлетворяет 74 цели тестирования.
Можно объединить этот тест с тестом, в котором вы создали, Готовят Компонент к Верификации, чтобы записать дополнительное покрытие для модели slvnvdemo_powerwindow_controller
.
Сохраните имя новой модели тестовой обвязки и откройте его:
[~, newHarnessModel] = fileparts(fileNames.HarnessModel); open_system(newHarnessModel);
Затем, вы объедините эти две модели тестовой обвязки, чтобы создать один тестовый набор.
Вы создали две модели тестовой обвязки когда вы:
Регистрируемый сигналы к блоку модели управления, что ссылки модель slvnvdemo_powerwindow_controller
.
Анализируемый модель slvnvdemo_powerwindow_controller
.
Если вы комбинируете тесты в обеих моделях тестовой обвязки, можно записать покрытие, которое получает вас ближе к достижению 100%-го покрытия:
Объедините модели тестовой обвязки путем добавления новых тестов к тестам для регистрируемых сигналов:
sldvmergeharness(harnessModel, newHarnessModel);
Блок Signal Builder в модели slvnvdemo_powerwindow_controller_harness
теперь содержит оба теста.
Регистрируйте сигналы к модели тестовой обвязки:
loggedSignalsMergedHarness = sldvlogsignals(harnessModel);
Используйте объединенные тесты, чтобы записать покрытие для модели slvnvdemo_powerwindow_controller_harness
. Во-первых, сконфигурируйте объект опций для sldvruntest
:
runOpts = sldvruntestopts; runOpts.coverageEnabled = true;
Моделируйте модель и запишите и отобразите данные о покрытии:
[~, covDataFromMergedSignals] = sldvruntest( ... 'slvnvdemo_powerwindow_controller', loggedSignalsMergedHarness, ... runOpts); cvhtml('Coverage with Merged Test Cases', covDataFromMergedSignals);
Модель slvnvdemo_powerwindow_controller
теперь достигает:
Decision Coverage: 100%
Покрытие условия: 80%
Покрытие MCDC: 60%
Чтобы проверить, что сгенерированный код для модели приводит к тем же результатам как симуляция модели, используйте методы API Верификации генерации кода (CGV).
Чтобы выполнить модель в различных режимах выполнения, используйте API CGV, чтобы проверить числовую эквивалентность результатов. Для получения дополнительной информации о API CGV, смотрите Программируемую Верификацию Генерации кода (Embedded Coder).
Когда вы выполняете эту процедуру, симуляция компилирует и выполняет типовой код с помощью обоих тестов.
Создайте объект опций по умолчанию для sldvruncgvtest
:
runcgvopts = sldvruntestopts('cgv');
Задайте, чтобы выполнить модель в режиме симуляции:
runcgvopts.cgvConn = 'sim';
Выполните модель slvnv_powerwindow_controller
с помощью этих двух тестов и объекта runcgvopts
:
cgvSim = sldvruncgvtest('slvnvdemo_powerwindow_controller', ... loggedSignalsMergedHarness, runcgvopts);
Эти шаги сохраняют результаты в переменной cgvSim
рабочей области.
Затем, вы выполните ту же модель с теми же тестами в программном обеспечении в режиме Loop (SIL) и сравните результаты обеих симуляций.
Для получения дополнительной информации о Нормальном режиме симуляции, смотрите, Выполняют Модель (Embedded Coder).
Когда вы выполняете модель в программном обеспечении в режиме Loop (SIL), симуляция компилирует и выполняет сгенерированный код на вашем хосте - компьютере.
В этом разделе вы выполняете модель slvnvdemo_powerwindow_controller
в режиме SIL и сравниваете результаты с предыдущим разделом, когда вы выполнили модель в режиме симуляции.
Задайте, чтобы выполнить модель в режиме SIL:
runcgvopts.cgvConn = 'sil';
Выполните модель slvnv_powerwindow_controller
с помощью этих двух тестов и объекта runcgvopts
:
cgvSil = sldvruncgvtest('slvnvdemo_powerwindow_controller', ... loggedSignalsMergedHarness, runcgvopts);
Переменная cgvSil
рабочей области содержит результаты выполнения режима SIL.
Сравните результаты в cgvSil
к результатам в cgvSim
, созданном из выполнения режима симуляции. Используйте метод
, чтобы сравнить результаты этих двух симуляций:compare
for i=1:length(loggedSignalsMergedHarness.TestCases) simout = cgvSim.getOutputData(i); silout = cgvSil.getOutputData(i); [matchNames, ~, mismatchNames, ~ ] = ... cgv.CGV.compare(simout, silout); end
Отобразите результаты сравнения в Командном окне MATLAB®:
fprintf(['\nTest Case(%d):%d Signals match, %d Signals mismatch\r'],... i, length(matchNames), length(mismatchNames));
Как ожидалось, результаты этих двух соответствий симуляций.
Для получения дополнительной информации о программном обеспечении в цикле (SIL) симуляции, смотрите то, Что SIL и PIL симуляции? (Embedded Coder).