128 lines
4.7 KiB
Markdown
128 lines
4.7 KiB
Markdown
# План улучшения покрытия тестами (с 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%** после исключения нетестируемого кода.
|