Skip to content

Sonar: не мерить покрытие на живом WMI — Quality Gate падал на main - #10

Merged
Oksion merged 1 commit into
mainfrom
oksion/sonar-coverage-exclusions
Jul 29, 2026
Merged

Sonar: не мерить покрытие на живом WMI — Quality Gate падал на main#10
Oksion merged 1 commit into
mainfrom
oksion/sonar-coverage-exclusions

Conversation

@Oksion

@Oksion Oksion commented Jul 29, 2026

Copy link
Copy Markdown
Owner

Проблема

После слияния XIC-4 на main висит красный крестик: проверка SonarCloud Code Analysisfailure. Сам воркфлоу отрабатывает успешно, падает именно Quality Gate.

Точная причина (из публичного API проекта):

Метрика Значение
new_coverage 78.1% при пороге 80%
new_lines 422
new_lines_to_cover 22
new_uncovered_lines 6 — все в src/Wmi/MifsClient.cs

Это GetChargeLimit/SetChargeLimit из XIC-4. Покрыть их юнит-тестами нельзя в принципе: они дёргают живой WMI через ManagementObject.InvokeMethod и без ноутбука просто не выполняются. Логика над ними и так тестируется — через шов IMifsClient на фейках (5 кейсов SetCareLimit в AppControllerTests).

Поднять порог или завести свой Quality Gate нельзя: пользовательские гейты доступны только в планах Team и Enterprise, а встроенный «Sonar way» жёстко требует 80% на новом коде. У нас бесплатный тариф для открытых проектов.

Решение

Приводим измерение покрытия в соответствие с политикой тестирования, которая в проекте и так действует (CLAUDE.md: «чистую логику покрывай тестом, UI и железо — глазами»). src/Ui/** и src/SystemIntegration/** по этой причине исключены давно — добавляем к ним два файла живого WMI:

src/Wmi/MifsClient.cs, src/Wmi/MifsEventWatcher.cs

Что важно:

  • Mifs.cs НЕ исключён — это чистые таблицы и маппинги кодов, они покрыты ChargeLevelsTests и должны оставаться измеряемыми. Исключены ровно те два файла в src/Wmi/, которые реально ходят в WMI (проверил grep по ManagementObject/ManagementEventWatcher).
  • На поиск багов, smells и уязвимостей это не влияетsonar.coverage.exclusions трогает только метрику покрытия, статический анализ по этим файлам идёт как шёл.
  • Правило записано в CLAUDE.md (раздел «Релизы и CI»), чтобы следующий файл с живым железом не ронял гейт на ровном месте.

Проверка

Воркфлоу sonar.yml запускается только на push в main, поэтому в самом PR гейт не пересчитается — станет зелёным на первом пуше после слияния: шесть непокрытых строк уходят из измерения, остаётся 16 из 16 покрытых.

Правки только в конфигурации CI и документации — код не тронут.

🤖 Generated with Claude Code

Quality Gate падал на main: покрытие нового кода 78.1% при пороге 80%. Все 6
непокрытых строк — в src/Wmi/MifsClient.cs (GetChargeLimit/SetChargeLimit из
XIC-4). Юнитами они не покрываются в принципе: это вызовы живого WMI через
ManagementObject, без ноутбука не выполняются. Логика над ними давно тестируется
через шов IMifsClient на фейках.

Свой Quality Gate на бесплатном тарифе не завести (только Team/Enterprise), а
встроенный «Sonar way» жёстко требует 80% на новом коде. Поэтому приводим
ИЗМЕРЕНИЕ в соответствие с политикой тестирования из CLAUDE.md, по которой
src/Ui и src/SystemIntegration уже исключены: добавляем два файла живого WMI.

Mifs.cs НЕ исключаем — это чистые таблицы и маппинги, они покрыты тестами
(ChargeLevelsTests) и должны такими оставаться. На поиск багов/smells/уязвимостей
исключение не влияет: sonar.coverage.exclusions трогает только coverage.

Правило записано в CLAUDE.md, чтобы следующий файл с живым железом не ронял гейт.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Oksion
Oksion merged commit 70d3570 into main Jul 29, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant