В этом примере показано, как загрузить, проанализировать и запросить данные о покрытии с помощью скрипта.
Загрузка данных о покрытии
Загрузите модель, а затем восстановите сохраненные данные о покрытии из файла covdata.cvt использование cvload. Данные и настройки тестирования извлекаются из массива ячеек. Настройки тестирования хранятся в cvtest объект, который содержит параметры из симуляции, создавшего данные о покрытии.
load_system('slvnvdemo_ratelim_harness'); [savedSettings,savedData] = cvload('covdata'); savedData = savedData{1};
Извлечение информации из объектов данных покрытия
Извлеките информацию о покрытии из пути блока или указателя на блок при помощи decisioninfo. Выходы являются вектором с достигнутыми и полными результатами для одного объекта модели.
subsysCov = decisioninfo(savedData,... 'slvnvdemo_ratelim_harness/Adjustable Rate Limiter')
subsysCov =
5 6
Определите процентное покрытие, достигнутое при помощи decisioninfo.
percentCov = 100 * (subsysCov(1)/subsysCov(2))
percentCov = 83.3333
Укажите, что вы хотите извлечь данные о Decision Coverage для блока switch под названием Apply Limited Gain при помощи decisioninfo. Это возвращает структуру, которая содержит решения и результаты.
[blockCov,desc] = decisioninfo(savedData, ... 'slvnvdemo_ratelim_harness/Adjustable Rate Limiter/Apply limited gain'); descDecision = desc.decision; outcome1 = desc.decision.outcome(1) outcome2 = desc.decision.outcome(2)
outcome1 =
struct with fields:
text: 'false (out = in3)'
executionCount: 0
executedIn: []
isFiltered: 0
isJustified: 0
filterRationale: ''
outcome2 =
struct with fields:
text: 'true (out = in1)'
executionCount: 101
executedIn: []
isFiltered: 0
isJustified: 0
filterRationale: ''
Из decisioninfo выход, можно увидеть, что блок switch с именем Apply Limited Gain никогда не был ложным, потому что ложный случай executionCount поле имеет значение 0. Если это поведение ожидается, и вы не собирались выполнять это дело с помощью тестов, можно добавить правило фильтра, чтобы обосновать это недостающее покрытие с помощью slcoverage.Filter класс.
Во-первых, запросите образец блока, который будет фильтроваться, потому что нам нужно только фильтровать один образец блока, который получил неполное покрытие, а не все образцы этого типа блока. Затем используйте slcoverage.BlockSelector класс со BlockInstance для назначения одного образца блока для фильтрации.
id = getSimulinkBlockHandle('slvnvdemo_ratelim_harness/Adjustable Rate Limiter/Apply limited gain');
sel = slcoverage.BlockSelector(slcoverage.BlockSelectorType.BlockInstance,id);
Создайте объект фильтра и правило фильтра с помощью slcoverage.Filter и slcoverage.FilterRule классы.
filt = slcoverage.Filter;
rule = slcoverage.FilterRule(sel,'Edge case',slcoverage.FilterMode.Justify);
Добавьте правило к фильтру с помощью addRule способ. Затем сохраните новый файл фильтра с save способ.
filt.addRule(rule);
filt.save('blfilter');
Создайте новую cvdata объект от исходного объекта и применить к нему файл фильтра. Использование decisioninfo на отфильтрованных данных о покрытии, чтобы увидеть, что теперь существует 100% Decision Coverage, потому что обоснованные цели считаются удовлетворенными.
FilteredData = savedData; FilteredData.filter = 'blfilter'; newCov = decisioninfo(FilteredData,... 'slvnvdemo_ratelim_harness/Adjustable Rate Limiter') percentNewCov = 100 * (newCov(1)/newCov(2))
newCov =
6 6
percentNewCov =
100
После сбора данных о покрытии можно извлечь конкретную информацию о покрытии из cvdata объект при помощи следующих функций. Используйте эти функции для извлечения указанной информации о покрытии для блока, подсистемы или Stateflow® диаграмма в вашей модели или для самой модели.
Вы можете включить подсветку покрытия на модели Simulink при помощи cvmodelview. Вы также можете просмотреть отчет о покрытии с помощью cvhtml.
complexityinfo - Цикломатический охват сложностью
executioninfo - Покрытие выполнения
conditioninfo - Покрытие условия
decisioninfo - Decision Coverage
mcdcinfo - Охват решением об измененных условиях (MCDC)
overflowsaturationinfo - Насыщение по целочисленному переполнению покрытия
relationalboundaryinfo - Реляционный краевой охват
sigrangeinfo - Охват диапазона сигнала
sigsizeinfo - Охват по размеру сигнала
tableinfo - Покрытие блока интерполяционной таблицы
getCoverageinfo - Покрытие для Simulink® Design Verifier™ блоков
Пример, использующий эти функции, см. в разделе Извлечение подробной информации из данных покрытия.
slcoverage.BlockSelector | slcoverage.Filter | slcoverage.FilterRule | slcoverage.MetricSelector