Метрики тестирования: от зелёного теста к честной приборной панели
Сцена · приборная панель набора
Менеджер спрашивает: “у нас тесты хорошие?” Плохой ответ это одна цифра: “покрытие 92 процента”. Мы уже знаем, чего стоит эта цифра в одиночку: coverage обманывает, агенту легко нагнать зелёного. Хороший ответ это приборная панель: несколько метрик в динамике, каждая отвечает на свой вопрос о наборе.
Это финал серии. Сквозная интрига “зелёный тест не значит хороший тест” разрешается здесь окончательно: мы заменяем веру в зелёное на набор честных метрик и встраиваем их в CI как ворота, которые объективно судят каждый PR. Не пожелание на ревью, а блокер мерджа.
Карта урока · что заберёшь
- соберёшь приборную панель из пяти метрик, каждая со своим вопросом;
- поймёшь, какие пороги осмысленны, а какие вредны;
- встроишь coverage-gate и mutation-gate в CI как блокеры мерджа;
- увидишь, как карантин остаётся видимым, не блокируя PR.
Раздел 1 · какие метрики и какие пороги
Идея словами
Одна метрика всегда обманывает, потому что её легко накрутить, не улучшив набор. Пять метрик вместе врать не могут: каждая закрывает слепое пятно другой. Coverage говорит, что исполнено, mutation score говорит, что проверено, flaky rate говорит, можно ли верить, время говорит, успеешь ли получить обратную связь, доля карантина говорит, сколько долгов.
Шаг 1 · пять метрик, пять вопросов
метрика | отвечает на вопрос | как читать
────────────────┼─────────────────────────────────────┼──────────────────────────
coverage | какие строки вообще исполнялись? | как тренд, не как цель
mutation score | а проверилось ли поведение? | реальный порог качества
flaky rate | можно ли верить красному? | сигнал доверия, цель ноль
время прогона | успею ли получить обратную связь? | бюджет, не оптимум
доля карантина | сколько отложенных долгов? | растёт это тревога
Ключевая пара это coverage и mutation score рядом. Coverage 100 при mutation score 40 это диагноз: строки исполнены, поведение не проверено, набор декоративный. Coverage 80 при mutation score 78 честнее: меньше исполнено, но почти всё исполненное реально проверено.
Шаг 2 · какие пороги осмысленны
Порог это не “чем выше, тем лучше”. Вредные пороги плодят пустые тесты:
- coverage как “не падай ниже тренда”, а не “всегда 100”. Порог 100 заставляет писать тесты на геттеры и тавтологии ради цифры, ровно антипаттерн из урока 04;
- mutation score как реальный порог качества: вот тут высокая планка осмысленна, потому что score нельзя накрутить пустым тестом. В
stryker.conf.jsonKassa этоbreak: 70, ниже мердж блокируется; - flaky rate с целью ноль: любой устойчивый flaky это сигнал чинить, не порог “допустимо 5 процентов”;
- время как бюджет обратной связи: не “быстрее любой ценой”, а “уложись в N минут, чтобы цикл правки оставался коротким”.
Пороги Stryker уже заданы в конфиге домена:
// packages/ledger/stryker.conf.json
{
"thresholds": {
"high": 90,
"low": 80,
"break": 70
}
}
break: 70 это блокер: mutation score ниже 70 валит прогон. high/low это только цвета отчёта. Порог по mutation честнее coverage-порога именно потому, что его не обойти зелёным мусором.
Задача · панель по журналу прогона
Панель это не магия отчёта, а несколько честных подсчётов над журналом. Собери их сам и заодно реши, где карантину место, а где он только смазывает картину.
Что взять с собой
- одна метрика обманывает, пять вместе нет; читай coverage и mutation score в паре;
- coverage как тренд, mutation score как реальный порог, flaky rate с целью ноль, время как бюджет;
- высокая планка осмысленна по mutation score, вредна по coverage.
дальше после входа
Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.
Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.