В этом примере показано, как команды утилиты покрытия могут использоваться для извлечения информации для отдельной подсистемы, блока или объекта Stateflow ® из объектов cvdata.
Этот пример иллюстрирует доступ в командной строке к данным о покрытии для небольшой модели, которая содержит аспекты различных поддерживаемых метрик покрытия.
Используйте следующие команды, чтобы открыть модель 'slvnvdemo _ cv _ small _ контроллер' и ее подсистему 'Gain'.
open_system('slvnvdemo_cv_small_controller'); open_system('slvnvdemo_cv_small_controller/Gain');
Симулируйте модель с помощью 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]
Используйте 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 = []