Какой уровень покрытия тестами ты обычно достигаешь?
Что проверяют
Как вы относитесь к покрытию в .NET-проекте: как к цели или как к сигналу. Интервьюеру важно, умеете ли вы объяснить свою цифру и отличить полезные тесты от тестов ради метрики. Следом обычно спрашивают, как покрытие считается у вас в CI и что вы исключаете.
Как отвечать
Начните с реальной цифры и того, что за ней стоит, затем каркас:
- инструменты: чаще всего coverlet. Пакет
coverlet.collectorи запускdotnet test --collect:"XPlat Code Coverage"дают отчёт в формате Cobertura, ReportGenerator превращает его в HTML и сводку для PR. Альтернативы:dotnet-coverageи dotCover в Rider; - метрики: coverlet считает строки, ветвления и методы. Ветвления честнее, особенно в коде с
switch,?.и сопоставлением с образцом; - порог:
coverlet.msbuildумеет валить сборку через свойствоThreshold, но полезнее следить за покрытием изменений в PR, чтобы метрика не проседала; - что исключать: сгенерированный код, миграции EF Core, DTO без логики,
Program.cs. Для этого атрибут[ExcludeFromCodeCoverage]или фильтры в настройках coverlet; - разные тесты: доменная логика и сервисы почти полностью покрыты unit-тестами на xUnit, NUnit или MSTest. API и работа с базой проверяются интеграционными тестами через
WebApplicationFactory<TProgram>и Testcontainers, они тоже попадают в отчёт; - качество: Stryker.NET мутирует код и показывает, какие изменения тесты не заметили. Это лучший ответ на вопрос, чего стоят ваши тесты.
Честная формулировка может звучать так: «По доменному слою около 90 процентов, в целом около 70, потому что инфраструктуру мы проверяем интеграционными тестами». Цифры подставьте свои.
Где спотыкаются
Отвечают «80 процентов» и не могут сказать, по строкам это или по ветвлениям и что исключено из отчёта.
Прячут в [ExcludeFromCodeCoverage] сложные классы, которые не хочется тестировать, чтобы отчёт выглядел красиво. Исключают код без логики, а не неудобный.
Пишут тесты на моках всего подряд, где проверяется только то, что один метод вызвал другой. Покрытие растёт, а настоящую ошибку такие тесты не ловят.