Files
ChatBot/CoverageImprovementPlan.md
Leonid Pershin b8fc79992a
All checks were successful
SonarQube / Build and analyze (push) Successful in 3m33s
fix covverage
2025-10-21 03:17:43 +03:00

4.7 KiB
Raw Blame History

План улучшения покрытия тестами (с 64% до 75-80%)

Текущая ситуация

  • Текущее покрытие: 64%
  • Всего тестов: 1385
  • Основные пробелы: Program.cs, миграции, редкие exception paths

Приоритетные области для улучшения

1. Program.cs - критично ⚠️

Проблема: Глобальный код инициализации плохо покрыт тестами

Решение:

  • Уже есть: ProgramConfigurationTests.cs и ProgramIntegrationTests.cs
  • Недостает: тесты для exception handling в главном try-catch
  • Добавить тесты для:
    • Сценария Fatal exception при старте
    • Проверки корректного вызова Log.CloseAndFlushAsync()
    • Инициализации ModelService (строка 167-168)

2. Исключить автогенерированный код из coverage

Файлы для исключения:

<PropertyGroup>
  <ExcludeByFile>**/Migrations/*.cs</ExcludeByFile>
</PropertyGroup>

Или в .coverletrc:

{
  "Exclude": [
    "[*]*.Migrations.*",
    "[*]*ModelSnapshot"
  ]
}

3. Редкие exception paths - средний приоритет 🟡

BotInfoService.cs:

  • Линии 69-79: fallback на stale cache при ошибке API
  • Строка 91-97: InvalidateCache в race condition сценариях

Health Checks:

  • Exception handling в OllamaHealthCheck
  • Timeout scenarios в TelegramBotHealthCheck

Telegram Services:

  • Edge cases в TelegramErrorHandler
  • Retry логика в TelegramMessageSender

4. Модели - низкий приоритет 🟢

Простые POCO классы с автосвойствами редко требуют тестирования, но для покрытия можно:

  • Добавить тесты на сериализацию/десериализацию
  • Проверить валидацию через FluentValidation

5. Async race conditions

  • Тесты на concurrent доступ к BotInfoService._cachedBotInfo
  • Параллельные вызовы в TelegramCommandProcessor
  • Semaphore locks в различных сервисах

Быстрые wins (можно сделать за 1-2 часа)

  1. Добавить coverlet.exclude в .csproj:
<ItemGroup>
  <AssemblyAttribute Include="System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage">
    <_Parameter1>Migrations</_Parameter1>
  </AssemblyAttribute>
</ItemGroup>
  1. Пометить автосвойства как excluded:
[ExcludeFromCodeCoverage]
public class ChatMessageEntity
{
    // ...
}
  1. Добавить 2-3 теста для Program.cs exception scenarios

  2. Покрыть fallback логику в BotInfoService

Ожидаемый результат

После реализации:

  • Целевое покрытие: 75-80%
  • Исключено из метрик: ~10% (миграции, автогенерированный код)
  • Реально покрыто: ~85% значимого кода

Команды для проверки

# Генерация отчета с детальным покрытием по файлам
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=./coverage/

# Если установлен reportgenerator
reportgenerator -reports:coverage/coverage.cobertura.xml -targetdir:coverage/report -reporttypes:Html

# Для SonarQube (как в CI)
dotnet-coverage collect "dotnet test" -f xml -o "coverage.xml"

Философия тестирования

Не нужно стремиться к 100% покрытию:

  • Миграции БД - автогенерация
  • Простые POCO - низкая ценность тестов
  • Очень редкие edge cases - cost/benefit анализ

Фокус на:

  • Business logic (ChatService, AIService)
  • Критичные пути (команды Telegram)
  • Error handling в важных сценариях

Резюме

64% - это хороший показатель для реального проекта. Основной вклад в "недостающие" 36% вносят:

  • ~10% - автогенерированный код
  • ~10% - редкие exception paths
  • ~8% - Program.cs и глобальная инициализация
  • ~8% - интерфейсы и простые модели

Оптимальная цель: 75-80% после исключения нетестируемого кода.