Skip to content
...

AI-агенты

AI-агенты хорошо пишут тесты на Testo и так же хорошо переписывают на него существующие тесты с других фреймворков.

Самый быстрый путь к первому тесту — установить пакет (см. Начало работы) и попросить агента написать или мигрировать тесты, скормив ему ссылку на llms-full.txt (см. ниже).

Как агенты читают документацию Testo

Документация Testo публикуется в формате llms.txt — это один машиночитаемый файл, который AI загружает вместо того, чтобы парсить HTML-страницы.

ФайлСодержимоеКогда использовать
/llms.txtСписок страниц с кратким описанием и лучшими практиками.Быстрый обзор доступной документации.
/llms-full.txtПолный текст всех страниц документации.Когда агенту нужен полный контекст для генерации кода.

Скиллы для агентов

Помимо llms.txt, у Testo есть набор AI-скиллов — коротких инструкций, которые агент (Claude Code, Codex и другие) подхватывает по триггерам, когда видит подходящую задачу. Они покрывают написание тестов, миграцию с других фреймворков, параметризацию, бенчмарки, покрытие и другие сценарии. Полный список — в папке skills/.

Грубо говоря, llms.txt рассказывает агенту, что есть в API, а скилл — когда что применять и где грабли. При срабатывании скилл сам отправляет агента читать llms.txt за уточнениями, поэтому документация не дублируется и скиллы не протухают вместе с API.

Установка через Composer-плагин

Чтобы каждый раз вручную не копировать скиллы из vendor/testo/testo/skills/ в место, где их видит ваш агент (.claude/skills/, .cursor/skills/ и т. п.), есть отдельный пакет llm/skills — он сам раскладывает скиллы из доверенных Composer-зависимостей:

bash
composer require --dev llm/skills

После установки composer skills:update копирует скиллы в .agents/skills/ (путь настраивается через extra.skills.target в composer.json). Testo является доверенным поставщиком скиллов, так что никаких дополнительных настроек не нужно. А чтобы их подхватил конкретный агент, добавьте в extra.skills.aliases нужный путь — например, .claude/skills для Claude Code:

json
{
    "extra": {
        "skills": {
            "aliases": [".claude/skills", ".cursor/skills"],
            "auto-sync": true
        }
    }
}

На этих путях плагин создаст ссылки (junction на Windows, symlink на POSIX) на основную папку — один и тот же набор скиллов будет виден всем агентам без дублирования файлов.

Типичный сценарий

Одни и те же три шага работают и для написания тестов с нуля, и для переноса существующего набора:

  1. Передайте контекст. Укажите агенту на llms-full.txt или вставьте нужный раздел документации.
  2. Опишите задачу. Дайте класс или функцию, которые нужно покрыть тестами, либо вставьте старый тест, который нужно конвертировать.
  3. Проверьте и запустите. Просмотрите результат и запустите vendor/bin/testo.

Примеры промптов

Написание тестов с нуля:

Documentation: https://php-testo.github.io/llms-full.txt

Using the Testo PHP testing framework, write tests for the following class:

{вставьте ваш класс сюда}

Миграция с других фреймворков:

Documentation: https://php-testo.github.io/llms-full.txt

Rewrite the tests in the following folder to Testo. Keep the same assertions and data providers,
do not invent extra scenarios.

Tests folder: tests/Unit

Claude Code

Claude Code умеет загружать URL прямо во время диалога. Добавьте инструкцию в CLAUDE.md вашего проекта:

markdown
When writing PHP tests, use the Testo framework.
Fetch the documentation before writing tests: https://php-testo.github.io/llms-full.txt

Claude Code прочитает эту инструкцию и сам подтянет документацию, когда нужно будет сгенерировать или мигрировать тесты.

Cursor, Windsurf и другие

AI-редакторы кода позволяют зарегистрировать внешнюю документацию как контекст. Обычно URL добавляют один раз, а затем ссылаются на него в чате.

  • Cursor: добавьте URL через Settings → Features → Docs → Add new doc. После индексации обращайтесь к нему в чате через @Docs → выберите Testo.
  • Windsurf: вставьте URL прямо в сообщение Cascade.

В IDE, которые не поддерживают индексацию URL, вставьте содержимое llms-full.txt прямо в чат как контекст.