3,583 papers
arXiv:2610.36584 73 27 окт. 2026 г. FREE

Req2Test-Bench: тест прошёл ≠ тест проверяет то, что нужно

КЛЮЧЕВАЯ СУТЬ
Зелёная галочка у тестов от агента почти ничего не значит. У лучшей конфигурации проходят 82,8% тестов, а полноценными оказываются только 33,8%. Метод позволяет получать тесты, которые ловят поломки кода, а не просто не падают. Заранее закрой две дыры в требовании: подготовку данных и ожидаемый результат. Тогда агент перестаёт угадывать недостающее, а случайность между запусками превращается в выбор. Лучший из трёх запусков полноценен на 8,6–10,2 п.п. чаще, чем единственный.
Адаптировать под запрос
⚡

TL;DR

Исследование показывает, что прошедший тест от агента почти ничего не гарантирует. Агенты (Claude Code, Codex CLI, OpenHands, Aider) получали требование на естественном языке и писали по нему тесты к проекту. Авторы проверяли тесты искусственными поломками кода: ловит ли тест те же поломки, что и тест разработчика. Это и есть мера полноты проверки.

Главная находка: зелёная галочка обманывает. У лучшей конфигурации 82,8% тестов проходят, но полноценными оказываются только 33,8%. Остальные запускаются и не падают, но пропускают поломки: проверяют мало, подгоняют ожидание под код или обходят суть требования. Покупка модели дороже почти не помогает: цена генерации выросла в 6 и 4,9 раза, а полнота проверки сдвинулась на +5,5 и −2,5 процентных пункта.

Причина в дыре между требованием и тестом. В 90–99% неполных тестов требование не уточняло, как подготовить данные (setup) или что именно должно получиться на выходе. Агент достраивает это сам, каждый раз по-разному. Поэтому лучший из трёх запусков оказывается полноценным на 8,6–10,2 п.п. чаще, чем единственный.

📌

Схема оценки в исследовании

ВХОД АГЕНТУ:   Требование (Feature + Scenario) + сигнатуры целевых методов
               + репозиторий БЕЗ реализации проверяемого поведения
ШАГ 1: Агент пишет полный тест (часто несколько файлов)
ШАГ 2: Тест запускают на настоящем коде → «проходит / не проходит»
ШАГ 3: В код вносят мелкие поломки (мутанты) → какие из них тест ловит?
ШАГ 4: Сравнение с тестом разработчика → «ловит всё, что ловит эталон?»
ИТОГ:  Проходит ≠ полноценен (82,8% против 33,8%)
🚀

Пример применения

Выводы статьи про тесты и требования. Сильная зона: поведение описано как «дано / когда / тогда», и есть код, куда агент пишет проверки. Ниже промпт собран по формату входа из исследования с добавлением «упущенных» полей.

Задача: Вы ведёте интернет-магазин на Bitrix (или самописном бэкенде). Нужно покрыть тестами правило: «Промокод ВЕСНА10 даёт скидку 10% на заказ от 3000 ₽, не суммируется со скидкой постоянного клиента». Просите Claude Code написать тесты.

Промпт:

Ты пишешь автотесты в существующем проекте магазина. Реализацию проверяемого
правила не меняй и не смотри в неё: тесты должны проверять требование.


Промокоды в корзине



Дано: клиент с накопительной скидкой 5% и корзина на 4000 ₽
Когда: он применяет промокод ВЕСНА10
Тогда: скидка по промокоду не суммируется со скидкой клиента,
применяется большая из двух



Cart::applyPromo(string $code), Cart::getTotal(), Customer::getLoyaltyDiscount()



Данные для теста создавай через существующие фикстуры в tests/fixtures.
Если нужной фикстуры нет — перечисли, какие данные нужны, и не придумывай их молча.



Итоговая сумма: 3600 ₽ (скидка 10% как большая из двух).
Отдельно проверь граничные случаи: корзина ровно 3000 ₽ и 2999 ₽.


Сделай ТРИ независимых варианта теста с разными подходами к подготовке данных.
Для каждого варианта перечисли, какие поломки в коде он бы поймал
(например: убрали условие порога, сложили скидки, сравнение > вместо >=).
Выбери лучший вариант и объясни выбор.

Результат: Агент вернёт три варианта теста, для каждого список «какие поломки поймаем». Затем выберет один и обоснует выбор. Если фикстур не хватает, он назовёт недостающие данные вместо тихого выдумывания. Вы сразу увидите, что тест на самом деле проверяет, а не только то, что он зелёный.

🧠

Почему это работает

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

Сильная сторона. Агент хорошо пользуется заготовленным: фикстурами, помощниками, сигнатурами методов из проекта. А разные запуски дают разные тесты, и среди них находятся более полные. Эту случайность можно использовать.

Как это используется. Метод закрывает пробелы заранее: setup и ожидаемый результат прописаны явно, а лишняя случайность превращается в выбор из нескольких вариантов. Рычаги: - Число вариантов. Три в исследовании дали +8–10 п.п. Для критичных мест можно больше. - Поле . Чем точнее описаны данные, тем меньше домыслов. - Поле . Конкретные значения и границы убирают «неявные» ожидания, главную причину неполных тестов. - Список «какие поломки поймаем». Это вынуждает агента думать о проверке, а не о прохождении.

📋

Шаблон промпта

Первые четыре блока повторяют вход агента в исследовании (требование, целевые интерфейсы, контекст проекта). Блоки и — практический вывод из анализа ошибок.

Ты пишешь автотесты в существующем проекте. Не меняй код проверяемого
поведения и не подгоняй тест под текущую реализацию: тест проверяет ТРЕБОВАНИЕ.


{название_и_описание_возможности}



Дано: {исходное_состояние}
Когда: {действие}
Тогда: {наблюдаемый_результат}



{методы_и_классы_через_которые_проверяем}



{где_лежат_фикстуры_хелперы_и_как_запускать_тесты}



{какие_данные_и_состояние_подготовить; если_не_хватает — перечисли_что_нужно,
не придумывай молча}



{конкретные_значения_и_границы_что_считать_правильным}


Сделай {число_вариантов} независимых варианта теста.
Для каждого перечисли, какие поломки кода он поймает.
Выбери лучший вариант и объясни выбор.

Что подставлять: - {исходное_состояние}, {действие}, {наблюдаемый_результат} — требование по схеме «дано / когда / тогда». - {методы_и_классы_через_которые_проверяем} — публичные методы, до которых дотягивается тест. - {конкретные_значения_и_границы_что_считать_правильным} — числа, статусы, сообщения и граничные случаи. - {число_вариантов} — 3 для обычных мест, больше для критичных.

🚀 Быстрый старт — вставь в чат:

Вот шаблон запроса на генерацию тестов из требования. Адаптируй под мою задачу:
[опиши, какое поведение нужно проверить и в каком проекте].
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит про исходные данные, точные ожидаемые значения и границы, потому что именно эти пробелы исследование назвало причиной неполных тестов. Она возьмёт структуру из шаблона и соберёт готовый запрос.

⚠️

Ограничения

⚠️ Узкая область: Исследование проверяло только генерацию тестов из требований в формате BDD (Gherkin) в 8 проектах. Для других типов задач прямого подтверждения нет.

⚠️ Эталон — тест разработчика: «Полный» тест здесь означает «ловит всё, что ловит тест разработчика». Эталон мог быть неидеальным, а мера строгая.

⚠️ Лучший из трёх — потенциал, а не готовый приём: Авторы показали, что выбор из нескольких вариантов помогает, но не дали рабочей схемы выбора. Чтобы выбрать лучший, нужен отдельный сигнал качества, например запуск с поломками кода.

⚠️ Явные Setup и ExpectedOutcome в шаблоне — вывод из анализа ошибок: Прямого эксперимента «до и после уточнения требований» в доступном тексте нет. Проверьте эффект на своих задачах.

⚠️ Настройка проверки: Чтобы реально ловить поломки кода, нужен инструмент мутационного тестирования или ручная работа.

🔍

Как исследовали

Исследователи собрали 5 086 задач из 8 реальных открытых проектов на 5 языках с 4 BDD-фреймворками. В этих проектах требования уже записаны по схеме «дано / когда / тогда», и к каждому есть тест разработчика. Агенту давали требование, список целевых методов и репозиторий без реализации проверяемого поведения (в жёстком варианте вообще без всей реализации). Агент должен был написать полный тест, нередко из нескольких файлов.

Дальше шла проверка. Тест запускали на настоящем коде, а потом на копиях кода с мелкими поломками: подмена > на >=, удаление вызова, замена возвращаемого значения. Всего 11 типов поломок. Смотрели, ловит ли сгенерированный тест те же поломки, что и тест разработчика.

Проверили 8 конфигураций: четыре агента (Aider, OpenHands, Claude Code, Codex CLI), четыре модели, разная глубина рассуждений. Удивило то, что дорогая модель не выигрывает. Переход от GPT-6 Luna к DeepSeek-V4.1-Flash и затем к GPT-6 Sol удорожал генерацию в 6 и 4,9 раза, а полнота проверки менялась 28,3% → 33,8% → 31,3%.

Разбор неполных, но проходящих тестов показал: в 90–99% случаев требование оставляло setup неясным или ожидаемый результат неявным. Агент добирал недостающее сам, и разные запуски давали разное. Отсюда третий вывод: лучший из трёх запусков полноценен на 8,6–10,2 п.п. чаще, чем один.

💡

Адаптации и экстраполяции

Это мои идеи, не выводы статьи.

🔧 Техника: добавить «проверку на поломках» вручную → проверка качества без инструментов

После того как агент написал тест, попросите его сломать свой код:

Теперь внеси в проверяемый код 5 мелких поломок (замени > на >=, убери условие,
поменяй константу, удали вызов) по одной, запусти тест на каждой и покажи таблицу:
поломка → тест упал или нет. Для непойманных поломок допиши проверки.

Это упрощённая версия мутационной оценки из статьи. Она ловит тесты, которые «проходят, но ничего не проверяют».

🔧 Техника: переписать требование в виде «дано / когда / тогда» → меньше дыр

Если требование написано свободным текстом, сначала попросите модель переписать его в этом формате и перечислить, чего не хватает (данные, ожидаемые значения). Затем закройте пробелы сами и только потом генерируйте тесты.

🔗

Ресурсы

  • Benchmarking LLM Agents for Behaviorally Adequate Test Generation from Software Requirements
  • Авторы: Binhang Qi, Yiming Liu, Yun Lin, Yangjie Zhou, Hailong Sun, Jin Song Dong
  • Организации: National University of Singapore; Shanghai Jiao Tong University; Shanghai Innovation Institute; Beihang University
  • Код, данные и лидерборд Req2Test-Bench опубликованы авторами (ссылка в списке литературы [32])
  • Связанные работы: E2EDev, GivenWhenThen, AutoGlue, DevBench, SWT-Bench

📋 Дайджест исследования

Ключевая суть

Зелёная галочка у тестов от агента почти ничего не значит. У лучшей конфигурации проходят 82,8% тестов, а полноценными оказываются только 33,8%. Метод позволяет получать тесты, которые ловят поломки кода, а не просто не падают. Заранее закрой две дыры в требовании: подготовку данных и ожидаемый результат. Тогда агент перестаёт угадывать недостающее, а случайность между запусками превращается в выбор. Лучший из трёх запусков полноценен на 8,6–10,2 п.п. чаще, чем единственный.

Принцип работы

Авторы проверяли тесты не запуском, а искусственными поломками кода (мутантами). В код вносят мелкие баги и смотрят, какие из них тест ловит. Потом сравнивают с тестом разработчика. Тест хорош не тогда, когда он прошёл, а когда он упал на сломанном коде. Отсюда цепочка для твоего промпта: требование → подготовка данных → ожидаемый результат → три варианта теста → список поломок, которые каждый вариант поймает. Это как экзамен, где студент не только пишет ответ, но и объясняет, какие ошибки он бы заметил. Агенту приходится думать о проверке, а не о том, как бы пройти.

Почему работает

Требование обычно молчит про две вещи: какие данные завести и что считать правильным. В 90–99% неполных тестов дело именно в этом. Агент достраивает пробел сам и каждый раз по-разному. Если требование молчит, агент берёт самое простое ожидание, и такой тест легко проходит, хотя проверяет почти ничего. Жесть: модель дороже обходится в 6 и 4,9 раза, а полнота проверки меняется на +5,5 и −2,5 п.п. Платить за «умность» бессмысленно, пока дыра в требовании не закрыта. Сильная сторона агента в другом. Он хорошо пользуется заготовленным: заготовками данных (фикстурами), помощниками и сигнатурами методов из проекта. А разные запуски дают разные тесты, и среди них встречаются более полные.

Когда применять

Тестирование → автотесты по требованиям в формате «дано / когда / тогда» (BDD) → особенно когда в проекте уже есть заготовки данных и код, куда агент пишет проверки. Лучше всего для правил с порогами, деньгами и исключениями: скидки, права доступа, расчёты. НЕ подходит для других задач: исследование проверяло только генерацию тестов из BDD-требований в 8 проектах. Без инструмента мутационного тестирования (или ручной порчи кода) выбрать лучший вариант будет нечем.

Мини-рецепт

1. Опиши требование: «дано / когда / тогда», одно правило на один сценарий
2. Назови методы: Cart::applyPromo, Cart::getTotal
3. Закрой подготовку данных: укажи, где лежат заготовки данных. Добавь: «если чего-то нет, перечисли и не придумывай молча»
4. Впиши ожидаемый результат: конкретные числа и границы, например ровно 3000 и 2999
5. Попроси три варианта: независимых, с разным подходом к данным. К каждому список «какие поломки поймаем»
6. Проверь сам: сломай код руками (убери условие порога, смени > на >=) или запусти мутационное тестирование. Выживший баг означает слабый тест

Примеры

[ПЛОХО] : Напиши тесты для промокодов в корзине
[ХОРОШО] : Ты пишешь автотесты в проекте магазина. Не подгоняй тест под реализацию, проверяй требование. Дано: клиент со скидкой 5% и корзина на 4000 ₽. Когда: применяет промокод ВЕСНА10. Тогда: скидки не суммируются, берётся большая. Данные бери из tests/fixtures, чего нет — перечисли и не придумывай. Ожидаемая сумма: 3600 ₽. Проверь границы: корзина 3000 ₽ и 2999 ₽. Сделай три независимых варианта теста. Для каждого перечисли, какие поломки он поймает. Выбери лучший и объясни почему. Разница в том, что во втором случае агент не может молча выдумать данные и ожидаемую сумму. А список «какие поломки поймаем» сразу показывает, что тест проверяет на самом деле, а не только то, что он зелёный.
Источник: Benchmarking LLM Agents for Behaviorally Adequate Test Generation from Software Requirements
ArXiv ID: 2610.36584 | Сгенерировано: 2026-10-28 13:20

Проблемы LLM

ПроблемаСутьКак обойти
Проверки от модели проходят, но почти ничего не проверяютПросишь модель написать проверки по описанию: тесты, критерии приёмки, валидаторы. Они запускаются, всё зелёное. Но многие поломки в коде они пропускают. Причина в том, что описание молчит про исходные данные или точный ожидаемый результат. Модель достраивает это сама и берёт простое. Простая проверка легко проходит. Зелёный результат создаёт ложную уверенность, что всё покрыто.Не считай «прошло» мерой качества. Ломай код слегка: убери условие, замени > на >=. Смотри, падает ли проверка. В запросе пропиши исходные данные, точные значения и границы. Добавь: «если данных не хватает, перечисли их и не придумывай молча».
📖 Простыми словами

Benchmarking LLM Agents for Behaviorally Adequate Test Generation from Software Requirements

arXiv: 2610.36584

Зелёный тест от нейросети — это полный самообман. Популярные агенты вроде Claude Code или Aider бодро генерируют проверки по требованиям, и они моментально проходят. Проблема в механике: если в ТЗ есть пробелы, модель додумывает контекст от балды. Она молча подставляет удобные данные, при которых код гарантированно не упадёт. В итоге функция формально проверена, а реальной пользы ноль — получается просто белый шум из ассертов.

Это как нанять пожарного инспектора, который заходит в здание, нюхает воздух со словами "сейчас же не горит?" и ставит штамп «безопасно». Тест завершается успехом не потому, что софт безупречен, а потому что агент задал коду слишком удобный вопрос. Система рапортует о полной готовности, хотя любая скрытая мина остаётся на месте и только ждёт первого реального пользователя.

Авторы исследования доказали это через мутационное тестирование: они намеренно вносили поломки в код и смотрели, заметит ли их сетка. Итог предсказуем: тесты живых разработчиков поломки ловят, а тесты агентов — пропускают искусственные баги. Нейросеть даёт вменяемый результат только при жесткой структуре «дано / когда / тогда», когда каждый шаг расписан до мелочей и модели просто негде дофантазировать логику за тебя.

Проверяли генерацию тестов, но этот принцип универсален для всех LLM. Как только в задаче появляется двусмысленность, агент идёт по пути наименьшего сопротивления. Модель не пойдёт задавать уточняющие вопросы — она молча достроит требования так, чтобы выдать красивый отчёт без ошибок. AI оптимизирует не надежность кода, а галочку выполнения.

Короче: если агент радостно рапортует о сотне пройденных проверок, не расслабляйся — тебя надули. Хочешь нормальный результат — скармливай требования по строгому BDD-формату и обязательно валидируй сгенерированные тесты мутациями. Иначе ты скормишь проекту липовую зеленую полоску, которая развалится при первом же нестандартном чихе в проде.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с