В этом примере показано, как сервисные команды покрытия могут использоваться, чтобы извлечь информацию для отдельной подсистемы, блока или объекта 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
команда. Эта команда использует тот же синтаксис в качестве conditioninfo
и decisioninfo
команды.
[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);