Фильтрация результатов покрытия с помощью скрипта

В этом примере показано, как программно фильтровать объекты и результаты из результатов покрытия.

Откройте модель и включите анализ покрытия

Во-первых, загрузите модель в память.

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

Просмотрите результаты покрытия перед применением фильтра. Вы можете получить доступ к результатам 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%.

Обоснование цели MCDC в графике Stateflow ®

Можно применить тот же рабочий процесс для обоснования определенного действия 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');

См. также

| | | | | | |

Похожие темы