В этом примере показано, как использовать перегруженные операторы +, *, и - чтобы объединить результаты покрытия в объединение, пересечение или разность множеств результатов.
Откройте простую модель с двумя взаимоисключающими активированными подсистемами.
open_system('slvnvdemo_cv_mutual_exclusion')
Используйте команды cvtest
и cvsim
запустить симуляцию. Первоначально, значение блока Constant 0, который обеспечивает Подсистему 2, чтобы выполниться.
test1 = cvtest('slvnvdemo_cv_mutual_exclusion');
data1 = cvsim(test1)
data1 = ... cvdata version: (R2020b) id: 231 type: TEST_DATA test: cvtest object rootID: 233 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 30-Jul-2020 03:36:50 stopTime: 30-Jul-2020 03:36:51 intervalStartTime: 0 intervalStopTime: 0 simulationStartTime: 0 simulationStopTime: 10 metrics: [1x1 struct] 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: (R2020b) id: 286 type: TEST_DATA test: cvtest object rootID: 233 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 30-Jul-2020 03:36:52 stopTime: 30-Jul-2020 03:36:52 intervalStartTime: 0 intervalStopTime: 0 simulationStartTime: 0 simulationStopTime: 10 metrics: [1x1 struct] 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 объект, представляющий объединение объектов data2 cvdata и data1.
Примечание: Новые объекты cvdata, созданные из комбинаций других результатов симуляции, отмечены набором свойств типа как DERIVED_DATA.
dataUnion = data1 + data2
dataUnion = ... cvdata version: (R2020b) id: 0 type: DERIVED_DATA test: [] rootID: 233 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 30-Jul-2020 03:36:50 stopTime: 30-Jul-2020 03:36:52 intervalStartTime: 0 intervalStopTime: 0 metrics: [1x1 struct] filter: simMode: Normal
Заметьте, что объединение покрытия - 100%, потому что нет никакого перекрытия в покрытии между двумя наборами.
covU = decisioninfo(dataUnion,'slvnvdemo_cv_mutual_exclusion');
percentU = 100*(covU(1)/covU(2))
percentU = 100
Подтвердите, что покрытие не перекрывается между двумя тестами путем пересечения data1 и data2 с оператором *. Как ожидалось существует 0% Decision Coverage в пересечении.
dataIntersection = data1 * data2
covI = decisioninfo(dataIntersection,'slvnvdemo_cv_mutual_exclusion');
percentI = 100*(covI(1)/covI(2))
dataIntersection = ... cvdata version: (R2020b) id: 0 type: DERIVED_DATA test: [] rootID: 233 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 30-Jul-2020 03:36:50 stopTime: 30-Jul-2020 03:36:52 intervalStartTime: 0 intervalStopTime: 0 metrics: [1x1 struct] filter: simMode: Normal percentI = 0
Выведенные объекты cvdata могут использоваться во всех командах создания отчетов и анализа, и как входные параметры к последующим операциям. Как пример, сгенерируйте отчет покрытия от выведенного объекта dataIntersection.
cvhtml('intersect_cov', dataIntersection); % Input to another operation newUnion = dataUnion + dataIntersection
newUnion = ... cvdata version: (R2020b) id: 0 type: DERIVED_DATA test: [] rootID: 233 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 30-Jul-2020 03:36:50 stopTime: 30-Jul-2020 03:36:52 intervalStartTime: 0 intervalStopTime: 0 metrics: [1x1 struct] 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: (R2020b) id: 0 type: DERIVED_DATA test: [] rootID: 233 checksum: [1x1 struct] modelinfo: [1x1 struct] startTime: 30-Jul-2020 03:36:50 stopTime: 30-Jul-2020 03:36:52 intervalStartTime: 0 intervalStopTime: 0 metrics: [1x1 struct] filter: simMode: Normal percentN = 50