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

128 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# План улучшения покрытия тестами (с 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
<PropertyGroup>
<ExcludeByFile>**/Migrations/*.cs</ExcludeByFile>
</PropertyGroup>
```
Или в `.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
<ItemGroup>
<AssemblyAttribute Include="System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage">
<_Parameter1>Migrations</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
```
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%** после исключения нетестируемого кода.