В этом примере показано, как использовать перегруженные операторы +, * и -, чтобы объединить результаты покрытия в объединение, перекресток или задать различие результатов.
Откройте простую модель с двумя взаимоисключающими включенными подсистемами.
open_system('slvnvdemo_cv_mutual_exclusion')
Используйте команды cvtest
и cvsim
чтобы начать симуляцию. Первоначально значение блока Constant равно 0, что заставляет Подсистему 2 выполнять.
test1 = cvtest('slvnvdemo_cv_mutual_exclusion');
data1 = cvsim(test1)
data1 = ... cvdata version: (R2021a) id: 231 type: TEST_DATA test: cvtest object rootID: 233 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 27-Jan-2021 07:37:25 stopTime: 27-Jan-2021 07:37:25 intervalStartTime: 0 intervalStopTime: 0 simulationStartTime: 0 simulationStopTime: 10 filter: simMode: Normal
Следующие команды изменяют значение блока Constant на 1 перед выполнением второй симуляции. Это заставляет Подсистему 1 выполнять.
set_param('slvnvdemo_cv_mutual_exclusion/Constant','Value','1'); test2 = cvtest('slvnvdemo_cv_mutual_exclusion'); data2 = cvsim(test2)
data2 = ... cvdata version: (R2021a) id: 286 type: TEST_DATA test: cvtest object rootID: 233 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 27-Jan-2021 07:37:27 stopTime: 27-Jan-2021 07:37:27 intervalStartTime: 0 intervalStopTime: 0 simulationStartTime: 0 simulationStopTime: 10 filter: simMode: Normal
Используем decisioninfo
команда, чтобы извлечь Decision Coverage из каждого теста и перечислить его в процентах.
Примечание. Хотя оба теста имеют 50% Decision Coverage, независимо от того, покрывают ли они те же 50%, неизвестно.
cov1 = decisioninfo(data1,'slvnvdemo_cv_mutual_exclusion'); percent1 = 100*(cov1(1)/cov1(2)) cov2 = decisioninfo(data2,'slvnvdemo_cv_mutual_exclusion'); percent2 = 100*(cov2(1)/cov2(2))
percent1 = 50 percent2 = 50
Используйте оператор +, чтобы вывести третий объект cvdata, представляющий объединение объектов data1 и data2 cvdata.
Примечание.Новые объекты cvdata, созданные из комбинаций других результатов симуляции, помечаются набором свойств type как DERIVED_DATA.
dataUnion = data1 + data2
dataUnion = ... cvdata version: (R2021a) id: 0 type: DERIVED_DATA test: [] rootID: 233 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 27-Jan-2021 07:37:25 stopTime: 27-Jan-2021 07:37:27 intervalStartTime: 0 intervalStopTime: 0 filter: simMode: Normal
Заметьте, что объединение покрытия составляет 100%, потому что нет перекрытия в покрытии между этими двумя наборами.
covU = decisioninfo(dataUnion,'slvnvdemo_cv_mutual_exclusion');
percentU = 100*(covU(1)/covU(2))
percentU = 100
Подтвердите, что покрытие не перекрывается между двумя тестами, пересекая данные 1 и 2 с оператором *. Как и ожидалось, в перекрестке 0% Decision Coverage.
dataIntersection = data1 * data2
covI = decisioninfo(dataIntersection,'slvnvdemo_cv_mutual_exclusion');
percentI = 100*(covI(1)/covI(2))
dataIntersection = ... cvdata version: (R2021a) id: 0 type: DERIVED_DATA test: [] rootID: 233 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 27-Jan-2021 07:37:25 stopTime: 27-Jan-2021 07:37:27 intervalStartTime: 0 intervalStopTime: 0 filter: simMode: Normal percentI = 0
Производные объекты cvdata могут использоваться во всех командах отчетов и анализа, а также в качестве входов для последующих операций. В качестве примера сгенерируйте отчет о покрытии из производного объекта dataIntersection.
cvhtml('intersect_cov', dataIntersection); % Input to another operation newUnion = dataUnion + dataIntersection
newUnion = ... cvdata version: (R2021a) id: 0 type: DERIVED_DATA test: [] rootID: 233 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 27-Jan-2021 07:37:25 stopTime: 27-Jan-2021 07:37:27 intervalStartTime: 0 intervalStopTime: 0 filter: simMode: Normal
Оператор - используется для формирования объекта cvdata, который представляет различие множеств между левым и правым операндами. Результат операции содержит точки покрытия, которые удовлетворяются в левом операнде, но не удовлетворяются в правом операнде. Эта операция полезна для определения, сколько дополнительного покрытия приписывается конкретному тесту.
В следующем примере различие между объединением первого и второго охвата теста и первым охватом теста должна указывать, сколько дополнительного покрытия предоставлен второй тест. Как уже показано, поскольку ни одна из точек Decision Coverage не перекрывалась, новый Decision Coverage из теста 2 составляет 50%.
newCov2 = dataUnion - data1
covN = decisioninfo(newCov2,'slvnvdemo_cv_mutual_exclusion');
percentN = 100*(covN(1)/covN(2))
newCov2 = ... cvdata version: (R2021a) id: 0 type: DERIVED_DATA test: [] rootID: 233 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 27-Jan-2021 07:37:25 stopTime: 27-Jan-2021 07:37:27 intervalStartTime: 0 intervalStopTime: 0 filter: simMode: Normal percentN = 50