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

Если у вас есть 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++ && или ||. Условиями в переходящих построениях (если/еще, в то время как, делают - в то время как) являются решения. 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" );

Модифицированное Условие/Decision Coverage (MCDC) для Покрытия кода

Модифицированным условием/Decision Coverage (MCDC) является степень, до которой условия в рамках решений независимо осуществлены во время выполнения кода.

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

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

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

Модифицированный Пример Условия/Decision Coverage

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

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

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

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

Функциональное покрытие

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

Покрытие вызова функции

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