Извлечение подробной информации из данных о покрытии

В этом примере показано, как команды утилиты покрытия могут использоваться для извлечения информации для отдельной подсистемы, блока или объекта Stateflow ® из объектов cvdata.

Пример модели

Этот пример иллюстрирует доступ в командной строке к данным о покрытии для небольшой модели, которая содержит аспекты различных поддерживаемых метрик покрытия.

Используйте следующие команды, чтобы открыть модель 'slvnvdemo _ cv _ small _ контроллер' и ее подсистему 'Gain'.

open_system('slvnvdemo_cv_small_controller');
open_system('slvnvdemo_cv_small_controller/Gain');

Сгенерируйте данные покрытия и HTML

Симулируйте модель с помощью sim. Использование Simulink.SimulationInput объект для захвата настроек покрытия и использования его в качестве входов для sim. После симуляции данные о покрытии будут храниться в cvdata объект.

simIn = Simulink.SimulationInput('slvnvdemo_cv_small_controller');
simIn = simIn.setModelParameter('CovEnable','on');
simIn = simIn.setModelParameter('CovMetricStructuralLevel','MCDC');
simIn = simIn.setModelParameter('CovSaveSingleToWorkspaceVar','on');
simIn = simIn.setModelParameter('CovSaveName','covData');
simIn = simIn.setModelParameter('CovScope','EntireSystem');
simIn = simIn.setModelParameter('CovMetricLookupTable','on');
simIn = simIn.setModelParameter('CovMetricSignalRange','on');
simOut = sim(simIn);

Обработка данных покрытия, возвращенных из cvsim команда с помощью команды генерации отчетов cvhtml. Полученный отчет является удобным представлением покрытия модели для всей модели.

cvhtml('tempfile.html',covData);

Данные о покрытии также доступны в выходном объекте симуляции.

simOut
simOut = 

  Simulink.SimulationOutput:
                covData: [1x1 cvdata] 
                   tout: [59x1 double] 
                   yout: [59x1 double] 

     SimulationMetadata: [1x1 Simulink.SimulationMetadata] 
           ErrorMessage: [0x0 char] 

Извлечение информации о Decision Coverage

Используйте decisioninfo команда для извлечения информации о Decision Coverage для отдельных блоков Simulink или объектов Stateflow.

Следующая команда извлекает массив покрытия для всей модели. Первым элементом является количество целевых результатов покрытия, удовлетворенных для модели; вторым элементом является общее количество целевых результатов покрытия для модели.

cov = decisioninfo(covData,'slvnvdemo_cv_small_controller')
percent = 100*cov(1)/cov(2)
cov =

     4     6


percent =

   66.6667

Получите информацию о покрытии для блока 'Saturation', используя полный путь к этому блоку. Предоставьте второй возвращаемый аргумент для текстовых описаний результатов цели покрытия в этом блоке.

[blkCov, description] = decisioninfo(covData,'slvnvdemo_cv_small_controller/Saturation')

decision1 = description.decision(1).text
out_1a = description.decision(1).outcome(1).text
count_1a = description.decision(1).outcome(1).executionCount
out_1b = description.decision(1).outcome(2).text
count_1b = description.decision(1).outcome(2).executionCount
blkCov =

     3     4


description = 

  struct with fields:

           isFiltered: 0
    justifiedCoverage: 0
          isJustified: 0
      filterRationale: ''
             decision: [1x2 struct]


decision1 =

    'U > LL'


out_1a =

    'false'


count_1a =

     0


out_1b =

    'true'


count_1b =

     6

Количественная информация о покрытии доступна для каждого результата в иерархии, который содержит или имеет целевые результаты покрытия. Текстовые описания генерируются только для объектов, которые сами имеют результаты цели покрытия. Для примера активируйте decisioninfo для виртуальной подсистемы Gain, и описание возврата значения пустое.

[blkCov, description] = decisioninfo(covData,'slvnvdemo_cv_small_controller/Gain')
blkCov =

     1     2


description = 

  struct with fields:

           isFiltered: 0
    justifiedCoverage: 0
          isJustified: 0
      filterRationale: ''

В некоторых случаях объект имеет внутренние цели покрытия, но также содержит потомков с дополнительными целями покрытия. Информация о покрытии обычно включает всех потомков, если третий аргумент для игнорирования потомков не установлен в 1.

subsysOnlycov = decisioninfo(covData,'slvnvdemo_cv_small_controller/Gain',1)
subsysOnlycov =

     []

The decisioninfo команда также работает с указателями на блоки, идентификаторами Stateflow и объектами Stateflow API.

blkHandle = get_param('slvnvdemo_cv_small_controller/Saturation','Handle')
blkCov = decisioninfo(covData,blkHandle)
blkHandle =

   31.0009


blkCov =

     3     4

Если объект не имеет Decision Coverage, команда возвращает пустые выходы.

missingBlkCov = decisioninfo(covData,'slvnvdemo_cv_small_controller/Sine1')
missingBlkCov =

     []

Извлечение информации о покрытии условия

Покрытие условия указывает, были ли логические входы в логические выражения оценены как true, так и false. В Simulink условия являются входами к логическим операциям.

The conditioninfo команда для извлечения информации о покрытии условия очень похожа на decisioninfo команда. Он обычно возвращает информацию об объекте и всех его потомках, но может взять третий аргумент, который указывает, следует ли игнорировать потомков. Это может также вернуть второй выход, содержащий описание каждого условия.

cov = conditioninfo(covData,'slvnvdemo_cv_small_controller/Gain/Logic')
[cov, desc] = conditioninfo(covData,'slvnvdemo_cv_small_controller/Gain/Logic');
desc.condition(1)
desc.condition(2)
cov =

     2     4


ans = 

  struct with fields:

            isFiltered: 0
           isJustified: 0
       filterRationale: ''
                  text: 'port1'
              trueCnts: 59
             falseCnts: 0
     trueOutcomeFilter: [1x1 struct]
    falseOutcomeFilter: [1x1 struct]
        trueExecutedIn: []
       falseExecutedIn: []


ans = 

  struct with fields:

            isFiltered: 0
           isJustified: 0
       filterRationale: ''
                  text: 'port2'
              trueCnts: 0
             falseCnts: 59
     trueOutcomeFilter: [1x1 struct]
    falseOutcomeFilter: [1x1 struct]
        trueExecutedIn: []
       falseExecutedIn: []

Извлечение измененной информации о состоянии/покрытии принятия решений

Измененное условие/покрытие принятия решений (MCDC) удовлетворяется для условия в логическом выражении, если существует две оценки выражения, представляющие пару независимости, которые иллюстрируют, что значение условия независимо влияет на результат всего выражения. То есть для этих вычислений переключение значения условия также приведет к переключению результата выражения.

В этом примере логический блок AND анализируется для MCDC, и эта информация может быть извлечена с помощью mcdcinfo команда. Эта команда использует тот же синтаксис, что и conditioninfo и decisioninfo команды.

[cov, desc] = mcdcinfo(covData,'slvnvdemo_cv_small_controller/Gain/Logic')
desc.condition(1)
desc.condition(2)
cov =

     0     2


desc = 

  struct with fields:

                 text: 'Output'
            condition: [1x2 struct]
           isFiltered: 0
      filterRationale: ''
    justifiedCoverage: 0


ans = 

  struct with fields:

               text: 'port1'
           achieved: 0
           trueRslt: '(TT)'
          falseRslt: '(FT)'
         isFiltered: 0
        isJustified: 0
    filterRationale: ''
     trueExecutedIn: []
    falseExecutedIn: []


ans = 

  struct with fields:

               text: 'port2'
           achieved: 0
           trueRslt: '(TT)'
          falseRslt: 'TF'
         isFiltered: 0
        isJustified: 0
    filterRationale: ''
     trueExecutedIn: []
    falseExecutedIn: []

Извлечение информации о покрытии интерполяционных таблиц

Покрытие интерполяционных таблиц фиксирует частоту, которая происходит для каждого интервала интерполяции. Допустимые интервалы для целей покрытия также включают значения, меньшие, чем наименьшая точка останова, и значения, большие, чем самая большая точка останова. Для согласования с другими командами эта информация возвращается как пара отсчётов с количеством выполненных интервалов и общим количеством интервалов.

Второй выходной аргумент вызывает tableinfo для возврата счетчиков выполнения для всех интервалов интерполяции. Если таблица имеет выходные значения M-на-N, счетчики выполнения возвращаются в матрице M + 1 на N + 1.

Третий выходной аргумент вызывает tableinfo для возврата счетчиков, где вход был точно равен точке останова. Это возвращается в массив ячеек из векторов, по одному для каждой размерности в таблице.

[cov,execCnts,brkEq] = tableinfo(covData, 'slvnvdemo_cv_small_controller/Gain/Gain Table')
cov =

    23   121


execCnts =

     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     2    12    14    10     2     0     0     0
     0     0     4    12     0     0     0    12     0     0     0
     0     0    22     0     0     0     0     0    12     0     0
     0     0    21     0     0     0     0     0    59     0     0
     0     0    21     0     0     0     0     0    29     0     0
     0     0     7    28     0     0     0    28     6     0     0
     0     0     0     4    22    18    23     5     0     0     0
     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0


brkEq =

  1x2 cell array

    {10x1 double}    {10x1 double}

Извлечение информации о диапазоне сигнала

Метрика диапазона сигнала записывает наименьшее и самое большое значение выходов блоков Simulink и объектов данных Stateflow. The sigrangeinfo команда возвращает два возвращаемых аргументов для минимального и максимального значений, соответственно.

The sigrangeinfo команда работает только для листовых блоков, выполняющих расчеты; в противном случае команда возвращает пустые аргументы.

[sigMin, sigMax] = sigrangeinfo(covData,'slvnvdemo_cv_small_controller/Gain/Gain Table')  % Leaf
[sigMin, sigMax] = sigrangeinfo(covData,'slvnvdemo_cv_small_controller/Gain')             % Nonleaf
sigMin =

    3.3656


sigMax =

    7.6120


sigMin =

     []


sigMax =

     []