В этом примере показано, как загрузить, проанализировать и запросить данные о покрытии с помощью скрипта.
Загрузка данных о покрытии
Загрузите модель, а затем восстановите сохраненные данные о покрытии из файла 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