Записи архитектурных решений для ИИ-фреймворка автоматизации тестирования
Updated Jul 2026
ADR-001: Агентно-управляемое vs традиционное выполнение тестов
Контекст
Традиционные тестовые фреймворки (Selenium, Playwright, Cypress) выполняют тесты как детерминированные скрипты. ИИ-агенты вносят недетерминированные рассуждения в цикл выполнения тестов.
Решение
Использовать модель агент-как-оркестратор: ИИ-агент читает определения тестов (на естественном языке или структурированные), решает, как взаимодействовать с приложением, и сообщает результаты. Фреймворк предоставляет инструменты (vibe-check CLI), но агент определяет стратегию выполнения.
Последствия
- (+) Тесты более устойчивы — агент может рассуждать о неожиданных состояниях
- (+) Определения тестов могут быть более высокоуровневыми («проверить, что логин работает») вместо пошаговых
- (+) Самовосстановление: когда селекторы ломаются, агент может найти альтернативы
- (-) Недетерминированность — один и тот же тест может выполняться по-разному каждый раз
- (-) Сложнее отлаживать — рассуждения агента непрозрачны по сравнению с построчными скриптами
- (-) Медленнее на тест, чем детерминированное выполнение
Смягчение
- Логировать каждую команду агента (для воспроизводимости)
- Скриншот при каждом изменении состояния (для отладки)
- Устанавливать детерминированные тайм-ауты (предотвращать бесконечные циклы)
- Резервное переключение на детерминированные скрипты для критических путей
ADR-002: CLI-навык как основной интерфейс к браузеру
Контекст
Мы оценили три подхода:
- MCP-сервер Playwright (структурированные инструменты, деревья доступности)
- Навык vibe-check от Vibium (CLI-команды через Bash)
- Прямая клиентская библиотека Playwright/Vibium
Решение
Использовать CLI-навык vibe-check как основной интерфейс, с Playwright MCP доступным как резерв для обнаружения страницы.
Обоснование
| Критерий | MCP | Skill | Библиотека |
|---|---|---|---|
| Стоимость токенов за шаг | ~5 000 | ~130 | Н/Д (не используется агентом) |
| Интеграция с агентом | Нативная | Через инструмент Bash | Требует генерации кода |
| Сложность настройки | Средняя | Низкая | Высокая |
| Понимание страницы | Богатое | Только текст | Программное |
| Совместимость с CI | Да | Да | Да |
Подход через навык оставляет 98% контекста для рассуждений, обеспечивая при этом все необходимые браузерные взаимодействия.
Последствия
- (+) В 29 раз ниже стоимость токенов, чем MCP
- (+) Простая настройка (одна команда
npx skills add) - (+) Компонуемость с другими CLI-инструментами
- (-) Нет структурированного понимания страницы (только текст/скриншоты)
- (-) Требует знания CSS-селекторов
- (-) Менее богатый контекст ошибок, чем MCP
ADR-003: Формат определения тестов
Контекст
Тесты должны быть определены в формате, который агент может прочитать и выполнить. Варианты:
- Описания на естественном языке
- Gherkin (Given/When/Then)
- Структурированный YAML/JSON
- Гибрид (структурированный с шагами на естественном языке)
Решение
Использовать структурированный YAML с шагами на естественном языке:
test: Login with valid credentials
preconditions:
- User "test@example.com" exists with password "secret123"
steps:
- Navigate to the login page
- Enter email "test@example.com"
- Enter password "secret123"
- Click the login button
- Verify the dashboard loads with welcome message
expected:
- Dashboard page is displayed
- Welcome message contains "test@example.com"
selectors: # Необязательные подсказки для агента
login_page: https://app.example.com/login
email_input: "input[name=email]"
password_input: "input[name=password]"
submit_button: "button[type=submit]"
welcome_message: ".welcome-msg"
Обоснование
- Шаги на естественном языке дают агенту свободу адаптации
- Структурированный формат позволяет программное управление тестами
- Необязательные подсказки по селекторам ускоряют выполнение, когда доступны
- Агент может игнорировать подсказки и обнаруживать селекторы самостоятельно, если они устарели
ADR-004: Режим Daemon для разработки, Oneshot для CI
Контекст
Vibium поддерживает режим daemon (постоянный браузер) и режим oneshot (новый браузер для каждой команды).
Решение
- Разработка/локально: Режим daemon для скорости (~100 мс на команду vs ~2 с)
- CI/CD: Режим oneshot с
--headlessдля изоляции
Конфигурация
# Разработка
export VIBIUM_MODE=daemon
# CI
export VIBIUM_ONESHOT=1
export VIBIUM_HEADLESS=1
Последствия
- (+) Быстрая обратная связь во время разработки
- (+) Чистая изоляция в CI
- (-) Возможна утечка состояния в режиме daemon (смягчается явной очисткой между тестами)
ADR-005: Отладка через скриншоты
Контекст
Когда тест не проходит, агенту нужно понять, что пошло не так. Варианты:
- HTML-дамп страницы
- Скриншот
- Снимок дерева доступности
- Всё вышеперечисленное
Решение
Сохранять скриншот + текст страницы при каждом сбое. HTML-дамп — по запросу.
# При сбое агент выполняет:
vibe-check screenshot -o "failures/${TEST_NAME}_$(date +%s).png"
vibe-check text > "failures/${TEST_NAME}_$(date +%s).txt"
vibe-check url >> "failures/${TEST_NAME}_$(date +%s).txt"
Обоснование
- Скриншоты предоставляют визуальный контекст для людей, проверяющих сбои
- Текст страницы предоставляет семантический контекст для рассуждений агента
- HTML-дампы редко нужны, но доступны через
vibe-check html - Все три варианта дёшевы (без накладных расходов MCP)
ADR-006: Стратегия восстановления после ошибок
Контекст
Когда команда не срабатывает (селектор не найден, тайм-аут и т.д.), агенту нужна стратегия.
Решение
Трёхуровневое восстановление:
Уровень 1: Интеллектуальный повтор (рассуждения агента)
Агент: vibe-check click ".btn-submit" → TIMEOUT
Агент: "Кнопка отправки не найдена. Давайте исследуем."
Агент: vibe-check find-all "button" → список всех кнопок
Агент: vibe-check text "button" → читает текст кнопок
Агент: "Нашёл кнопку с текстом 'Submit'. Пробую другой селектор."
Агент: vibe-check click "button:has-text('Submit')" → УСПЕХ
Уровень 2: Анализ скриншотов
Агент: vibe-check screenshot -o debug.png
Агент: *анализирует скриншот*
Агент: "Вижу спиннер загрузки. Страница ещё не загрузилась."
Агент: vibe-check wait ".spinner" --state hidden --timeout 60000
Агент: vibe-check click ".btn-submit" → УСПЕХ
Уровень 3: Резерв MCP (если доступен)
Агент: "CLI-подход не сработал. Переключаюсь на MCP для глубокого анализа страницы."
Агент: browser_snapshot() → дерево доступности
Агент: *находит элемент через семантический анализ*
Агент: "Нашёл элемент. Он скрыт за модальным окном. Нужно сначала закрыть модальное окно."
Последствия
- (+) Большинство сбоев разрешается на уровне 1 (дёшево)
- (+) Уровень 2 обеспечивает визуальную отладку даже для автоматических запусков
- (+) Уровень 3 даёт страховку для сложных сценариев
- (-) Многоуровневое восстановление добавляет задержку при сбоях
ADR-007: Отчётность о результатах тестов
Контекст
Результаты тестов должны быть понятны:
- ИИ-агенту (для рассуждений о прошёл/не прошёл)
- Разработчикам (для отладки)
- CI-системам (для ворот прошёл/не прошёл)
Решение
Три формата вывода:
Консольный вывод (для CI):
PASS login_valid_credentials (2.3s)
PASS login_invalid_password (1.8s)
FAIL login_expired_account (5.1s) — Expected "Account expired", got "Welcome"
PASS signup_new_user (3.2s)
4 tests: 3 passed, 1 failed
JSON-отчёт (для программной обработки):
{
"suite": "authentication",
"tests": [
{
"name": "login_valid_credentials",
"status": "pass",
"duration_ms": 2300,
"commands": ["navigate", "type", "type", "click", "wait", "text"],
"screenshots": ["login_step1.png", "login_result.png"]
}
]
}
Артефакты сбоев (для отладки):
failures/
├── login_expired_account/
│ ├── screenshot.png
│ ├── page_text.txt
│ ├── page_url.txt
│ └── agent_reasoning.md
ADR-008: Параллельное выполнение тестов
Контекст
Последовательный запуск тестов медленный. Но браузерные тесты имеют проблемы общего состояния.
Решение
- Последовательно по умолчанию (режим daemon, общий браузер)
- Параллельно через oneshot (каждый тест получает свой экземпляр браузера)
- Лимит параллельности: Соответствовать доступным ядрам CPU (каждый экземпляр Chrome использует ~200 МБ RAM + 1 ядро)
# Параллельное выполнение (4 рабочих)
cat test_list.txt | xargs -P4 -I{} bash -c '
VIBIUM_ONESHOT=1 run_test "{}"
'
Ограничения
- Каждый параллельный рабочий нуждается в собственном экземпляре Chrome (~200 МБ RAM)
- 8-ядерная CI-машина: максимум ~6 параллельных рабочих (оставить 2 ядра для ОС + агента)
- Тесты, ограниченные сетью, могут не выиграть от параллелизма