Этот пример показывает, как сервисные команды покрытия могут использоваться, чтобы извлечь информацию для отдельной подсистемы, блока или объекта Stateflow® от объектов cvdata.
Этот пример иллюстрирует доступ к командной строке данных о покрытии для маленькой модели, которая содержит аспекты различных поддерживаемых метрик покрытия. Модель содержит некоторые блоки с точками покрытия на корневом уровне и другими на уровне подсистемы.
Используйте следующие команды, чтобы открыть модель 'slvnvdemo_cv_small_controller' и ее подсистема 'Усиление'.
open_system('slvnvdemo_cv_small_controller'); open_system('slvnvdemo_cv_small_controller/Gain');
Моделируйте модель с командой cvsim
. Эта команда собирает данные о покрытии как побочный эффект и возвращает эту информацию в объекте cvdata. Объект cvdata является объектом MATLAB®, который ссылается на внутренние данные, хранимые в инструменте покрытия и структурах данных модели, которые производят те данные.
testObj = cvtest('slvnvdemo_cv_small_controller');
testObj.settings.decision = 1;
testObj.settings.condition = 1;
testObj.settings.mcdc = 1;
testObj.settings.tableExec = 1;
testObj.settings.sigrange = 1;
data = cvsim(testObj)
data = ... cvdata id: 1621 type: TEST_DATA test: cvtest object rootID: 1623 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 01-Jul-2018 00:20:16 stopTime: 01-Jul-2018 00:20:16 intervalStartTime: 0 intervalStopTime: 0 simulationStartTime: 0 simulationStopTime: 10 metrics: [1x1 struct] filter: simMode: Normal
Обработайте данные о покрытии, возвращенные в команду cvsim
с командой генерации отчета cvhtml
. Получившийся отчет является удобным представлением покрытия модели для целой модели.
cvhtml('tempfile.html',data);
Используйте команду decisioninfo
, чтобы извлечь информацию о Decision Coverage для отдельных блоков Simulink или объектов Stateflow.
Следующая команда извлекает массив покрытия для целой модели. Первый элемент является количеством точек покрытия, удовлетворенных для модели; второй элемент является общим количеством точек покрытия для модели.
cov = decisioninfo(data,'slvnvdemo_cv_small_controller')
percent = 100*cov(1)/cov(2)
cov = 4 6 percent = 66.6667
Получите информацию о покрытии для блока 'Saturation' с помощью полного пути для того блока. Обеспечьте второй возвращаемый аргумент для текстовых описаний точек покрытия в том блоке.
[blkCov, description] = decisioninfo(data,'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: [1×2 struct] decision1 = 'U > LL' out_1a = 'false' count_1a = 0 out_1b = 'true' count_1b = 6
Количественная информация о покрытии доступна для каждой точки в иерархии, которая содержит или имеет точки покрытия. Текстовые описания сгенерированы только для объектов, которые имеют сами точки покрытия. Например, вызовите decisioninfo
для виртуального Усиления подсистемы, и возвращаемое значение описания пусто.
[blkCov, description] = decisioninfo(data,'slvnvdemo_cv_small_controller/Gain')
blkCov = 1 2 description = struct with fields: isFiltered: 0 justifiedCoverage: 0 isJustified: 0 filterRationale: ''
В некоторых случаях объект имеет внутренние точки покрытия, но также и содержит потомков с дополнительными точками покрытия. Информация о покрытии обычно включает всех потомков, если третий аргумент для игнорирования потомков не установлен в 1.
subsysOnlycov = decisioninfo(data,'slvnvdemo_cv_small_controller/Gain',1)
subsysOnlycov = []
Команда decisioninfo
также работает с указателями блока, идентификаторами Stateflow и объектами API Stateflow.
blkHandle = get_param('slvnvdemo_cv_small_controller/Saturation','Handle') blkCov = decisioninfo(data,blkHandle)
blkHandle = 34.0012 blkCov = 3 4
Если объект не имеет никакого Decision Coverage, команда возвращает пустые выходные параметры.
missingBlkCov = decisioninfo(data,'slvnvdemo_cv_small_controller/Sine1')
missingBlkCov = []
Покрытие условия указывает, были ли логические входные параметры к Булевым выражениям оценены к обеим истине и лжи. В Simulink условия являются входными параметрами к логическим операциям.
Команда conditioninfo
для извлечения информации о покрытии условия очень похожа на команду decisioninfo
. Это обычно возвращает информацию об объекте и всех его потомках, но может взять третий аргумент, который указывает, должны ли потомки быть проигнорированы. Это может также возвратить второй выходной параметр, содержащий описания каждого условия.
cov = conditioninfo(data,'slvnvdemo_cv_small_controller/Gain/Logic') [cov, desc] = conditioninfo(data,'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: [1×1 struct] falseOutcomeFilter: [1×1 struct] ans = struct with fields: isFiltered: 0 isJustified: 0 filterRationale: '' text: 'port2' trueCnts: 0 falseCnts: 59 trueOutcomeFilter: [1×1 struct] falseOutcomeFilter: [1×1 struct]
Измененное Условие/Decision Coverage (MCDC) удовлетворено для условия в Булевом выражении, если существует две оценки выражения, представляя пару независимости, которые иллюстрируют, что значение условия независимо влияет на результат целого выражения. То есть для этих оценок, переключая значение условия заставил бы результат выражения переключаться также.
В этом примере логический блок AND анализируется для MCDC, и эта информация может быть извлечена с помощью команды mcdcinfo
. Эта команда использует тот же синтаксис в качестве команд decisioninfo
и conditioninfo
.
[cov, desc] = mcdcinfo(data,'slvnvdemo_cv_small_controller/Gain/Logic')
desc.condition(1)
desc.condition(2)
cov = 0 2 desc = struct with fields: text: 'Output' condition: [1×2 struct] isFiltered: 0 filterRationale: '' justifiedCoverage: 0 ans = struct with fields: text: 'port1' achieved: 0 trueRslt: '(TT)' falseRslt: '(FT)' isFiltered: 0 filterRationale: '' ans = struct with fields: text: 'port2' achieved: 0 trueRslt: '(TT)' falseRslt: 'TF' isFiltered: 0 filterRationale: ''
Покрытие интерполяционных таблиц записывает частоту, что поиск происходит для каждого интервала интерполяции. Допустимые интервалы в целях покрытия также включают значения меньше, чем самая маленькая точка останова и значения, больше, чем самая большая точка останова. Для непротиворечивости с другими командами эта информация возвращена как пара количеств с количеством интервалов, которые выполнились и общее количество интервалов.
Второй выходной аргумент заставляет tableinfo
возвращать счета выполнения для всех интервалов интерполяции. Если таблица имеет выходные значения M на n, количества выполнения возвращены в M+1-by-N+1 матрица.
Третий выходной аргумент заставляет tableinfo
возвращать количества, где вход был точно равен точке останова. Это возвращено в массиве ячеек векторов, один для каждой размерности в таблице.
[cov,execCnts,brkEq] = tableinfo(data, '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 = 1×2 cell array {10×1 double} {10×1 double}
Метрика диапазона сигнала записывает наименьшее и самое большое значение блока Simulink объекты данных Stateflow и выходные параметры. Команда sigrangeinfo
возвращает два возвращаемых аргумента для минимальных и максимальных значений, соответственно.
Команда sigrangeinfo
работает только на листовые блоки, которые выполняют вычисление; в противном случае команда возвращает пустые аргументы.
[sigMin, sigMax] = sigrangeinfo(data,'slvnvdemo_cv_small_controller/Gain/Gain Table') % Leaf [sigMin, sigMax] = sigrangeinfo(data,'slvnvdemo_cv_small_controller/Gain') % Nonleaf
sigMin = 3.3656 sigMax = 7.6120 sigMin = [] sigMax = []
Конец путем закрытия модели.
close_system('slvnvdemo_cv_small_controller',0);