Какое процентное покрытие кода тестами считается оптимальным в разработке?

Ответ

Оптимальным считается 70–80% покрытия кода модульными (unit) тестами.

Почему не 100%?

  • Стремление к 100% часто приводит к написанию бесполезных тестов для тривиального кода (геттеры, сеттеры, простые toString()), что увеличивает стоимость поддержки.
  • Фокус должен быть на качестве тестов, а не на метрике. Лучше иметь 70% содержательных тестов, чем 100% формальных.

Пример разумного подхода:

// Этот метод содержит бизнес-логику — его нужно тестировать.
public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

// А этот тривиальный метод — нет необходимости.
@Override
public String toString() {
    return "Calculator";
}

Важно: Высокое покрытие не гарантирует отсутствия дефектов. Критическую логику следует покрывать интеграционными и end-to-end тестами.

Ответ 18+ 🔞

А, ну это классика, блядь! Опять про эти проценты покрытия заговорили. Слушай, как будто вчера родился — все эти цифры, они же с потолка взяты, ёпта!

Так вот, оптимально, говорят, 70–80% покрытия юнит-тестами. А ты что, думал, дохуя надо? Нет, блядь, не дохуя. Потому что если гнаться за соткой, то получается пиздец, а не разработка.

А че не 100%, спросишь? Да потому что, сука, начнёшь тестировать всякую хуйню! Вот смотри: геттер написал, сеттер, какой-нибудь toString() простыню — и давай на него тесты городить! А оно надо? Нет, блядь, не надо! Ты только время тратишь, а потом эту писанину ещё и поддерживать заебёшься. Фокус должен быть на качестве, а не на том, чтобы циферку в отчёте натянуть, как сову на глобус. Лучше пусть будет 70% нормальных, вменяемых тестов, чем 100% ерунды, от которой толку — как от козла молока.

Вот, смотри, пример, чтобы не быть голословным:

// Вот это — да, бизнес-логика, её тестировать надо, тут без вариантов.
public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

// А это что за хуйня? Тривиальный метод. На него тесты писать — себя не уважать.
@Override
public String toString() {
    return "Calculator";
}

И главное, запомни раз и навсегда, чувак: высокий процент покрытия — это не волшебная таблетка, ёбана! Он не гарантирует, что багов не будет. Это как смотреть на спидометр и думать, что машина не сломается. Для критической логики нужны ещё и интеграционные тесты, и end-to-end — вот тогда уже можно спать спокойно, а не трястись над одной метрикой.