Игорь Градов
Игорь Градов
7 мин
ai

ИИ в тестировании пишет «зелёные пустышки»: как за 15 минут отсеять ложные проверки

Компания или спикер, названные в источнике: Сергей Прощаев, Tech Lead, преподаватель ОТУС. Источник описывает конкретную проблему с ИИ-генерацией тестов на Java и разбирает четыре характерных теста. Это how-to по формату.

ИИ в тестировании пишет «зелёные пустышки»: как за 15 минут отсеять ложные проверки

Автотесты от ИИ проходят с покрытием 100%, но пропускают баги в продакшене: Сергей Прощаев, Tech Lead в финтехе и преподаватель ОТУС, разбирает на четырёх примерах Java-кода, как отличить настоящую проверку от зелёной пустышки.

Почему это важно

ИИ-агенты (программы, которые сами пишут код по вашему описанию) генерируют десятки тестов за минуты, но часть из них проходит при любом поведении кода и не способна обнаружить ни одного дефекта. Зелёный пайплайн (автоматическая сборка, где все проверки «горят» зелёным) создаёт ложную уверенность, а баг вылезает уже в продакшене.

Проблема знакома каждому, кто хотя бы раз просил ИИ написать юнит-тесты. Сергей Прощаев, Tech Lead и руководитель направления Java/Kotlin-разработки в финтехе и электронной коммерции, преподаватель курсов разработки и архитектуры в ОТУС, описывает типичную ситуацию: вы отдали класс ИИ-агенту, получили больше сорока тест-методов, покрытие по строкам показало 100%, CI (система непрерывной интеграции, автоматически проверяющая код перед слиянием) доволен. Но часть тестов бесполезна, а некоторые закрепляют неправильную логику.

Ниже разберём, как за несколько минут на ревью отсеять пустышки от реальных проверок. Все примеры на Java, но принцип работает для любого языка.

Что понадобится

  • Любая IDE с поддержкой Java (IntelliJ IDEA, Eclipse, VS Code с плагином)
  • JUnit 5 (фреймворк для юнит-тестирования на Java)
  • Класс с бизнес-логикой, на который ИИ уже сгенерировал тесты
  • 15-20 минут на разбор и практику

Как проверять ИИ-тесты: пошаговая инструкция

  1. Задайте ИИ-агенту задачу на генерацию тестов. Опишите класс и метод, который нужно покрыть. Для примера возьмём сервис скидок: если сумма заказа больше 100, скидка 10%; если товаров больше 5, скидка 5%. Правила не суммируются: применяется только большая.
public class DiscountService {
    private static final BigDecimal THRESHOLD = new BigDecimal("100");
    private static final BigDecimal RATE_LARGE_SUM = new BigDecimal("0.10");
    private static final BigDecimal RATE_MANY_ITEMS = new BigDecimal("0.05");

    public BigDecimal applyDiscount(BigDecimal total, int itemCount) {
        if (total == null) {
            throw new IllegalArgumentException("total is null");
        }
        BigDecimal discount = BigDecimal.ZERO;
        if (total.compareTo(THRESHOLD) > 0) {
            discount = RATE_LARGE_SUM;
        }
        if (itemCount > 5 && discount.compareTo(RATE_MANY_ITEMS) < 0) {
            discount = RATE_MANY_ITEMS;
        }
        return total.subtract(total.multiply(discount));
    }
}
  1. Получите тесты и не смотрите на статус. ИИ выдаст десятки методов, все зелёные. Главная ловушка: одобрить набор, доверившись зелёному статусу, не разобрав, что именно проверяет каждый assert (утверждение, которое должно «упасть» при неправильном результате).

  2. Задайте каждому тесту один вопрос: если я сломаю логику метода, этот тест упадёт? Тест, который проходит при любом поведении кода, не различает правильный и неправильный результат. Он добавляет стоимость поддержки и ложную уверенность, не более.

  3. Проверьте тест на «пустой assert». Вот характерный пример пустышки:

@Test
void testApplyDiscount() {
    BigDecimal result = discountService.applyDiscount(
        new BigDecimal("200"), 3);
    assertNotNull(result);
}

Единственная проверка тут assertNotNull(result). Она пройдёт при любом ненулевом результате: неправильная скидка, нулевая скидка, отрицательное число. Для бизнес-логики это имитация проверки, а не сама проверка. При этом assertNotNull не зло сам по себе: для фабрик, методов с Optional, создания сессий он законен. Проблема в том, что здесь это единственный assert.

  1. Проверьте, не дублирует ли тест саму логику метода. Второй частый паттерн:
@Test
void testDiscountForLargeOrder() {
    BigDecimal total = new BigDecimal("200");
    int itemCount = 3;
    BigDecimal expected = total.subtract(
        total.multiply(new BigDecimal("0.10")));
    BigDecimal result = discountService.applyDiscount(total, itemCount);
    assertEquals(expected, result);
}

На первый взгляд тест выглядит правильно: есть assertEquals, есть конкретные числа. Но expected вычисляется по той же формуле, что и сам метод. Если в методе ошибка в расчёте, тест повторит её и останется зелёным. Ожидаемое значение должно быть жёстко зашито числом, а не пересчитано.

  1. Проверьте граничные значения на точность ожидания. Третий тест:
@Test
void testDiscountBoundary() {
    BigDecimal result = discountService.applyDiscount(
        new BigDecimal("100"), 3);
    assertEquals(new BigDecimal("100"), result);
}

Сумма ровно 100, товаров 3. По логике класса скидка не применяется (порог строго больше 100). Тест ожидает 100 и проходит. Этот тест полезнее предыдущих двух: он проверяет граничное условие с жёстко зашитым значением. Но при ревью стоит убедиться, что рядом есть тест на 100.01, иначе пограничный случай покрыт только с одной стороны.

  1. Проверьте, не тестирует ли assert несуществующую логику. Четвёртый тест:
@Test
void testBothDiscountsApply() {
    BigDecimal total = new BigDecimal("200");
    int itemCount = 10;
    BigDecimal expected = total.subtract(
        total.multiply(new BigDecimal("0.15")));
    BigDecimal result = discountService.applyDiscount(total, itemCount);
    assertEquals(expected, result);
}

По спецификации скидки не суммируются: применяется только большая. Но тест ожидает скидку 15% (10% + 5%). Этот тест не просто бесполезен. Он закрепляет неправильную логику. Если тест зелёный, значит, метод содержит баг. Если красный, ИИ-агент сгенерировал тест, который противоречит спецификации. В обоих случаях без знания бизнес-правил вы этого не увидите.

  1. Сформулируйте правило для будущих ревью. Перед апрувом каждого ИИ-теста проверяйте три вещи:
  2. Assert проверяет конкретное жёстко зашитое значение, а не пересчитанное по той же формуле
  3. Тест способен упасть при реалистичной поломке логики
  4. Ожидаемый результат соответствует спецификации, а не поведению кода «как есть»
Как это применить

Допустим, вы попросили ИИ-агента написать тесты на метод расчёта доставки. Агент выдал 35 тестов, все зелёные. Вы открываете первый и видите assertTrue(result >= 0). Стоп: доставка стоит 500 рублей, а тест пройдёт и при 0, и при 1, и при миллиона. Вы меняете assert на assertEquals(new BigDecimal("500"), result) для конкретных входных данных. Второй тест вычисляет expected через ту же формулу, что и метод. Вы заменяете вычисление на готовое число, посчитанное вручную. Третий тест ожидает бесплатную доставку для заказа от 5000 рублей, но по спецификации порог 3000. Вы фиксируете баг: либо в коде, либо в тесте. За 10 минут ревью из 35 тестов осталось 20 рабочих, зато каждый из них действительно поймает поломку.

Частые ошибки

Доверие зелёному дашборду. Покрытие 100% по строкам означает, что каждая строка выполнилась хотя бы раз. Оно ничего не говорит о том, что проверяют assert-ы. Десять пустых assertNotNull дадут 100% покрытия и ноль защиты.

Апрув без чтения assert-ов. Ревьюеры часто смотрят на имена тестов и статус, не открывая тело метода. ИИ генерирует осмысленные имена (testDiscountForLargeOrder), но содержание может не соответствовать названию.

Пересчёт expected по формуле из кода. Если тест повторяет логику метода для вычисления ожидаемого значения, он проверяет тождество, а не корректность. Жёстко зашитое число, посчитанное вручную или взятое из спецификации, надёжнее.

Игнорирование бизнес-правил. ИИ не читал вашу спецификацию. Он угадывает логику по коду. Если код содержит баг, ИИ «закрепит» баг тестом. Только человек, знающий правила, поймёт, что ожидаемый результат неверен.

Что с этого вам прямо сейчас?

Разработчику, который использует ИИ в тестировании. После каждой генерации тестов пройдите по чек-листу из шага 8. Это занимает 10-15 минут на 30-40 тестов и отсеивает до половины пустышек. В проде будет меньше сюрпризов.

Автору Дзена, который пишет про технологии. Тема ИИ в тестировании актуальна для аудитории разработчиков. Разборы конкретных ловушек с примерами кода собирают вовлечение лучше, чем общие рассуждения о «пользе нейросетей».

Тимлиду и руководителю. Добавьте в чек-лист код-ревью пункт о проверке assert-ов в ИИ-сгенерированных тестах. По опыту Сергея Прощаева, такие тесты попадаются на ревью буквально каждую неделю.

Начинающему разработчику. Навык, который вы тренируете, разбирая эти четыре теста, называется «критическое чтение тестов». Он отделяет человека, который умеет работать с ИИ-агентом, от человека, который принимает любой результат.

Мнение редакции dzen.guru

По моим наблюдениям, проблема ложных зелёных тестов будет только нарастать. Чем лучше ИИ-агенты генерируют код, тем убедительнее выглядят их тесты и тем сложнее заметить пустышку. Парадокс: ИИ в тестировании экономит время на написание, но требует больше времени на ревью.

Совет: заведите себе привычку после генерации тестов мысленно «ломать» метод и проверять, какие тесты при этом упадут. Если ни один не падает, покрытие врёт. Это занимает пять минут и спасает от багов, которые потом ищутся часами. Честная оговорка: ИИ-агенты быстро учатся, и через полгода часть описанных ловушек они могут перестать допускать. Но навык критического чтения тестов останется с вами при любом инструменте.

Попробуйте генерацию контента с dzen.guru

Если вы пишете про технологии и разработку, проверьте, как наши инструменты помогают структурировать экспертные разборы для аудитории Дзена.

Попробовать

Главный вывод из разбора Сергея Прощаева: зелёный пайплайн не гарантия качества, а лишь сигнал, что код выполнился. Настоящая защита начинается с вопроса, который ИИ пока не задаёт сам: «А что будет, если я сломаю этот метод?». Пока вы задаёте этот вопрос за него, ваш код в безопасности.

Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

Нейросети и безопасность: как собрать ИИ-песочницу для анализа вредоносов на Linux
ai

Нейросети и безопасность: как собрать ИИ-песочницу для анализа вредоносов на Linux

Вот практический гайд, который поможет вам собрать собственную песочницу для анализа вредоносного ПО с помощью ИИ-ассистента на Linux, снять с заражённой…

7 мин
ai

От Высшей школы экономики до OpenAI: искусственный интеллект разрушает рынок, который должен обслуживать

Почему это важно Триллионные оценки ИИ-компаний требуют замены живого труда в масштабах всей экономики, и экономисты уже описали механизм, при котором массовая…

6 мин
Нейросеть для генерации карточек для маркетплейсов: 71% готовы с первой попытки
ai

Нейросеть для генерации карточек для маркетплейсов: 71% готовы с первой попытки

Карточки товаров для маркетплейсов отнимают у селлеров вечера и выходные, но сервис banan.wtf показал на своих данных, как нейросеть для генерации карточек для…

5 мин