Тестирование
В OpenClaw есть три набора Vitest (unit/integration, e2e, live) и небольшой набор Docker-раннеров. Этот документ — руководство «как мы тестируем»:- Что покрывает каждый набор (и что он намеренно не покрывает)
- Какие команды запускать для типичных рабочих процессов (локально, перед push, отладка)
- Как live‑тесты находят учётные данные и выбирают модели/провайдеров
- Как добавлять регрессии для реальных проблем моделей/провайдеров
Быстрый старт
В большинстве случаев:- Полный gate (ожидается перед push):
pnpm build && pnpm check && pnpm test
- Gate покрытия:
pnpm test:coverage - Набор E2E:
pnpm test:e2e
- Live‑набор (модели + проверки инструментов/изображений шлюза Gateway):
pnpm test:live
Наборы тестов (что где запускается)
Думайте о наборах как об «увеличении реализма» (и увеличении флак‑ности/стоимости):Unit / integration (по умолчанию)
- Команда:
pnpm test - Конфигурация:
scripts/test-parallel.mjs(запускаетvitest.unit.config.ts,vitest.extensions.config.ts,vitest.gateway.config.ts) - Файлы:
src/**/*.test.ts - Область:
- Чистые unit‑тесты
- Интеграционные тесты в одном процессе (аутентификация шлюза Gateway, маршрутизация, инструменты, парсинг, конфиг)
- Детерминированные регрессии для известных багов
- Ожидания:
- Запускается в CI
- Реальные ключи не требуются
- Должно быть быстро и стабильно
- Примечание о пулах:
- OpenClaw использует Vitest
vmForksна Node 22/23 для более быстрой параллелизации unit‑тестов. - В Node 24+ OpenClaw автоматически переключается на обычные
forks, чтобы избежать ошибок связывания VM в Node (ERR_VM_MODULE_LINK_FAILURE/module is already linked). - Переопределите вручную с помощью
OPENCLAW_TEST_VM_FORKS=0(принудительноforks) илиOPENCLAW_TEST_VM_FORKS=1(принудительноvmForks).
- OpenClaw использует Vitest
E2E (smoke шлюза Gateway)
- Команда:
pnpm test:e2e - Конфиг:
vitest.e2e.config.ts - Файлы:
src/**/*.e2e.test.ts - Параметры по умолчанию во время выполнения:
- Использует Vitest
vmForksдля более быстрого запуска файлов. - Использует адаптивное количество воркеров (CI: 2–4, локально: 4–8).
- По умолчанию запускается в тихом режиме для снижения нагрузки на консольный ввод‑вывод.
- Использует Vitest
- Полезные переопределения:
OPENCLAW_E2E_WORKERS=<n>— принудительно задать количество воркеров (не более 16).OPENCLAW_E2E_VERBOSE=1— снова включить подробный вывод в консоль.
- Область:
- End‑to‑end поведение шлюза Gateway с несколькими инстансами
- Поверхности WebSocket/HTTP, сопряжение узлов и более тяжёлый сетевой слой
- Ожидания:
- Запускается в CI (когда включено в пайплайне)
- Реальные ключи не требуются
- Больше движущихся частей, чем в unit‑тестах (может быть медленнее)
Live (реальные провайдеры + реальные модели)
- Команда:
pnpm test:live - Конфиг:
vitest.live.config.ts - Файлы:
src/**/*.live.test.ts - По умолчанию: включено через
pnpm test:live(устанавливаетOPENCLAW_LIVE_TEST=1) - Область:
- «Работает ли этот провайдер/модель сегодня с реальными кредами?»
- Ловит изменения форматов провайдеров, особенности tool‑calling, проблемы аутентификации и поведение rate limit
- Ожидания:
- По определению нестабильно для CI (реальные сети, реальные политики провайдеров, квоты, сбои)
- Стоит денег / использует лимиты
- Предпочтительно запускать узкие подмножества, а не «всё»
- Live‑запуски будут читать
~/.profile, чтобы подобрать недостающие API‑ключи - Ротация ключей Anthropic: задайте
OPENCLAW_LIVE_ANTHROPIC_KEYS="sk-...,sk-..."(илиOPENCLAW_LIVE_ANTHROPIC_KEY=sk-...) либо несколько переменныхANTHROPIC_API_KEY*; тесты будут повторять попытки при rate limit
Какой номер я должен работать?
Используйте эту таблицу решений:- Правите логику/тесты: запускайте
pnpm test(иpnpm test:coverage, если изменений много) - Трогаете сетевое взаимодействие шлюза Gateway / WS‑протокол / сопряжение: добавьте
pnpm test:e2e - Отладка «мой бот не работает» / провайдер‑специфичные сбои / tool‑calling: запускайте суженный
pnpm test:live
Live: smoke моделей (ключи профилей)
Live‑тесты разделены на два слоя, чтобы изолировать сбои:- «Прямая модель» показывает, что провайдер/модель вообще отвечает с данным ключом.
- «Smoke шлюза Gateway» показывает, что весь конвейер gateway+agent работает для этой модели (сеансы, история, инструменты, политика sandbox и т. д.).
Слой 1: прямое завершение модели (без шлюза)
- Тест:
src/agents/models.profiles.live.test.ts - Цель:
- Перечислить обнаруженные модели
- Использовать
getApiKeyForModelдля выбора моделей, для которых есть креды - Запустить небольшое завершение для каждой модели (и целевые регрессии при необходимости)
- Как включить:
pnpm test:live(илиOPENCLAW_LIVE_TEST=1при прямом запуске Vitest)
- Установите
OPENCLAW_LIVE_MODELS=modern(илиall, алиас для modern), чтобы реально запустить этот набор; иначе он пропускается, чтобы держатьpnpm test:liveсфокусированным на smoke шлюза Gateway - Как выбрать модели:
OPENCLAW_LIVE_MODELS=modernдля запуска modern allowlist (Opus/Sonnet/Haiku 4.5, GPT‑5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.1, Grok 4)OPENCLAW_LIVE_MODELS=all— алиас для modern allowlist- или
OPENCLAW_LIVE_MODELS="openai/gpt-5.2,anthropic/claude-opus-4-6,..."(comma allowlist)
- Как выбрать провайдеров:
OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"(comma allowlist)
- Откуда берутся ключи:
- По умолчанию: хранилище профилей и env‑fallback
- Установите
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, чтобы принудительно использовать только хранилище профилей
- Зачем это нужно:
- Отделяет «API провайдера сломан / ключ недействителен» от «сломан конвейер агента шлюза Gateway»
- Содержит небольшие, изолированные регрессии (пример: воспроизведение reasoning и потоки tool‑call в OpenAI Responses/Codex Responses)
Слой 2: Gateway + dev‑агент smoke (то, что реально делает «@openclaw»)
- Тест:
src/gateway/gateway-models.profiles.live.test.ts - Цель:
- Поднять шлюз Gateway в одном процессе
- Создать/пропатчить сеанс
agent:dev:*(переопределение модели на запуск) - Пройтись по моделям с ключами и проверить:
- «осмысленный» ответ (без инструментов)
- реальный вызов инструмента (probe чтения)
- дополнительные probes инструментов (exec+read)
- регрессионные пути OpenAI (только tool‑call → follow‑up) продолжают работать
- Детали probes (чтобы быстро объяснять сбои):
- probe
read: тест записывает файл‑nonce в рабочее пространство и просит агентаreadего и вернуть nonce. - probe
exec+read: тест просит агентаexec‑записать nonce во временный файл, затемreadего. - image probe: тест прикрепляет сгенерированный PNG (кот + рандомный код) и ожидает, что модель вернёт
cat <CODE>. - Ссылка на реализацию:
src/gateway/gateway-models.profiles.live.test.tsиsrc/gateway/live-image-probe.ts.
- probe
- Как включить:
pnpm test:live(илиOPENCLAW_LIVE_TEST=1при прямом запуске Vitest)
- Как выбрать модели:
- По умолчанию: modern allowlist (Opus/Sonnet/Haiku 4.5, GPT‑5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.1, Grok 4)
OPENCLAW_LIVE_GATEWAY_MODELS=all— алиас для modern allowlist- Или установите
OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"(или список через запятую) для сужения
- Как выбрать провайдеров (избегайте «OpenRouter всё подряд»):
OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"(comma allowlist)
- Probes инструментов и изображений всегда включены в этом live‑тесте:
- probe
read+ probeexec+read(стресс инструментов) - image probe запускается, когда модель заявляет поддержку ввода изображений
- Поток (высокий уровень):
- Тест генерирует крошечный PNG с «CAT» + случайным кодом (
src/gateway/live-image-probe.ts) - Отправляет его через
agentattachments: [{ mimeType: "image/png", content: "<base64>" }] - Шлюз Gateway парсит вложения в
images[](src/gateway/server-methods/agent.ts+src/gateway/chat-attachments.ts) - Встроенный агент отправляет мультимодальное пользовательское сообщение модели
- Проверка: ответ содержит
cat+ код (допускаются небольшие ошибки OCR)
- Тест генерирует крошечный PNG с «CAT» + случайным кодом (
- probe
provider/model), выполните:
Live: smoke setup‑token Anthropic
- Тест:
src/agents/anthropic.setup-token.live.test.ts - Цель: проверить, что setup‑token Claude Code CLI (или вставленный профиль setup‑token) может выполнить запрос Anthropic.
- Включение:
pnpm test:live(илиOPENCLAW_LIVE_TEST=1при прямом запуске Vitest)OPENCLAW_LIVE_SETUP_TOKEN=1
- Источники токена (выберите один):
- Профиль:
OPENCLAW_LIVE_SETUP_TOKEN_PROFILE=anthropic:setup-token-test - Сырой токен:
OPENCLAW_LIVE_SETUP_TOKEN_VALUE=sk-ant-oat01-...
- Профиль:
- Переопределение модели (необязательно):
OPENCLAW_LIVE_SETUP_TOKEN_MODEL=anthropic/claude-opus-4-6
Live: smoke backend CLI (Claude Code CLI или другие локальные CLI)
- Тест:
src/gateway/gateway-cli-backend.live.test.ts - Цель: проверить конвейер Gateway + агент, используя локальный backend CLI, не затрагивая ваш конфиг по умолчанию.
- Включение:
pnpm test:live(илиOPENCLAW_LIVE_TEST=1при прямом запуске Vitest)OPENCLAW_LIVE_CLI_BACKEND=1
- Значения по умолчанию:
- Модель:
claude-cli/claude-sonnet-4-5 - Команда:
claude - Аргументы:
["-p","--output-format","json","--dangerously-skip-permissions"]
- Модель:
- Переопределения (необязательно):
OPENCLAW_LIVE_CLI_BACKEND_MODEL="claude-cli/claude-opus-4-6"OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.3-codex"OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/claude"OPENCLAW_LIVE_CLI_BACKEND_ARGS='["-p","--output-format","json","--permission-mode","bypassPermissions"]'OPENCLAW_LIVE_CLI_BACKEND_CLEAR_ENV='["ANTHROPIC_API_KEY","ANTHROPIC_API_KEY_OLD"]'OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1для отправки реального изображения (пути внедряются в prompt).OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"для передачи путей к изображениям как аргументов CLI вместо внедрения в prompt.OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"(или"list") для управления тем, как передаются аргументы изображений, когда заданIMAGE_ARG.OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1для отправки второго шага и проверки потока возобновления.
OPENCLAW_LIVE_CLI_BACKEND_DISABLE_MCP_CONFIG=0— оставить MCP‑конфиг Claude Code CLI включённым (по умолчанию MCP‑конфиг отключается временным пустым файлом).
Рекомендуемые live‑рецепты
Узкие, явные allowlist‑ы — самые быстрые и наименее флак‑ные:-
Одна модель, напрямую (без шлюза):
OPENCLAW_LIVE_MODELS="openai/gpt-5.2" pnpm test:live src/agents/models.profiles.live.test.ts
-
Одна модель, smoke шлюза Gateway:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Tool‑calling у нескольких провайдеров:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,zai/glm-4.7,minimax/minimax-m2.1" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Фокус на Google (ключ Gemini API + Antigravity):
- Gemini (API‑ключ):
OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts - Antigravity (OAuth):
OPENCLAW_LIVE_GATEWAY_MODELS="google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-pro-high" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
- Gemini (API‑ключ):
google/...использует Gemini API (API‑ключ).google-antigravity/...использует OAuth‑мост Antigravity (endpoint агента в стиле Cloud Code Assist).google-gemini-cli/...использует локальный Gemini CLI на вашей машине (отдельная аутентификация + особенности инструментов).- Gemini API vs Gemini CLI:
- API: OpenClaw вызывает размещённый Google Gemini API по HTTP (API‑ключ / аутентификация профиля); именно это большинство пользователей подразумевает под «Gemini».
- CLI: OpenClaw вызывает локальный бинарник
gemini; у него своя аутентификация и возможны отличия в поведении (streaming/поддержка инструментов/расхождения версий).
Live: матрица моделей (что мы покрываем)
Фиксированного «CI‑списка моделей» нет (live — opt‑in), но это рекомендуемые модели для регулярной проверки на машине разработчика с ключами.Modern smoke‑набор (tool‑calling + image)
Это «распространённые модели», которые мы ожидаем поддерживать в рабочем состоянии:- OpenAI (не Codex):
openai/gpt-5.2(необязательно:openai/gpt-5.1) - OpenAI Codex:
openai-codex/gpt-5.3-codex(необязательно:openai-codex/gpt-5.3-codex-codex) - Anthropic:
anthropic/claude-opus-4-6(илиanthropic/claude-sonnet-4-5) - Google (Gemini API):
google/gemini-3-pro-previewиgoogle/gemini-3-flash-preview(избегайте старых Gemini 2.x) - Google (Antigravity):
google-antigravity/claude-opus-4-6-thinkingиgoogle-antigravity/gemini-3-flash - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/minimax-m2.1
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2,openai-codex/gpt-5.3-codex,anthropic/claude-opus-4-6,google/gemini-3-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/minimax-m2.1" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
Базовый уровень: tool‑calling (Read + опционально Exec)
Выберите хотя бы одну модель из каждого семейства провайдеров:- OpenAI:
openai/gpt-5.2(илиopenai/gpt-5-mini) - Anthropic:
anthropic/claude-opus-4-6(илиanthropic/claude-sonnet-4-5) - Google:
google/gemini-3-flash-preview(илиgoogle/gemini-3-pro-preview) - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/minimax-m2.1
- xAI:
xai/grok-4(или последняя доступная) - Mistral:
mistral/… (выберите одну модель с поддержкой инструментов) - Cerebras:
cerebras/… (если есть доступ) - LM Studio:
lmstudio/… (локально; tool‑calling зависит от режима API)
Vision: отправка изображения (вложение → мультимодальное сообщение)
Включите хотя бы одну модель с поддержкой изображений вOPENCLAW_LIVE_GATEWAY_MODELS (варианты Claude/Gemini/OpenAI с vision и т. п.), чтобы прогнать image probe. для упражнения изображения профиля.
Агрегаторы / альтернативные шлюзы
Если у вас есть включённые ключи, мы также поддерживаем тестирование через:- OpenRouter:
openrouter/...(сотни моделей; используйтеopenclaw models scanдля поиска кандидатов с tool+image) - OpenCode Zen:
opencode/...(аутентификация черезOPENCODE_API_KEY/OPENCODE_ZEN_API_KEY)
- Встроенные:
openai,openai-codex,anthropic,google,google-vertex,google-antigravity,google-gemini-cli,zai,openrouter,opencode,xai,groq,cerebras,mistral,github-copilot - Через
models.providers(кастомные endpoints):minimax(cloud/API), а также любой прокси, совместимый с OpenAI/Anthropic (LM Studio, vLLM, LiteLLM и т. п.)
discoverModels(...) на вашей машине + доступные ключи.
Учётные данные (никогда не коммитьте)
Live‑тесты находят креды так же, как и CLI. Практические следствия:- Если CLI работает, live‑тесты должны найти те же ключи.
-
Если live‑тест говорит «нет кредов», отлаживайте так же, как
openclaw models list/ выбор модели. -
Хранилище профилей:
~/.openclaw/credentials/(предпочтительно; именно это имеется в виду под «profile keys» в тестах) -
Конфиг:
~/.openclaw/openclaw.json(илиOPENCLAW_CONFIG_PATH)
~/.profile), запускайте локальные тесты после source ~/.profile или используйте Docker‑раннеры ниже (они могут примонтировать ~/.profile в контейнер).
Deepgram live (аудио‑транскрипция)
- Тест:
src/media-understanding/providers/deepgram/audio.live.test.ts - Включение:
DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts
Docker‑раннеры (необязательные проверки «работает в Linux»)
Они запускаютpnpm test:live внутри Docker‑образа репозитория, монтируя ваш локальный каталог конфига и рабочее пространство (и читая ~/.profile, если примонтирован):
- Прямые модели:
pnpm test:docker:live-models(скрипт:scripts/test-live-models-docker.sh) - Gateway + dev‑агент:
pnpm test:docker:live-gateway(скрипт:scripts/test-live-gateway-models-docker.sh) - Мастер онбординга (TTY, полное развёртывание):
pnpm test:docker:onboard(скрипт:scripts/e2e/onboard-docker.sh) - Сетевое взаимодействие шлюза Gateway (два контейнера, WS‑аутентификация + health):
pnpm test:docker:gateway-network(скрипт:scripts/e2e/gateway-network-docker.sh) - Плагины (загрузка кастомных расширений + smoke реестра):
pnpm test:docker:plugins(скрипт:scripts/e2e/plugins-docker.sh)
OPENCLAW_CONFIG_DIR=...(по умолчанию:~/.openclaw) монтируется в/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(по умолчанию:~/.openclaw/workspace) монтируется в/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...(по умолчанию:~/.profile) монтируется в/home/node/.profileи читается перед запуском тестовOPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...для сужения запускаOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1для гарантии, что креды берутся из хранилища профилей (а не из env)
Снятие с документами
После правок документации запускайте проверки:pnpm docs:list.
Оффлайн‑регрессии (безопасно для CI)
Это регрессии «реального конвейера» без реальных провайдеров:- Tool‑calling шлюза Gateway (mock OpenAI, реальный цикл gateway + agent):
src/gateway/gateway.tool-calling.mock-openai.test.ts - Мастер шлюза Gateway (WS
wizard.start/wizard.next, запись конфига + принудительная аутентификация):src/gateway/gateway.wizard.e2e.test.ts
Оценки надёжности агента (skills)
У нас уже есть несколько CI‑безопасных тестов, которые ведут себя как «оценки надёжности агента»:- Mock tool‑calling через реальный цикл gateway + agent (
src/gateway/gateway.tool-calling.mock-openai.test.ts). - End‑to‑end потоки мастера, проверяющие проводку сеансов и эффекты конфига (
src/gateway/gateway.wizard.e2e.test.ts).
- Принятие решений: когда skills перечислены в prompt, выбирает ли агент правильный skill (или избегает нерелевантных)?
- Соблюдение требований: читает ли агент
SKILL.mdперед использованием и следует ли обязательным шагам/аргументам? - Контракты рабочих процессов: многошаговые сценарии, проверяющие порядок инструментов, перенос истории сеанса и границы sandbox.
- Раннер сценариев с mock‑провайдерами для проверки вызовов инструментов и их порядка, чтения файлов skills и проводки сеансов.
- Небольшой набор сценариев, сфокусированных на skills (использовать vs избегать, gating, prompt injection).
- Опциональные live‑eval‑ы (opt‑in, через env) — только после появления CI‑безопасного набора.
Добавление регрессий (рекомендации)
Когда вы исправляете проблему провайдера/модели, обнаруженную в live:- По возможности добавьте CI‑безопасную регрессию (mock/stub провайдера или захват точного преобразования формы запроса)
- Если это по своей природе только live (rate limit, политики аутентификации), держите live‑тест узким и opt‑in через env‑переменные
- Предпочитайте нацеливаться на самый нижний слой, который ловит баг:
- баг конвертации/воспроизведения запроса провайдера → тест прямых моделей
- баг конвейера сеансов/истории/инструментов шлюза Gateway → live smoke шлюза Gateway или CI‑безопасный mock‑тест шлюза