Мониторинг метрик кода#
Языковые анализаторы вычисляют различные метрики кода, которые будут использоваться для оценки качества кода:
Метрики кода используются в правилах для выявления проблем, например, при достижении определенного уровня сложности функции в коде.
Метрики кода используются в определении Quality Gates. Например, можно установить условие для общего количества выявленных проблем в коде.
Пользователю может использовать различные инструменты в пользовательском интерфейсе для мониторинга и сравнения показателей кода проекта или портфолио. Значения показателей также можно получить через веб-интерфейс CodeScanner, если используется внешняя система мониторинга.
Определение метрик#
В этом разделе описаны метрики кода, используемые в данном программном продукте, с разбивкой по категориям.
Сложность#
В таблице ниже перечислены метрики сложности кода.
Метрика |
Ключ метрики |
Определение |
|---|---|---|
Цикломатическая сложность |
|
Определяется количеством независимых путей в графе потока управления программы. Чем больше таких путей, тем выше цикломатическая сложность |
Когнитивная сложность |
|
Оценка того, насколько сложно понять процесс управления кодом |
Оба показателя сложности могут быть использованы для определения качества всего кода в целом.
Цикломатическая сложность#
Цикломатическая сложность - это количественная метрика, используемая для подсчета числа путей в графе потока управления программы. Анализатор вычисляет значение этого показателя для данной “функции” (в зависимости от языка, это может быть функция, метод, подпрограмма и т.д.), увеличивая счетчик цикломатической сложности функции на единицу каждый раз, когда поток управления функцией разделяется, что приводит к новой условной ветви. Минимальная сложность каждой функции равна 1. Формула расчета выглядит следующим образом:
cyclomaticComplexity = 1 + numberOfConditionalBranches
Вычисление общей цикломатической сложности кода в основном представляет собой сумму всех оценок сложности, рассчитанных на функциональном уровне. Для некоторых языков сложность вне функций учитывается дополнительно.
ABAP#
ABAP-анализатор вычисляет цикломатическую сложность на функциональном уровне. Он увеличивает цикломатическую сложность на единицу каждый раз, когда обнаруживает одно из следующих ключевых слов:
Ключевое слово |
|---|
AND |
CATCH |
DO |
ELSEIF |
IF |
LOOP |
LOOPAT |
OR |
PROVIDE |
SELECT…ENDSELECT |
TRY |
WHEN |
WHILE |
C/C++/Objective-C#
Анализатор C/C++/Objective-C вычисляет цикломатическую сложность на уровне функций и сопрограмм. Он увеличивает цикломатическую сложность на единицу при каждом обнаружении:
Функции и сопрограммы |
|---|
if, while, do while, for |
case, default |
&& |
? |
lambda |
C##
Анализатор C# вычисляет цикломатическую сложность на уровнях метода и свойства. Он увеличивает цикломатическую сложность на единицу при каждом обнаружении:
Методы и свойства |
|---|
Метод, конструктор, деструктор, свойство, аксессор, оператор или объявление локальной функции |
Условное выражение |
Условный доступ |
switch case, switch expression |
and/or |
do, for, foreach, if, while |
??, ??=, && |
Java#
Анализатор Java вычисляет цикломатическую сложность на уровне метода. Он увеличивает цикломатическую сложность на единицу каждый раз, когда обнаруживает одно из этих ключевых слов:
Методы |
|---|
If |
for |
while |
case |
&& |
? |
-> |
PL/SQL#
Анализатор PL/SQL вычисляет цикломатическую сложность на уровне функций и процедур. Он увеличивает цикломатическую сложность на единицу при каждом обнаружении:
Главный анонимный блок PL/SQL (не внутренние)
Один из следующих операторов:
CREATE PROCEDURE;
CREATE TRIGGER;
basic LOOP;
WHEN («WHEN» простого оператора CASE и искомого оператора CASE);
FOR LOOP;
CONTINUE / EXIT WHEN (часть «WHEN» операторов CONTINUE и EXIT)
обработчик исключений (каждое отдельное «WHEN»);
EXIT;
FORLOOP;
FORALL;
IF;
ELSIF;
RAISE;
WHILELOOP;
Одно из следующих выражений:
AND(«AND» зарезервированное слово, используемое в выражениях PL/SQL);
Rexpression («OR» зарезервированное слово, используемое в выражениях PL/SQL);
WHEN («WHEN» простого CASE-выражения и искомого CASE-выражения).
JS/TS, PHP#
Анализатор JS/TS вычисляет цикломатическую сложность на функциональном уровне. Анализатор PHP вычисляет цикломатическую сложность на функциональном и классовом уровнях. Оба анализатора увеличивают цикломатическую сложность на единицу при каждом обнаружении:
Функция (т.е. неабстрактные и неанонимные конструкторы, функции, процедуры или методы);
Ключевое слово if;
Замыкающую (она же «ленивая») логическую связку (&&);
Короткозамкнутая (она же «ленивая») логическая дизъюнкция (||);
Троичное условное выражение;
Цикл;
Пункт case оператора switch;
Оператор throw или catch;
Оператор go to (только для PHP).
Покрытие#
В таблице ниже перечислены метрики тестового покрытия, используемые в решении Sonar.
Метрика |
Ключ метрики |
Определение |
|---|---|---|
Покрытие условий |
|
В каждой строке кода, содержащей несколько логических выражений, покрытие условий отвечает на следующий вопрос: «Было ли каждое логическое выражение оценено как истинное, так и ложное?». Это плотность возможных условий в структурах управления потоком, которые соблюдались во время выполнения модульных тестов. |
Покрытие условий по новому коду |
|
Это определение идентично условию покрытия, но ограничено новым/обновленным исходным кодом |
Списки условий покрытия |
|
Список покрытых условий |
Условия по строкам |
|
Количество условий по строкам |
Покрытие |
coverage |
Сочетание покрытия строк и покрытие условий. Его цель - дать еще более точный ответ на вопрос «Какая часть исходного кода была обработана модульными тестами?». |
Покрытие нового кода |
|
Это определение идентично определению Coverage, но применяется для нового кода |
Покрытие строк |
|
Для данной строки кода покрытие строк просто отвечает на вопрос «Была ли эта строка кода выполнена во время выполнения модульных тестов?». Это плотность покрытия строк модульными тестами: |
Покрытие строк нового кода |
|
Это определение идентично покрытию строк, но применяется для нового кода |
Списки покрытия строк |
|
Список покрытых строк |
Строки для покрытия |
|
Количество строк кода, которые могут быть покрыты модульными тестами (например, пустые строки или полные комментарии не считаются покрываемыми строками). Обратите внимание, что эта метрика показывает то, что возможно, а не то, что осталось сделать (это Uncovered lines) |
Строки, которые должны быть покрыты в новом коде |
|
Это определение идентично определению Lines to cover, но ограничено новым/обновленным исходным кодом |
Пропущенные модульные тесты |
|
Количество пропущенных модульных тестов |
Непокрытые условия |
|
Количество условий, которые не покрываются модульными тестами |
Раскрытые условия для нового кода |
|
Это определение идентично определению Раскрытые условия, но ограничено новым/обновленным исходным кодом |
Непокрытые строки |
|
Количество строк кода, не покрытых модульными тестами |
Раскрытые строки в новом коде |
|
Это определение идентично Uncovered lines, но применимо для нового кода |
Модульных тесты |
|
Количество модульных тестов |
Продолжительность выполнения тестов |
|
Время, необходимое для выполнения всех тестов |
Ошибки модульных тестов |
|
Количество неудачных модульных тестов |
Сбои в модульных тестах |
|
Количество модульных тестов, которые завершились неожиданным исключением. |
Процент успешности юнит-тестов |
|
|
Дублирование#
В таблице ниже перечислены метрики дублирования.
Метрика |
Ключ метрики |
Определение |
|---|---|---|
Дублированные блоки |
|
Количество дублированных блоков строк. Для того, чтобы блок кода считался дублированным: |
Дублированные файлы |
|
Количество файлов, вовлеченных в дублирование |
Дублированные строки |
|
Количество строк, вовлеченных в дублирование |
Дублированные строки (%) |
|
Рассчитывается по следующей формуле: |
Замечания#
В таблице ниже перечислены метрики замечаний.
Метрика |
Ключ метрики |
Определение |
|---|---|---|
Новые замечания |
|
Общее количество замечаний впервые возникших в связи с новым кодом |
Замечания |
|
Общее количество замечаний во всех состояниях |
Ложноположительные замечания |
|
Общее количество замечаний, отмеченных как ложноположительные |
Открытые замечания |
|
Общее количество замечаний в статусе Open |
Принятые замечания |
|
Общее количество замечаний, отмеченных как принятые |
Сопровождаемость#
В таблице ниже перечислены метрики сопровождаемости, используемые в решении CodeScanner.
Метрика |
Ключ метрики |
Определение |
|---|---|---|
Замечания |
|
Общее количество замечаний, влияющих на сопровождаемость (ремонтопригодность) |
Новые замечания |
|
Общее количество замечаний по сопровождению, впервые возникших при работе с новым кодом |
Технический долг |
|
Показатель усилий, направленных на устранение всех замечаний с сопровождаемостью |
Технический долг для нового кода |
|
Показатель усилий, направленных на устранение всех замечаний с сопровождаемостью, впервые возникших в новом коде |
Коэффициент технического долга |
|
Соотношение между затратами на разработку программного обеспечения и затратами на его исправление |
Отношение технического долга по новому коду |
|
ОСоотношение между затратами на разработку кода изменилось в связи с появлением нового кода и стоимостью связанных с ним замечаний |
Рейтинг сопровождаемости |
|
Рейтинг, связанный со значением коэффициента технического долга |
Рейтинг сопровождаемости нового кода |
|
Рейтинг, связанный со значением коэффициента технического долга, по новому коду |
Технический долг (Усилие)#
Технический долг (Усилие) - это сумма затрат на устранение замечаний, связанных сопровождением. Затраты на устранение замечаний рассчитываются исходя из затрат, связанных с правилом, из-за которого возникло замечание.

Коэффициент технического долга#
Коэффициент технического долга - это соотношение между затратами на разработку программного обеспечения и техническим долгом (затратами на его исправление). Он рассчитывается по следующей формуле:
technicalDebt /(costToDevelop1lineOfCode * numberOfLinesOfCode), где стоимость разработки одной строки кода предопределена в базе данных (по умолчанию 30 минут, может быть изменена).
Пример:
Технический долг: 122,563
Количество строк кода: 63,987
Стоимость разработки одной строки кода: 30 минут
Коэффициент технического долга: 6,4%
Рейтинг сопровождаемости#
По умолчанию используется шкала рейтинга сопровождаемости:
A = 0-0.05;
B = 0.06 - 0.1;
C = 0.11-0.20;
D = 0.21-0.5;
E = 0.51 - 1.
Шкала оценки сопровождаемости может быть определена альтернативным образом. Если непогашенные затраты на восстановление составляют:
<=5% от времени, которое уже было затрачено на применение, то оценка A;
от 6 до 10% - оценка B;
от 11 до 20% - оценка C;
от 21 до 50% - оценка D;
свыше 50 % - E;
Quality gate#
Метрика |
Ключ метрики |
Определение |
|---|---|---|
Состояние Quality gate |
|
Состояние Quality gate, связанное с проектом. Возможные значения: ERROR и OK |
Детали порогов качества |
|
Статус (провал или нет) каждого условия в порогах качества |
Надежность#
Метрика |
Ключ метрики |
Определение |
|---|---|---|
Ошибки |
|
Общее количество ошибок, влияющих на надежность |
Новые ошибки |
|
Общее количество проблем с надежностью, возникших впервые в новом коде |
Рейтинг надежности |
|
Рейтинг, связанный с надежностью. Рейтинговая сетка выглядит следующим образом: |
Усилия по устранению проблем надежности |
|
Усилия по устранению всех проблем с надежностью. Стоимость устранения неполадки определяется исходя из затрат (в минутах), связанных с правилом, из-за которого возникла проблема |
Усилия по устранению проблем надежности в новом коде |
|
То же, что и усилия по устранению проблем надежности, но в новом коде |
Безопасность#
Метрика |
Ключ метрики |
Определение |
|---|---|---|
Уязвимости |
|
Общее количество уязвимостей, влияющих на безопасность |
Уязвимости в новом коде |
|
Общее количество уязвимостей безопасности, впервые возникших в новом коде |
Рейтинг безопасности |
security_rating |
Рейтинг, связанный с безопасностью. Рейтинговая шкала выглядит следующим образом: |
Усилия по устранению замечаний безопасности |
|
Усилия по устранению всех замечаний безопасности. Стоимость устранения замечаний берется из усилий (в минутах), приложенных к правилу, которое вызвало замечание |
Усилия по устранению замечаний безопасности в новом коде |
|
То же, что и усилия по устранению замечаний безопасности, но в новом коде |
Потенциальные уязвимости |
|
Количество потенциальных уязвимостей |
Потенциальные уязвимости в новом коде |
|
Количество Потенциальные уязвимости в новом коде |
Все метрики безопасности могут быть использованы в Quality Gates, кроме метрики Security hotspots.
Обзор безопасности#
Метрика |
Ключ метрики |
Определение |
|---|---|---|
Security hotspots |
|
Процент проверенных потенциальных уязвимостей по отношению к общему количеству потенциальных уязвимостей |
Новые потенциальные уязвимости |
|
Процент просмотренных потенциальных уязвимостей в новом коде |
Рейтинг обзора безопасности |
|
Рейтинг обзора безопасности - это буквенная оценка, основанная на проценте проверенных потенциальных уязвимостей. Обратите внимание, что потенциальные уязвимости считаются проверенными, если они отмечены как подтвержденные, исправленные или безопасные. Сетка оценок выглядит следующим образом: |
Оценка обзора безопасности нового кода |
|
Оценка обзора безопасности нового кода |
Размер#
Метрика |
Ключ метрики |
Определение |
|---|---|---|
Классы |
|
Количество классов (включая вложенные классы, интерфейсы, перечисления и аннотации) |
Строки комментариев |
|
Количество строк, содержащих либо комментарий, либо закомментированный код |
Комментарии (%) |
|
Плотность строк комментариев. Рассчитывается по следующей формуле: |
Файлы |
|
Количество файлов |
Строки |
|
Количество физических строк (возврат каретки (нажатие enter)) |
Строки кода |
|
Количество физических строк, содержащих хотя бы один символ, который не является ни пробелом, ни табуляцией, ни частью комментария |
Строки кода определенного языка |
|
Некомментированные строки кода, распределенные по языкам |
Функции |
|
Количество функций. В зависимости от языка, функция определяется как функция или метод. Детали, относящиеся к конкретному языку: |
Проекты |
|
Количество проектов в портфолио |
Утверждения |
|
Количество утверждений |
Мониторинг метрик кода в проекте#
Чтобы просмотреть значения всех показателей кода в проекте:
Перейдите в нужный проект;
На панели навигации проекта выберите Показатели;
Чтобы просмотреть историю значений одной или нескольких метрик кода в проекте:
Выберите проект, который хотите отслеживать.
На панели навигации по проекту выберите Активность. Количество проблем показано на графике.
Чтобы изменить отображаемые показатели, нажмите Замечания и выберите другую категорию показателей в раскрывающемся списке.
Если необходимо отслеживать другие метрики, выберите Собственный: появится раскрывающийся список Добавить метрику. Затем нажмите Добавить метрику и выберите в раскрывающемся списке метрику(и), которую(ые) хотите отслеживать. Выбранные метрики отображаются на одном или нескольких графиках, чтобы пользователь мог их сравнить.

Изменение параметров, связанных с техническими долгами#
Некоторые параметры, связанные с показателями сопровождаемости, могут быть изменены в пользовательском интерфейсе на глобальном уровне при наличии разрешения на администрирование системы. Альтернативно возможно задать соответствующее свойство sonar на хосте CI/CD.
Изменение расчета стоимости разработки программного обеспечения#
При расчете коэффициента технического долга используется стоимость разработки одной строки кода. Чтобы изменить значение по умолчанию:
В верхней навигационной панели CodeScanner выберите Администрирование -> Конфигурация -> Общие настройки -> Технический долг;
В разделе Стоимость разработки измените значения (в минутах).
Соответствующее свойство -
sonar.technicalDebt.developmentCost
Изменение таблицы рейтинга поддерживаемости#
Чтобы изменить таблицу рейтинга поддерживаемости по умолчанию:
В верхней навигационной панели CodeScanner выберите Администрирование -> Конфигурация -> Общие настройки -> Технический долг;
В разделе Таблица рейтинга поддерживаемости измените определение рейтинга.

Соответствующее свойство - sonar.technicalDebt.ratingGrid