Мониторинг метрик кода#

Языковые анализаторы вычисляют различные метрики кода, которые будут использоваться для оценки качества кода:

  • Метрики кода используются в правилах для выявления проблем, например, при достижении определенного уровня сложности функции в коде.

  • Метрики кода используются в определении Quality Gates. Например, можно установить условие для общего количества выявленных проблем в коде.

Пользователю может использовать различные инструменты в пользовательском интерфейсе для мониторинга и сравнения показателей кода проекта или портфолио. Значения показателей также можно получить через веб-интерфейс CodeScanner, если используется внешняя система мониторинга.

Определение метрик#

В этом разделе описаны метрики кода, используемые в данном программном продукте, с разбивкой по категориям.

Сложность#

В таблице ниже перечислены метрики сложности кода.

Метрика

Ключ метрики

Определение

Цикломатическая сложность

complexit

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

Когнитивная сложность

cognitive_complexity

Оценка того, насколько сложно понять процесс управления кодом

Оба показателя сложности могут быть использованы для определения качества всего кода в целом.

Цикломатическая сложность#

Цикломатическая сложность - это количественная метрика, используемая для подсчета числа путей в графе потока управления программы. Анализатор вычисляет значение этого показателя для данной “функции” (в зависимости от языка, это может быть функция, метод, подпрограмма и т.д.), увеличивая счетчик цикломатической сложности функции на единицу каждый раз, когда поток управления функцией разделяется, что приводит к новой условной ветви. Минимальная сложность каждой функции равна 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.

Метрика

Ключ метрики

Определение

Покрытие условий

branch_coverage

В каждой строке кода, содержащей несколько логических выражений, покрытие условий отвечает на следующий вопрос: «Было ли каждое логическое выражение оценено как истинное, так и ложное?». Это плотность возможных условий в структурах управления потоком, которые соблюдались во время выполнения модульных тестов.conditionCoverage = (CT + CF) / (2*B), где: CT = условия, которые были оценены как «истина» хотя бы один раз, CF = условия, которые были оценены как «ложные» хотя бы один раз, B = общее количество условий

Покрытие условий по новому коду

new_branch_coverage

Это определение идентично условию покрытия, но ограничено новым/обновленным исходным кодом

Списки условий покрытия

branch_coverage_hits_data

Список покрытых условий

Условия по строкам

conditions_by_line

Количество условий по строкам

Покрытие

coverage

Сочетание покрытия строк и покрытие условий. Его цель - дать еще более точный ответ на вопрос «Какая часть исходного кода была обработана модульными тестами?». Coverage = (CT + CF + LC)/(2*B + EL), где: CT = условия, которые были оценены как «истина» хотя бы один раз. CF = условия, которые были оценены как «ложные» хотя бы один раз. LC = количество покрытых строк = linesToCover - uncoveredLines. B = общее количество условий. EL = общее количество исполняемых строк (linesToCover)

Покрытие нового кода

new_coverage

Это определение идентично определению Coverage, но применяется для нового кода

Покрытие строк

line_coverage

Для данной строки кода покрытие строк просто отвечает на вопрос «Была ли эта строка кода выполнена во время выполнения модульных тестов?». Это плотность покрытия строк модульными тестами: Line coverage = LC / EL, где: LC = покрытые строки ( linesToCover - uncoveredLines ), EL = общее количество исполняемых строк (Lines to cover)

Покрытие строк нового кода

new_line_coverage

Это определение идентично покрытию строк, но применяется для нового кода

Списки покрытия строк

coverage_line_hist_data

Список покрытых строк

Строки для покрытия

lines_to_coverable

Количество строк кода, которые могут быть покрыты модульными тестами (например, пустые строки или полные комментарии не считаются покрываемыми строками). Обратите внимание, что эта метрика показывает то, что возможно, а не то, что осталось сделать (это Uncovered lines)

Строки, которые должны быть покрыты в новом коде

new_lines_to_cover

Это определение идентично определению Lines to cover, но ограничено новым/обновленным исходным кодом

Пропущенные модульные тесты

skipped_tests

Количество пропущенных модульных тестов

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

uncovered_conditions

Количество условий, которые не покрываются модульными тестами

Раскрытые условия для нового кода

new_uncovered_conditions

Это определение идентично определению Раскрытые условия, но ограничено новым/обновленным исходным кодом

Непокрытые строки

uncovered_lines

Количество строк кода, не покрытых модульными тестами

Раскрытые строки в новом коде

new_uncovered_lines

Это определение идентично Uncovered lines, но применимо для нового кода

Модульных тесты

tests

Количество модульных тестов

Продолжительность выполнения тестов

test_execution_time

Время, необходимое для выполнения всех тестов

Ошибки модульных тестов

test_errors

Количество неудачных модульных тестов

Сбои в модульных тестах

test_failures

Количество модульных тестов, которые завершились неожиданным исключением.

Процент успешности юнит-тестов

test_success_density

unitTestSuccessDensity = (unitTests - (unitTestErrors + unitTestFailures)) / (unitTests) * 100

Дублирование#

В таблице ниже перечислены метрики дублирования.

Метрика

Ключ метрики

Определение

Дублированные блоки

duplicated_blocks

Количество дублированных блоков строк. Для того, чтобы блок кода считался дублированным:
На не-Java проекты должно быть не менее 100 последовательных и дублирующихся токенов. Данные маркеры должны быть распределены, по крайней мере, на:
30 строк кода для COBOL;
20 строк кода для ABAP;
10 строк кода для других языков.
Java-проекты: Независимо от количества лексем и строк должно быть не менее 10 последовательных и дублирующихся утверждений. Различия в отступах и строковых литералах игнорируются при обнаружении дубликатов

Дублированные файлы

duplicated_files

Количество файлов, вовлеченных в дублирование

Дублированные строки

duplicated_lines

Количество строк, вовлеченных в дублирование

Дублированные строки (%)

duplicated_lines_density

Рассчитывается по следующей формуле: duplicatedLines / numberOfLinesOfCode * 100

Замечания#

В таблице ниже перечислены метрики замечаний.

Метрика

Ключ метрики

Определение

Новые замечания

new_violations

Общее количество замечаний впервые возникших в связи с новым кодом

Замечания

violations

Общее количество замечаний во всех состояниях

Ложноположительные замечания

false_positive_issues

Общее количество замечаний, отмеченных как ложноположительные

Открытые замечания

open_issues

Общее количество замечаний в статусе Open

Принятые замечания

accepted_issues

Общее количество замечаний, отмеченных как принятые

Сопровождаемость#

В таблице ниже перечислены метрики сопровождаемости, используемые в решении CodeScanner.

Метрика

Ключ метрики

Определение

Замечания

code_smells

Общее количество замечаний, влияющих на сопровождаемость (ремонтопригодность)

Новые замечания

new_code_smells

Общее количество замечаний по сопровождению, впервые возникших при работе с новым кодом

Технический долг

sqale_index

Показатель усилий, направленных на устранение всех замечаний с сопровождаемостью

Технический долг для нового кода

new_technical_debt

Показатель усилий, направленных на устранение всех замечаний с сопровождаемостью, впервые возникших в новом коде

Коэффициент технического долга

sqale_debt_ratio

Соотношение между затратами на разработку программного обеспечения и затратами на его исправление

Отношение технического долга по новому коду

new_sqale_debt_ratio

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

Рейтинг сопровождаемости

sqale_rating

Рейтинг, связанный со значением коэффициента технического долга

Рейтинг сопровождаемости нового кода

new_squale _rating

Рейтинг, связанный со значением коэффициента технического долга, по новому коду

Технический долг (Усилие)#

Технический долг (Усилие) - это сумма затрат на устранение замечаний, связанных сопровождением. Затраты на устранение замечаний рассчитываются исходя из затрат, связанных с правилом, из-за которого возникло замечание.

долг

Коэффициент технического долга#

Коэффициент технического долга - это соотношение между затратами на разработку программного обеспечения и техническим долгом (затратами на его исправление). Он рассчитывается по следующей формуле:

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

alert_status

Состояние Quality gate, связанное с проектом. Возможные значения: ERROR и OK

Детали порогов качества

quality_gate_details

Статус (провал или нет) каждого условия в порогах качества

Надежность#

Метрика

Ключ метрики

Определение

Ошибки

bugs

Общее количество ошибок, влияющих на надежность

Новые ошибки

new_bugs

Общее количество проблем с надежностью, возникших впервые в новом коде

Рейтинг надежности

reliability_rating

Рейтинг, связанный с надежностью. Рейтинговая сетка выглядит следующим образом:
A = 0 ошибок;
B = хотя бы одна незначительная ошибка;
C = хотя бы одна крупная ошибка;
D = хотя бы одна критическая ошибка;
E = как минимум одна ошибка-блокиратор

Усилия по устранению проблем надежности

reliability_remediation_effort

Усилия по устранению всех проблем с надежностью. Стоимость устранения неполадки определяется исходя из затрат (в минутах), связанных с правилом, из-за которого возникла проблема

Усилия по устранению проблем надежности в новом коде

new_reliability_remmediation_effort

То же, что и усилия по устранению проблем надежности, но в новом коде

Безопасность#

Метрика

Ключ метрики

Определение

Уязвимости

vulnerabilities

Общее количество уязвимостей, влияющих на безопасность

Уязвимости в новом коде

new_vulnerabilities

Общее количество уязвимостей безопасности, впервые возникших в новом коде

Рейтинг безопасности

security_rating

Рейтинг, связанный с безопасностью. Рейтинговая шкала выглядит следующим образом:
A = 0 уязвимостей;
B = хотя бы одна незначительная уязвимость;
C = как минимум одна серьезная уязвимость;
D = как минимум одна критическая уязвимость;
E = как минимум одна блокирующая уязвимость

Усилия по устранению замечаний безопасности

security_remediation_effort

Усилия по устранению всех замечаний безопасности. Стоимость устранения замечаний берется из усилий (в минутах), приложенных к правилу, которое вызвало замечание

Усилия по устранению замечаний безопасности в новом коде

new_security_remediation_effort

То же, что и усилия по устранению замечаний безопасности, но в новом коде

Потенциальные уязвимости

security_hotspots

Количество потенциальных уязвимостей

Потенциальные уязвимости в новом коде

new_security_hotspots

Количество Потенциальные уязвимости в новом коде

Все метрики безопасности могут быть использованы в Quality Gates, кроме метрики Security hotspots.

Обзор безопасности#

Метрика

Ключ метрики

Определение

Security hotspots

security_hotspots_reviewed

Процент проверенных потенциальных уязвимостей по отношению к общему количеству потенциальных уязвимостей

Новые потенциальные уязвимости

new_security_hotspots_reviewed

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

Рейтинг обзора безопасности

security_review_rating

Рейтинг обзора безопасности - это буквенная оценка, основанная на проценте проверенных потенциальных уязвимостей. Обратите внимание, что потенциальные уязвимости считаются проверенными, если они отмечены как подтвержденные, исправленные или безопасные. Сетка оценок выглядит следующим образом:
A = >= 80%;
B = >= 70 % и <80 %;
C = >= 50 % и <70 %;
D = >= 30 % и <50 %;
E = < 30%

Оценка обзора безопасности нового кода

new_security_review_rating

Оценка обзора безопасности нового кода

Размер#

Метрика

Ключ метрики

Определение

Классы

classes

Количество классов (включая вложенные классы, интерфейсы, перечисления и аннотации)

Строки комментариев

comment_lines

Количество строк, содержащих либо комментарий, либо закомментированный код

Комментарии (%)

comment_lines_density

Плотность строк комментариев. Рассчитывается по следующей формуле: [commentLines / (NumberOfLinesOfCode + commentLines)] * 100

Файлы

files

Количество файлов

Строки

lines

Количество физических строк (возврат каретки (нажатие enter))

Строки кода

ncloc

Количество физических строк, содержащих хотя бы один символ, который не является ни пробелом, ни табуляцией, ни частью комментария

Строки кода определенного языка

ncloc_language_distribution

Некомментированные строки кода, распределенные по языкам

Функции

functions

Количество функций. В зависимости от языка, функция определяется как функция или метод. Детали, относящиеся к конкретному языку:
COBOL: количество параграфов;
Java: Методы в анонимных классах игнорируются;
VB.NET: Аксессоры не считаются методами

Проекты

projects

Количество проектов в портфолио

Утверждения

statements

Количество утверждений

Мониторинг метрик кода в проекте#

Чтобы просмотреть значения всех показателей кода в проекте:

  1. Перейдите в нужный проект;

  2. На панели навигации проекта выберите Показатели;

Чтобы просмотреть историю значений одной или нескольких метрик кода в проекте:

  1. Выберите проект, который хотите отслеживать.

  2. На панели навигации по проекту выберите Активность. Количество проблем показано на графике.

  3. Чтобы изменить отображаемые показатели, нажмите Замечания и выберите другую категорию показателей в раскрывающемся списке.

  4. Если необходимо отслеживать другие метрики, выберите Собственный: появится раскрывающийся список Добавить метрику. Затем нажмите Добавить метрику и выберите в раскрывающемся списке метрику(и), которую(ые) хотите отслеживать. Выбранные метрики отображаются на одном или нескольких графиках, чтобы пользователь мог их сравнить.

custom metrics

Изменение параметров, связанных с техническими долгами#

Некоторые параметры, связанные с показателями сопровождаемости, могут быть изменены в пользовательском интерфейсе на глобальном уровне при наличии разрешения на администрирование системы. Альтернативно возможно задать соответствующее свойство sonar на хосте CI/CD.

Изменение расчета стоимости разработки программного обеспечения#

При расчете коэффициента технического долга используется стоимость разработки одной строки кода. Чтобы изменить значение по умолчанию:

  1. В верхней навигационной панели CodeScanner выберите Администрирование -> Конфигурация -> Общие настройки -> Технический долг;

  2. В разделе Стоимость разработки измените значения (в минутах).

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

Изменение таблицы рейтинга поддерживаемости#

Чтобы изменить таблицу рейтинга поддерживаемости по умолчанию:

  1. В верхней навигационной панели CodeScanner выберите Администрирование -> Конфигурация -> Общие настройки -> Технический долг;

  2. В разделе Таблица рейтинга поддерживаемости измените определение рейтинга.

debt-conf

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