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

ИИ для тестирования кода: контракты поведения ловят баги, где юнит-тесты бессильны

Разработчик игрового сервера на PHP и Symfony рассказал, как выстроил систему проверки кода, который пишет ИИ-помощник, через текстовые контракты поведения вместо классических юнит-тестов.

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

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

Автор ведёт дневник разработки авторитарного сервера для 2D MMO RPG с 2022 года. Сервер на PHP и Symfony, клиент на Unity. С определённого момента игровую механику описывает словами, а собирает её ИИ. Вопрос «как понять, что собранное работает» встал сразу и потребовал нового подхода к тестированию.

Суть проблемы: игровой сервер почти целиком состоит из взаимодействий, а не из чистых функций. Моб не должен уходить за границу своей зоны. Персонаж после перехода должен появиться в нужной клетке соседней карты, а не в стене. Исход живёт в ответе работающего сервера, в разметке страницы и в кадре игры. Записать его обычным ассертом (проверочным утверждением в коде, которое сравнивает ожидаемый результат с фактическим) невозможно.

Именно здесь ИИ для тестирования кода работает не как генератор тестов, а как агент-проверщик, который прогоняет контракты по живому серверу.

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

  • ИИ-помощник для написания кода: ChatGPT, Claude или другой, который генерирует код по описанию на естественном языке
  • ИИ-агент (программа, которая сама выполняет цепочку действий без ручного контроля) для прогона контрактов: автор использует агентный режим, где агент поднимает состояние, шлёт команды серверу и сверяет ответы
  • Текстовый редактор для написания спек (контрактов поведения)
  • Работающий сервер или стенд, на котором агент проверяет поведение
  • Время: написание одной спеки занимает минуты, настройка конвейера проверки потребует от нескольких часов до пары дней в зависимости от проекта

Пошаговая инструкция

  1. Определите, что юнит-тесты не покрывают. Выпишите поведение, где результат зависит от взаимодействия компонентов, от ответа живого сервера или от визуального состояния. Это кандидаты для контрактов.

  2. Напишите спеку как текстовый файл. Спека не содержит кода. Это короткое описание механики, условия прогона и таблица из трёх колонок: что дано, какое действие, какого исхода вы ждёте. Формат заголовка:

--- 
name: sandbox-test-zone-leash 
description: "Контракт зоны-привязи: моб-враг держится дома" 
runner: prompt 
---
  1. Добавьте инвариант в конец спеки. Инвариант объясняет, ради чего механика существует и что считать нарушением, а что мелочью. Это не тест, а граница допустимого. Автор подчёркивает: инвариант важнее самой таблицы.

  2. Привяжите спеку к файлам проекта. Укажите в спеке список файлов: код механики, сервис, шаблон страницы, клиентский скрипт. Когда правка затрагивает любой из этих файлов, контракт автоматически подъезжает в контекст работы ИИ-помощника.

  3. Настройте прогон через агента. Агент читает спеку, поднимает предусловия, проходит по таблице строка за строкой и сводит результат в три исхода: сошлось, не сошлось, проверить не удалось. Третий исход обязательно отделяйте от провала: «стенд не готов» это не нарушение контракта.

  4. Запустите конвейер ревью для поиска того, что не описано. Скрипт запускает пачку агентов параллельно, каждому даётся своё измерение: дубли значений и логики, обход дефекта вместо исправления в источнике, паритет операций между фронтами, огораживание ввода. Каждую находку сразу отправляйте агенту-скептику, который должен назвать конкретный сценарий вреда или опровергнуть находку.

const GROUPS = [
  { key: "core", dims: [
    "ЕДИНЫЙ ИСТОЧНИК: дубли значений и логики",
    "ROOT-FIX: обход дефекта вместо фикса в источнике",
  ]},
  { key: "boundary", dims: [
    "ПАРИТЕТ ФРОНТОВ: операция есть в одном месте, отсутствует в другом",
    "ОГОРАЖИВАНИЕ ВВОДА: справочное значение принимается свободным текстом",
  ]},
]
  1. Синтезируйте результат. Подтверждённые находки собираются в реестр по важности. Неподтверждённые отбрасываются. Реестр становится основой для следующего цикла правок.
Как это применить

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

Предпоследняя и последняя строки таблицы проверяют аварийный откат на радиус, когда зона не размечена. Именно эти случаи ИИ ломает при рефакторинге (переработке существующего кода): механика вроде работает, а аварийный откат тихо перестал срабатывать, и мобы на картах без размеченных зон разбредаются по всему миру.

Строка в таблице контракта стоит дешевле, чем поимка такого бага через месяц.

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

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

Забыть про инвариант. Таблица без инварианта превращается в чеклист, который не объясняет, что считать критичным нарушением. Агент-проверщик без этого контекста не отличит мелочь от катастрофы.

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

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

Что делать с этим прямо сейчас?

Автору Дзена или копирайтеру. Если вы используете ChatGPT или Claude для генерации скриптов автоматизации (парсеры, боты, обработчики данных), попробуйте описать ожидаемое поведение в текстовом файле до генерации кода. Даже без полного конвейера: простая таблица «дано, действие, ожидаемый исход» спасает от молчаливых поломок при следующем запросе «перепиши вот это».

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

В России доступны все описанные инструменты. Claude и ChatGPT работают через VPN или API. Из отечественных ИИ-помощников для кода можно пробовать GigaCode от Сбера, хотя агентный режим прогона контрактов потребует дополнительной настройки.

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

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

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

Научитесь использовать ИИ для контента системно

В dzen.guru мы разбираем практические приёмы работы с нейросетями для авторов и предпринимателей

Попробовать dzen.guru

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

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

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

Комментарии

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

Что такое ИИ-агент: стек от PydanticAI до MCP, который спрашивают на собеседованиях
ai

Что такое ИИ-агент: стек от PydanticAI до MCP, который спрашивают на собеседованиях

Материал описывает не инвестиционную сделку, а обзор технологического стека для агентных инженеров. Архетип «funding» здесь не применим напрямую: в источнике…

5 мин
Что такое ИИ-агент для трассировки: MCP и OpenTelemetry закрыли разрыв в отладке
ai

Что такое ИИ-агент для трассировки: MCP и OpenTelemetry закрыли разрыв в отладке

Разработчики, которые уже подключают ИИ-агентов к внешним сервисам через MCP (Model Context Protocol, протокол взаимодействия приложений с инструментами и…

6 мин
Airbnb использует ИИ для ускорения разработки
ai

Airbnb использует ИИ для ускорения разработки

Почему это важно Airbnb впервые раскрыла конкретные цифры: ИИ сократил путь от идеи до готовой функции на 60%, а бот техподдержки закрывает почти половину…

5 мин