Перейти к основному содержимому

AI-тесты: качество, покрытие, доверие (как мерить на самом деле)

· 7 мин. чтения
Artur Pan
CTO & Co-Founder at PanDev

Copilot написал 420 тестов для модуля платежей за два дня. Coverage прыгнул с 58% до 84%. Уверенность в релизе? Без изменений, а то и хуже. Исследование 2024 IEEE (An Empirical Study on the Usage of Transformer Models for Code Completion, Ciniselli et al.) показало: LLM-сгенерированные тесты компилируются в 92% случаев, но ловят лишь 58-62% инъектированных мутаций — стандартный исследовательский тест на «этот тест вообще что-то проверяет». Человеческие тесты в том же исследовании — 78%. Разрыв ~20 процентных пунктов в mutation score — реальная история качества AI-тестов, а не цифра coverage, которую все репортят.

Эта статья измеряет, в чём AI-тесты хороши, что они пропускают, и как выстроить pipeline, чтобы AI давал throughput, не разъедая уверенность в релизе.

{/* truncate */}

Почему coverage врёт на AI-тестах

Coverage считает выполненные строки. Тест, который выполняет строку и ничего не ассёртит, — тоже считается. LLM делают ровно этот паттерн: expect(result).toBeDefined() над функцией, возвращающей сложный domain-объект; assert.doesNotThrow() вокруг сетевого вызова; или тесты, которые мокают всё, а потом ассёртят моки. Тест зелёный, coverage badge растёт, баг всё равно доезжает до прода.

Mutation testing ловит это. Инструмент мутаций (PIT для Java, Stryker для JS/TS, mutmut для Python) делает небольшие изменения в production-коде — меняет < на <=, убирает null check и т.д. Хороший suite падает, когда мутация происходит; слабый — проходит. Процент пойманных мутаций — mutation score, и это ближе всего к ground-truth сигналу качества, что у нас есть.

Наш датасет

  • 100+ B2B компаний на PanDev Metrics, из них 38 с измеряемым внедрением AI-ассистентов в 2024-2026
  • IDE heartbeat с тегированием сессий как AI-assisted vs solo (по паттерну keystroke + телеметрии расширений)
  • Внешний бенчмарк: Ciniselli et al. 2024 (IEEE), Microsoft Research 2023 Copilot test-gen study, SmartBear 2025 State of Testing survey
  • Период: production IDE-телеметрия с января 2024 по начало 2026

Mutation testing на клиентском коде мы не гоняем. Цифры mutation score в статье — из опубликованных академических бенчмарков и от трёх команд нашего датасета, поделившихся своими Stryker-показателями. Относитесь к таблицам mutation score как к направлению, валидированному внешними бенчмарками.

Что показывают данные

AI-тесты vs человеческие, по mutation score

ИсточникМедианный mutation scoreТипичный диапазонImpact на coverage
Человек (senior инженер)78%70-85%Умеренный
Copilot (default prompt)62%55-68%Большой
Cursor Composer58%48-65%Большой
ChatGPT (туда-сюда)54%42-62%Нестабильный
Human review + AI-assisted правки74%68-82%Средний

Форма находки согласуется с Ciniselli et al. 2024: AI производит больше тестов, которые покрывают больше строк, но качество per-test значимо ниже. Чистая AI-генерация закрывает coverage-разрыв и открывает mutation-score разрыв.

Сравнение mutation score: человек 78%, Copilot 62%, Cursor 58%, ChatGPT 54%. Тот самый разрыв, который coverage метрика прячет. AI-тесты проходят планку «он запускается», многие проваливают «он ловит баги».

Где AI-тесты чаще валятся

Четыре паттерна отказа повторяются. Мы видим их в post-incident ретро у команд, которые катнули AI-тесты без review:

Паттерн отказаКак выглядитЧастота в AI-тестах
Ассёрт на моки, не на поведениеТолько expect(mockFn).toHaveBeenCalled()~34%
Тавтологические ассёртыexpect(result).toBeDefined() без проверки значения~22%
Только happy pathНет null / empty / error case~41%
Тест описывает код, а не требование«вызывает computeTax с amount» вместо «применяет налог CA 8.5% к subtotal»~55%

SmartBear State of Testing 2025 опросил 1,400 QA и инженеров. 74% используют AI test generation; только 28% сказали, что команда измеряет качество (а не только coverage) AI-тестов. Разрыв между adoption и измерением — реальная история.

Coverage vs mutation score на уровне команды

Наш датасет показывает отчётливый паттерн, когда команда переходит 30% AI-авторства тестов:

AI-assisted %Типичное изменение coverageТипичное изменение mutation scoreТренд bug escape
0-15%СтабильноСтабильноСтабильно
15-30%+8-12 п.п.Плоско или -2 п.п.Стабильно
30-50%+15-20 п.п.-5 до -8 п.п.+12-18% больше escapes
50%++25 п.п.-10 до -14 п.п.+25-35% больше escapes

Неочевидная находка: команды, максимизировавшие AI test generation, катнули БОЛЬШЕ багов за 3 месяца после внедрения, не меньше, несмотря на более высокий coverage. Уверенность в релизе, измеренная как внутренний вопрос «задеплоим ли в пятницу после обеда», упала на 20+ п.п.

Heatmap: bug-escape rate AI-assisted команды по неделям после adoption — ярче = выше escape. По 12 командам, которые мы отслеживали после adoption: паттерн escape-rate усиливается к 4-8 неделе, сразу после того, как AI-тесты достигают критической массы в suite.

Что меняется при обязательном review на AI-тестах

Один протокол возвращает большую часть потерянного mutation score: каждый AI-сгенерированный тест проходит обязательное человеческое review ДО merge, не после.

ПротоколМедианный mutation scoreСкорость (тестов/неделю)Тренд bug escape
Без AI (baseline)78%1.0×Baseline
Только AI, без review60%2.6×+22% escapes
AI-authored + human review74%2.1×-3% escapes
AI предлагает, человек переписывает76%1.8×-8% escapes

Последняя строка интересна. Команды, которые относятся к AI как к test-design suggestion, а не к test-writer, приходят к качеству уровня человека И сохраняют выигрыш в throughput. Внутреннее Copilot-исследование Microsoft Research 2023 — тот же вывод: код лучшего качества при AI-вовлечённости создавали инженеры, которые давали AI drafting и потом переписывали, а не принимали AI-вывод as-is.

Что это значит для инженерных лидеров

1. Перестаньте использовать coverage как метрику качества AI-тестов

Coverage говорит, что тест запустился, а не что он что-то ловит. Переключайтесь на mutation score для любого suite со значимой долей AI-авторства. Stryker (JS/TS), PIT (Java) и mutmut (Python) интегрируются в CI. Цена: обычно 5-10 минут CI-времени на PR в репо среднего размера.

2. Review AI-тестов — merge-гейт

Запишите в ваш code review checklist. Если PR содержит AI-тесты, они ревьюятся с той же дисциплиной, что и production-код. 15 минут на PR окупается первым же пойманным тавтологическим ассёртом в тесте биллинга.

3. Трекайте долю AI-assisted кодинга по проектам, не по людям

AI adoption никогда не равномерен. Команда, активно использующая Cursor на frontend-монорепо, может минимально использовать AI на legacy-бэкенде. Наша IDE heartbeat телеметрия поднимает это на уровне проекта — по session-level keystroke-паттернам и presence расширений мы выводим AI-assisted долю по проекту. Команды используют это, чтобы таргетить инвестиции в review-протокол туда, где payoff максимален.

4. Ждите ~3-месячный провал, потом восстановление

Команды, инвестирующие в review-дисциплину и трекинг mutation score, проходят провал качества в месяц 1-3 и выходят вперёд к 6-му. Команды без инвестиций застревают в провале. Это согласуется с нашим AI copilot effect исследованием — Cursor-пользователи кодят на 65% больше, но сырой объём без контроля качества даёт net-negative у некоторых команд.

Методология

AI-assisted сессии мы видим через IDE heartbeat: когда расширение Copilot, Cursor или Continue активно в сессии AND паттерн keystroke-bursts соответствует AI-assisted вводу (длинные paste-like правки + короткие typing-bursts), сессия тегируется. Тег вероятностный, не окончательный — precision классификации мы оцениваем в 82%, кросс-валидация — две клиентские команды, которые инструментировали свои расширения явно.

Mutation-score цифры:

  • Ciniselli et al. 2024 IEEE — академический бенчмарк
  • Три клиентских команды, прогнавших Stryker/PIT и поделившихся aggregate результатами
  • SmartBear State of Testing 2025 — находка «adopt, но не измеряют»
  • Microsoft Research 2023 внутреннее Copilot-исследование — паттерн «AI предлагает, человек переписывает»

Честное ограничение

Мы не видим mutation score в большинстве клиентских данных — мы видим coverage, долю AI-assisted времени и escape-rate через incident-линки. Mutation-score разрыв в таблицах опирается на академический бенчмарк + трёх команд с самоотчётом. Критическому читателю стоит относиться к процентам mutation score как к хорошо направленным, но не к переписи; к соотношению (coverage вверх, mutation score вниз, escape-rate вверх после порога) — как к защищаемому утверждению, а к конкретным процентам — как к ballpark.

Финальный аргумент

Coverage — ложь, когда тесты пишет AI. Mutation score тоже не идеален, но это ближайшее к ground-truth качества, что у нас есть. Команды, выигрывающие AI-testing-переход, делают три вещи: мерят mutation score, ревьюят AI-тесты как production-артефакт, используют AI как design-suggestion-механизм, а не как test-writer. 30%-разрыв в качестве — не про то, что AI плохой; это про то, что дефолтный workflow неревьюен.

Связанные статьи

Попробуйте сами — бесплатно

Подключите IDE-плагин за 2 минуты и увидьте свои реальные метрики. Без карты, без обязательств.

Попробовать бесплатно