Операции на данных о покрытии

В этом примере показано, как использовать перегруженные операторы +, *, и - чтобы объединить результаты покрытия в объединение, пересечение или разность множеств результатов.

Модель в качестве примера

Откройте простую модель с двумя взаимоисключающими активированными подсистемами.

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 объект, представляющий объединение объектов data2 cvdata и data1.

Примечание: Новые объекты cvdata, созданные из комбинаций других результатов симуляции, отмечены набором свойств типа как 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

Нахождение пересечения покрытия

Подтвердите, что покрытие не перекрывается между двумя тестами путем пересечения data1 и data2 с оператором *. Как ожидалось существует 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