Типы покрытия кода

Если у вас есть Embedded Coder®, Simulink® Coverage™ можете выполнить несколько типов анализа покрытия кода для моделей в режиме «цикл» (SIL), режиме «цикл» (PIL) и для кода в поддерживаемых блоках S-Function.

Покрытие оператора для покрытия кода

Охват оператора определяет количество операторов исходного кода, которые выполняются при запуске кода. Используйте этот тип покрытия, чтобы определить, был ли каждый оператор в программе вызван хотя бы один раз.

Охват оператора = (Количество выполненных выражений/Общее количество операторов) * 100

Пример покрытия оператора

Этот фрагмент кода содержит пять операторов. Чтобы достичь 100% охвата оператором, вам нужно как минимум три тестов. В частности, тесты с положительными значениями x, отрицательными значениями x и x значениями нуля.

if (x > 0)
  printf( "x is positive" );
else if (x < 0)
  printf( "x is negative" );
else
  printf( "x is 0" );

Покрытие условия для покрытия кода

Покрытие обусловленности анализирует операторы, которые включают условия в исходный код. Условия являются логическими выражениями C/C + +, которые содержат операторы связи (<, >, <=, или >=), операторы уравнений (!= или ==), или логические операторы отрицания (!), но которые не содержат логических операторов (&& или ||). Этот тип покрытия определяет, было ли каждое условие оценено для всех возможных результатов хотя бы один раз.

Покрытие условия = (Количество выполненных исходов условия количество исходов условия) * 100

Пример покрытия условия

В этом выражении:

y = x<=5 && x!=7;

существуют следующие условия:

x<=5
x!=7

Decision Coverage для покрытия кода

Decision Coverage анализирует операторы, которые представляют решения в исходном коде. Решения являются логическими выражениями, состоящими из условий и одного или нескольких логических операторов C/C + + && или ||. Условия в ветвящихся конструкциях (если/else, while, do-while) являются решениями. Decision Coverage определяет процент от общего количества результатов принятия решений, которые выполняются в коде во время выполнения. Используйте этот тип покрытия, чтобы определить, все ли решения, включая ветви, в вашем коде проверены.

Примечание

Определение Decision Coverage для DO-178C податливости отличается от определения Simulink Coverage. Для податливости Decision Coverage DO-178C, выберите Condition Decision структурное покрытие для логических выражений, не содержащих & & или || операторов.

Decision Coverage = (Количество выполненных результатов решения/Общее количество результатов решения) * 100

Пример Decision Coverage

Этот фрагмент кода содержит три решения:

y = x<=5 && x!=7;				// decision #1

if( x > 0 )					// decision #2
  printf( "decision #2 is true" );
else if( x < 0 && y )				// decision #3
  printf( "decision #3 is true" ); 
else
  printf( "decisions #2 and #3 are false" );

Измененное условие/покрытие принятия решений (MCDC) для покрытия кода

Измененное условие/покрытие принятия решений (MCDC) является степенью, в которой условия в решениях выполняются независимо во время выполнения кода.

  • Все условия в решениях оценивались по всем возможным результатам хотя бы один раз.

  • Каждое условие в рамках решения независимо влияет на исход решения.

Охват MCDC = (Количество условий, оцененных для всех возможных результатов, влияющих на результат решения/Общее количество условий в решениях) * 100

Пример покрытия измененных условий/решений

Для этого решения:

X || ( Y && Z )

следующий набор тестов обеспечивает 100% покрытие MCDC.

 XYZ

Тест № 1

001

Тест № 2

010

Тест № 3

011

Тест № 4

101

Цикломатическая сложность для покрытия кода

Цикломатическая сложность является мерой структурной сложности кода, которая использует меру сложности Маккейба. Чтобы вычислить цикломатическую сложность кода, покрытие кода использует эту формулу:

c=1N(on1)

N - количество решений в коде. o n - количество результатов для nth точка принятия решения. Покрытие кода добавляет 1 к номеру сложности для каждой функции C/C + +.

Пример покрытия

Для этого фрагмента кода цикломатическая сложность составляет 3:

void evalNum(int x)
{
  if (x > 0)                          // decision #1
    printf( "x is positive" );
  else if (x < 0)                     // decision #2
    printf( "x is negative" );
  else
    printf( "x is 0" );
}

Код содержит одну функцию, которая имеет две точки принятия решений. Каждая точка принятия решения имеет два результата. Используя предыдущую формулу, N = 2, o 1 = 2, а o 2 = 2. Покрытие кода использует формулу с этими решениями и результатами и добавляет 1 для функции. Цикломатическая сложность для этого фрагмента кода:

c = (o 1  − 1) + (o 2  − 1) + 1 = (2  − 1) + (2  − 1) + 1 = 3

Реляционный контур для покрытия кода

Реляционная граница покрытия кода исследует код, который имеет реляционные операции. Покрытия кода совпадают с метриками для покрытия модели, как описано в реляционном граничном покрытии. Значения с фиксированной точкой в вашей модели являются целыми числами во время покрытия кода.

Покрытие функций

Покрытие функции определяет, были ли все функции вашего кода вызваны во время симуляции. Например, если в коде десять уникальных функций, покрытие функции проверяет, все ли десять функций были выполнены хотя бы один раз во время симуляции.

Переадресация вызова функции

Переадресация вызова функции определяет, были ли все узлы вызова функции в вашем коде выполнены во время симуляции. Например, если функции вызываются в коде двадцать раз, вызов функции переадресации проверяет, все ли двадцать вызовов функции были выполнены во время симуляции.

Для просмотра документации необходимо авторизоваться на сайте