Отфильтруйте результаты покрытия Используя скрипт

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

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

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

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

Блок Saturation имеет 50% Decision Coverage. Если вы не намереваетесь для этого блока быть удовлетворенными, можно отфильтровать недостающий объективный результат так, чтобы о нем больше не сообщали как недостающее покрытие. Во-первых, вам нужен селектор для неудовлетворенного объективного результата, который вы хотите отфильтровать.

Создайте селектор

Можно непосредственно создать селектор с помощью соответствующего конструктора. В этом случае вы использовали бы slcoverage.MetricSelector.

Поскольку выравниваемая по ширине цель является результатом решения, первым входом метрическому селекторному конструктору является slcoverage.MetricSelectorType.DecisionOutcome. Второй вход является указателем блока. Последние два являются индексом цели выровнять по ширине и индекс результата той цели, соответственно. Поскольку input > lower limit цель решения является первой целью для блока Saturation, его объективным индексом является 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 видеть доступные селекторы для блока Saturation.

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)'

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';

Регенерируйте результаты покрытия для блока Saturation с помощью отфильтрованного cvdata объект.

filteredSaturation = decisioninfo(covData,'slvnvdemo_covfilt/Saturation');
percentSaturationFilt = 100 * filteredSaturation(1)/filteredSaturation(2)
percentSaturationFilt =

    75

Decision Coverage для блока Saturation - теперь 75%.

Выровняйте по ширине цель MCDC в графике Stateflow®

Можно применить тот же рабочий процесс, чтобы выровнять по ширине определенное действие Stateflow. В этом примере мы хотим выровнять по ширине tick Цель MCDC, которая является частью after(4, tick) переход.

Во-первых, получите корневой объект Stateflow при помощи sfroot (Stateflow).

chartID = sfroot;

Получите 'after(4, tick)' ID перехода при помощи find (Stateflow) метод. Можно использовать find искать переходы при помощи '-isa' отметьте с помощью 'Stateflow.Transition'. Можно далее задать точный переход при помощи поиска строки метки с помощью дополнительных входных параметров.

transID = chartID.find('-isa','Stateflow.Transition','LabelString','after(4, tick)');

Получите ID Simulink графика при помощи Simulink.ID.getSID.

transSID = Simulink.ID.getSID(transID);

Получите селектор для объективного результата MCDC, который мы хотим отфильтровать при помощи allSelectors. Передайте ID Simulink перехода 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');

Для получения дополнительной информации о stateflow программируемом API, см. Обзор API Stateflow (Stateflow).

Исключите блок Используя селектор блока

Можно отфильтровать блок с помощью slcoverage.BlockSelector. В этом случае мы хотим исключить Переключаемую подсистему 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. Раздел Objects Filtered from Coverage Analysis показывает сводные данные отфильтрованных объектов модели и объяснений. 'sRT=0' флаг может использоваться, чтобы сгенерировать отчет покрытия, но не открыть отчет автоматически.

cvhtml('filteredCovReport',covData,'-sRT=0');

Смотрите также

| | | | | | |

Похожие темы