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

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

Пример модели

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

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