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