# План улучшения покрытия тестами (с 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 **Файлы для исключения**: ```xml **/Migrations/*.cs ``` Или в `.coverletrc`: ```json { "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**: ```xml <_Parameter1>Migrations ``` 2. **Пометить автосвойства как excluded**: ```csharp [ExcludeFromCodeCoverage] public class ChatMessageEntity { // ... } ``` 3. **Добавить 2-3 теста для Program.cs exception scenarios** 4. **Покрыть fallback логику в BotInfoService** ## Ожидаемый результат После реализации: - **Целевое покрытие**: 75-80% - **Исключено из метрик**: ~10% (миграции, автогенерированный код) - **Реально покрыто**: ~85% значимого кода ## Команды для проверки ```bash # Генерация отчета с детальным покрытием по файлам 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%** после исключения нетестируемого кода.