fix covverage
All checks were successful
SonarQube / Build and analyze (push) Successful in 3m33s

This commit is contained in:
Leonid Pershin
2025-10-21 03:17:43 +03:00
parent 2a26e84100
commit b8fc79992a
8 changed files with 837 additions and 0 deletions

127
CoverageImprovementPlan.md Normal file
View File

@@ -0,0 +1,127 @@
# План улучшения покрытия тестами (с 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%** после исключения нетестируемого кода.