В этом примере показано, как программно фильтровать объекты и результаты из результатов покрытия.
Во-первых, загрузите модель в память.
modelName = 'slvnvdemo_covfilt';
load_system(modelName);
Настройте параметры покрытия для модели с помощью Simulink.SimulationInput
объект.
simIn = Simulink.SimulationInput(modelName); simIn = simIn.setModelParameter('CovEnable','on'); simIn = simIn.setModelParameter('CovMetricStructuralLevel','MCDC'); simIn = simIn.setModelParameter('StopTime','20'); simIn = simIn.setModelParameter('CovSaveSingleToWorkspaceVar','on'); simIn = simIn.setModelParameter('CovSaveName','covData');
Список параметров покрытия см. в разделе Настройки покрытия.
Симулируйте модель с помощью SimulationInput
объект как вход.
simOut = sim(simIn);
Просмотрите результаты покрытия перед применением фильтра. Вы можете получить доступ к результатам Decision Coverage с помощью decisioninfo
.
saturationInitial = decisioninfo(covData,'slvnvdemo_covfilt/Saturation');
percentSaturationCov = 100 * saturationInitial(1)/saturationInitial(2)
percentSaturationCov = 50
Блок Насыщение имеет 50% Decision Coverage. Если вы не намерены, чтобы этот блок был удовлетворен, можно отфильтровать отсутствующий объективный результат, чтобы он больше не считался недостающим покрытием. Во-первых, вам нужен селектор для неудовлетворенного объективного результата, который вы хотите фильтровать.
Можно непосредственно создать селектор с помощью соответствующего конструктора. В этом случае вы бы использовали slcoverage.MetricSelector
.
Поскольку обоснованная цель является результатом решения, первый вход в конструктор селектора метрики slcoverage.MetricSelectorType.DecisionOutcome
. Второй вход является указателем на блок. Последние два являются индексом цели, которая должна быть обоснована, и индексом результатов этой цели, соответственно. Потому что input > lower limit
цель решения является первой целью для блока Насыщения, его целевой индекс 1
. Потому что false
результатом этой цели является первый результат, его индекс результатов также 1
.
metricSel = slcoverage.MetricSelector(slcoverage.MetricSelectorType.DecisionOutcome,... 'slvnvdemo_covfilt/Saturation',1,1)
metricSel = MetricSelector with properties: ObjectiveIndex: 1 OutcomeIndex: 1 Description: 'N/A' Type: DecisionOutcome Id: 'slvnvdemo_covfilt:5' ConstructorCode: 'slcoverage.MetricSelector(slcoverage.MetricSelectorType.DecisionOutcome, 'slvnvdemo_covfilt:5', 1, 1)'
Можно также использовать slcoverage.Selector.allSelectors
для просмотра доступных селекторов для блока Насыщение.
saturationAllSels = slcoverage.Selector.allSelectors('slvnvdemo_covfilt/Saturation')
saturationAllSels = 1x6 heterogeneous Selector (BlockSelector, MetricSelector) array with properties: Description Type Id ConstructorCode
Вы также можете увидеть индексы целей и результатов с помощью allSelectors
способ. Используйте Description
Пара "имя-значение" для поиска F
.
falseSelectors = slcoverage.Selector.allSelectors('slvnvdemo_covfilt/Saturation',... 'Description','F')
falseSelectors = 1x2 MetricSelector array with properties: ObjectiveIndex OutcomeIndex Description Type Id ConstructorCode
В блоке Saturation два селектора ложных случаев. Первый селектор F outcome of input > lower limit
.
falseSel = falseSelectors(1)
falseSel = MetricSelector with properties: ObjectiveIndex: 1 OutcomeIndex: 1 Description: 'F outcome of input > lower limit in Saturate block "Saturation"' Type: DecisionOutcome Id: 'slvnvdemo_covfilt:5' ConstructorCode: 'slcoverage.MetricSelector(slcoverage.MetricSelectorType.DecisionOutcome, 'slvnvdemo_covfilt:5', 1, 1)'
The falseSel
селектор тот же, который мы создали вручную используя slcoverage.MetricSelector
. Индексы цели и результата являются свойствами результирующего объекта селектора.
Создайте объект фильтра при помощи slcoverage.Filter
. Вы можете задать имя файла фильтра и описание фильтра с помощью методов setFilterName
и setFilterDescription
, соответственно.
filt = slcoverage.Filter; setFilterName(filt,'slcoverage_filter'); setFilterDescription(filt,'Example Filter');
Создайте правило фильтра при помощи slcoverage.FilterRule
. Первый вход в FilterRule
- селектор для блока или результата, который вы хотите фильтровать. Это может быть селектор, который вы создаете, или один, который вы извлекаете из allSelectors
.
Второй вход является обоснованием фильтрации результата или блока. Это задается как символьный массив.
Третий вход - это режим фильтра, который вы хотите использовать. Два режима фильтра покрытия обоснованы и исключены. Используйте режим обоснования для фильтрации отдельных результатов цели покрытия, таких как F outcome of input > lower limit
. Используйте режим исключения для фильтрации целых элементов модели или блоков, что означает, что блок и его потомки, если применимо, игнорируются. В этом примере используйте режим выравнивания, чтобы указать, что вы хотите фильтровать определенный результат.
rule = slcoverage.FilterRule(metricSel,'rate > 0',slcoverage.FilterMode.Justify);
Добавить правило к фильтру можно используя addRule
.
filt.addRule(rule);
Сохраните фильтр в файл фильтра с помощью save
способ. Затем примените файл фильтра к cvdata
объект путем назначения filter
свойство новому файлу фильтра.
filt.save('covfilter'); covData.filter = 'covfilter';
Повторно сгенерируйте результаты покрытия для блока Насыщения, используя отфильтрованную cvdata
объект.
filteredSaturation = decisioninfo(covData,'slvnvdemo_covfilt/Saturation');
percentSaturationFilt = 100 * filteredSaturation(1)/filteredSaturation(2)
percentSaturationFilt = 75
Decision Coverage для блока Насыщения теперь составляет 75%.
Можно применить тот же рабочий процесс для обоснования определенного действия Stateflow. В этом примере мы хотим обосновать tick
Цель MCDC, которая является частью after(4, tick)
переход.
Сначала получите корневой объект Stateflow при помощи sfroot
(Stateflow).
chartID = sfroot;
Получите 'after(4, tick)'
идентификатор перехода при помощи find
(Stateflow) метод. Можно использовать find
поиск переходов при помощи '-isa'
флаг с 'Stateflow.Transition'
. Можно далее задать точный переход при помощи поиска строки метки с помощью дополнительных входов.
transID = chartID.find('-isa','Stateflow.Transition','LabelString','after(4, tick)');
Получите идентификатор Simulink графика при помощи Simulink.ID.getSID
.
transSID = Simulink.ID.getSID(transID);
Получите селектор для целевого результата MCDC, который мы хотим фильтровать при помощи allSelectors
. Передайте Simulink ID перехода Stateflow как первый вход. Потому что мы хотим оправдать tick
результат, поиск "tick"
в описании.
sfSelectors = slcoverage.Selector.allSelectors(transSID,'Description','"tick"')
sfSelectors = 1x3 MetricSelector array with properties: ObjectiveIndex OutcomeIndex Description Type Id ConstructorCode
allSelectors
возвращает три возможных селектора. Переход, который мы хотим фильтровать, это третий возвращенный селектор.
sfSel = sfSelectors(3)
sfSel = MetricSelector with properties: ObjectiveIndex: 1 OutcomeIndex: 1 Description: 'Condition 1, "tick" outcome of Transition trigger expression in Transition "after(4, tick)" from "Clipped" to "Full"' Type: MCDCOutcome Id: 'slvnvdemo_covfilt:6:5' ConstructorCode: 'slcoverage.MetricSelector(slcoverage.MetricSelectorType.MCDCOutcome, 'slvnvdemo_covfilt:6:5', 1, 1)'
Создайте правило, добавьте его к фильтру и сохраните его. Файл фильтра уже применяется к cvdata
объект.
rule2 = slcoverage.FilterRule(sfSel,'tick never false'); filt.addRule(rule2); filt.save('covfilter');
Для получения дополнительной информации о программном API stateflow, смотрите Обзор API Stateflow (Stateflow).
Можно фильтровать блок, используя slcoverage.BlockSelector
. В этом случае мы хотим исключить подсистему Switchable config, поэтому используем SubsystemAllContent
тип селектора и slcoverage.FilterMode.Exclude
режим фильтрации.
subsysSel = slcoverage.BlockSelector(... slcoverage.BlockSelectorType.SubsystemAllContent,... 'slvnvdemo_covfilt/Switchable config');
Создайте правило фильтра, передав в качестве входов селектор, обоснование и режим исключить фильтр.
rule3 = slcoverage.FilterRule(subsysSel,... 'Unused configuration',... slcoverage.FilterMode.Exclude);
Добавьте правило к фильтру и сохраните его.
filt.addRule(rule3);
filt.save('covfilter');
Наконец, вы можете просмотреть отчет о покрытии при помощи cvhtml
. В разделе Объекты, отфильтрованные из анализа покрытия, показаны сводные данные отфильтрованных объектов модели и обоснований. The 'sRT=0'
флаг может использоваться для генерации отчета о покрытии, но не открывать отчет автоматически.
cvhtml('filteredCovReport',covData,'-sRT=0');
allSelectors
| Свойства cvdata | cvhtml
| decisioninfo
| slcoverage.BlockSelector
| slcoverage.FilterRule
| slcoverage.MetricSelector
| slcoverage.Selector