Какие требования к покрытию кода тестами (code coverage) вы встречали на практике?

«Какие требования к покрытию кода тестами (code coverage) вы встречали на практике?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Требования варьируются в зависимости от критичности модуля и зрелости проекта. Типичный диапазон — от 70% до 90%.

  • Критичные модули (платежи, ядро бизнес-логики): 90%+.
  • Стандартные сервисы: 80-85%.
  • Вспомогательные или унаследованные модули: 70-80%.

Пример для сервиса с требованием 85%:

public class PaymentService {
    public boolean processPayment(double amount) {
        if (amount <= 0) {
            throw new IllegalArgumentException("Amount must be positive");
        }
        // Основная логика обработки платежа
        return paymentGateway.charge(amount);
    }
}

Для достижения покрытия потребуются тесты:

@Test
void processPayment_positiveAmount_returnsTrue() { ... }

@Test
void processPayment_zeroAmount_throwsException() {
    assertThrows(IllegalArgumentException.class, 
                 () -> service.processPayment(0.0));
}

@Test
void processPayment_negativeAmount_throwsException() { ... }

Ключевые аспекты и инструменты:

  • Измерение: Используются инструменты вроде JaCoCo (для Java) или Istanbul (для JS). Они интегрируются в сборку (Maven/Gradle) и CI/CD.
  • Качество vs. Количество: 100% покрытие не гарантирует отсутствие багов. Важны смысловые тесты на граничные случаи, а не тесты для геттеров/сеттеров.
  • CI/CD проверка: В пайплайне часто стоит gate, который не позволяет смержить PR, если покрытие падает ниже заданного порога.
  • Отчеты: Результаты coverage публикуются в виде отчетов (HTML), чтобы команда видела непокрытые ветви кода (branch coverage).