Если у вас есть 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 анализирует операторы, которые представляют решения в исходном коде. Решения являются логическими выражениями, состоящими из условий и одного или нескольких логических операторов
C/C + + &&
или ||
. Условия в ветвящихся конструкциях (если/else, while, do-while) являются решениями. Decision Coverage определяет процент от общего количества результатов принятия решений, которые выполняются в коде во время выполнения. Используйте этот тип покрытия, чтобы определить, все ли решения, включая ветви, в вашем коде проверены.
Примечание
Определение Decision Coverage для DO-178C податливости отличается от определения Simulink Coverage. Для податливости Decision Coverage DO-178C, выберите Condition Decision
структурное покрытие для логических выражений, не содержащих & & или || операторов.
Decision Coverage = (Количество выполненных результатов решения/Общее количество результатов решения) * 100
Этот фрагмент кода содержит три решения:
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 = (Количество условий, оцененных для всех возможных результатов, влияющих на результат решения/Общее количество условий в решениях) * 100
Для этого решения:
X || ( Y && Z )
следующий набор тестов обеспечивает 100% покрытие MCDC.
X | Y | Z | |
---|---|---|---|
Тест № 1 | 0 | 0 | 1 |
Тест № 2 | 0 | 1 | 0 |
Тест № 3 | 0 | 1 | 1 |
Тест № 4 | 1 | 0 | 1 |
Цикломатическая сложность является мерой структурной сложности кода, которая использует меру сложности Маккейба. Чтобы вычислить цикломатическую сложность кода, покрытие кода использует эту формулу:
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
Реляционная граница покрытия кода исследует код, который имеет реляционные операции. Покрытия кода совпадают с метриками для покрытия модели, как описано в реляционном граничном покрытии. Значения с фиксированной точкой в вашей модели являются целыми числами во время покрытия кода.
Покрытие функции определяет, были ли все функции вашего кода вызваны во время симуляции. Например, если в коде десять уникальных функций, покрытие функции проверяет, все ли десять функций были выполнены хотя бы один раз во время симуляции.
Переадресация вызова функции определяет, были ли все узлы вызова функции в вашем коде выполнены во время симуляции. Например, если функции вызываются в коде двадцать раз, вызов функции переадресации проверяет, все ли двадцать вызовов функции были выполнены во время симуляции.