This commit is contained in:
127
CoverageImprovementPlan.md
Normal file
127
CoverageImprovementPlan.md
Normal 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%** после исключения нетестируемого кода.
|
||||
Reference in New Issue
Block a user