Release and CI

Тесты

Настройки агента по умолчанию

В сеансах агента один или несколько целевых тестов и недорогие статические проверки выполняются локально только для доверенного исходного кода и при наличии готовых установленных зависимостей. Никогда не выполняйте локально инструменты из недоверенного репозитория. Более крупные наборы тестов, изменённые проверки с параллельным выполнением проверки типов и линтинга, сборки, Docker, проверки пакетов, E2E, проверка в реальной среде и кроссплатформенная проверка выполняются удалённо через Crabbox. Для ресурсоёмкой проверки доверенного кода сопровождающими по умолчанию используется Blacksmith Testbox. Настроенный рабочий процесс Testbox загружает учётные данные, поэтому для недоверенного кода участника или форка необходимо вместо него использовать CI форка без секретов или санитизированный прямой AWS Crabbox.

Не выполняйте предварительный прогрев для предполагаемой работы. Получайте серверную среду по требованию, когда будет готова первая ресурсоёмкая команда, повторно используйте возвращённый идентификатор tbx_... для последующих ресурсоёмких команд, синхронизируйте текущую рабочую копию при каждом запуске и останавливайте среду перед передачей работы.

После первого успешного повторного использования обёртка записывает базовый коммит аренды, отпечатки зависимостей и рабочего процесса Testbox в .crabbox/testbox-leases/. При изменениях только исходного кода прогретая среда продолжает использоваться повторно. Изменение базы слияния, файла блокировки, входных данных менеджера пакетов, обёртки или рабочего процесса Testbox приводит к безопасному отказу и требует новой аренды. При каждом запуске текущая рабочая копия по-прежнему синхронизируется. OPENCLAW_TESTBOX_ALLOW_STALE=1 предназначен только для целевой диагностики, а не для проверки релиза.

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

Для ресурсоёмкой проверки недоверенного кода выполняйте прогрев по требованию с помощью --provider aws. При каждом запуске необходимо задавать CRABBOX_ENV_ALLOW=CI, передавать --provider aws --no-hydrate и использовать новый временный удалённый HOME перед установкой зависимостей или запуском тестов. Используйте новую прогретую аренду, выделенную для этого недоверенного исходного кода; никогда не используйте повторно доверенную или ранее загруженную учётными данными аренду. Запускайте установленный доверенный исполняемый файл Crabbox из чистой доверенной рабочей копии main и получайте только удалённый PR с помощью --fresh-pr; никогда не выполняйте локально обёртку или конфигурацию из недоверенной рабочей копии. Отмените установку CRABBOX_AWS_INSTANCE_PROFILE и выполняйте безопасный отказ, если разрешённое значение aws.instanceProfile не пусто. Перед любой установкой или тестированием используйте доверенные инструменты с абсолютными путями, чтобы потребовать токен IMDSv2, подтвердить, что конечная точка учётных данных IAM возвращает 404, и проверить, что удалённое значение git rev-parse HEAD равно полному проверенному SHA головного коммита PR. Привяжите аренду к этому SHA и останавливайте или прогревайте её заново при изменении головного коммита. Загрузите доверенный scripts/crabbox-untrusted-bootstrap.sh из чистого main вместе с --fresh-pr; он устанавливает закреплённые версии Node и pnpm, проверяет SHA и закреплённую версию менеджера пакетов, изолирует HOME, устанавливает зависимости, а затем выполняет запрошенный тест. Если брокер не может подтвердить отсутствие роли или удалённого PR, используйте CI форка без секретов. Не используйте hydrate-github, --no-sync или рабочий процесс Testbox с загруженными учётными данными. Отмените все переопределения CRABBOX_TAILSCALE*, принудительно задайте --network public --tailscale=false, сбросьте флаги выходного узла/LAN и потребуйте, чтобы crabbox inspect сообщал об использовании общедоступной сети без состояния Tailscale перед загрузкой любого скрипта.

Обычный порядок локального выполнения

  1. pnpm test:changed для проверки Vitest в области изменений.
  2. pnpm test <path-or-filter> для одного файла, каталога или явно указанной цели.
  3. pnpm test только когда намеренно требуется полный локальный набор тестов Vitest.

В рабочем дереве Codex или связанном/разреженном рабочем дереве агенты избегают прямого локального запуска pnpm test* / pnpm check* / pnpm crabbox:run:

  • Ограниченная целевая проверка при наличии готовых зависимостей: node scripts/run-vitest.mjs <path-or-filter>.
  • Проверка изменений с предварительной классификацией: node scripts/check-changed.mjs; планы только с документацией, без изменений и с небольшими изменениями метаданных выполняются локально при наличии готовых зависимостей, а ресурсоёмкие планы или планы с отсутствующими зависимостями делегируются Testbox.
  • Явно заданная широкая проверка с сохранением аренды: node scripts/crabbox-wrapper.mjs run --provider blacksmith-testbox ... -- env OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 corepack pnpm check:changed, чтобы pnpm выполнялся внутри Testbox.
  • Итоговые exitCode оболочки и JSON с временными показателями являются результатом команды. Делегированный запуск Blacksmith GitHub Actions может показывать cancelled после успешного выполнения команды SSH, поскольку Testbox останавливается извне действия поддержания активности; прежде чем считать это сбоем, проверьте сводку оболочки и вывод команды.
  • OPENCLAW_HEAVY_CHECK_LOCK_SCOPE=worktree <local-heavy-check command>: сохраняет сериализацию ресурсоёмких проверок внутри текущего рабочего дерева, а не в общем каталоге Git, для таких команд, как pnpm check:changed и целевая pnpm test .... Используйте это только на высокопроизводительных локальных хостах при намеренном параллельном запуске независимых проверок в связанных рабочих деревьях.

Основные команды

Запуски оболочки тестов завершаются краткой сводкой [test] passed|failed|skipped ... in ...; собственная строка Vitest с длительностью остаётся детализацией по сегментам.

Команда Назначение
pnpm test Явно указанные цели — файлы или каталоги — направляются в специализированные потоки Vitest. Запуски без указания цели служат проверкой полного набора: фиксированные группы сегментов разворачиваются в конечные конфигурации для локального параллельного выполнения, а ожидаемое количество сегментов выводится перед запуском. Группа расширений всегда разворачивается в отдельные конфигурации сегментов для каждого расширения вместо одного гигантского процесса корневого проекта.
pnpm test:changed Быстрый интеллектуальный запуск тестов для изменений: точные цели определяются по непосредственным изменениям тестов, соседним файлам *.test.ts, явным сопоставлениям исходного кода и локальному графу импортов. Широкие изменения конфигурации или пакетов пропускаются, если им не соответствуют конкретные тесты.
OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed Явный широкий запуск тестов для изменений; используйте, когда изменение тестовой инфраструктуры, конфигурации или пакета должно задействовать более широкий стандартный механизм Vitest для тестирования изменений.
pnpm test:force Освобождает настроенный порт Gateway OpenClaw (по умолчанию 18789), затем запускает полный набор с изолированным портом Gateway, чтобы серверные тесты не конфликтовали с работающим экземпляром.
pnpm test:coverage Формирует информационный отчёт V8 о покрытии для стандартного потока модульных тестов (vitest.unit.config.ts); пороговые значения покрытия не применяются.
pnpm test:coverage:changed Покрытие модульными тестами только для файлов, изменённых после origin/main.
pnpm changed:lanes Показывает архитектурные потоки, активированные различиями относительно origin/main.
pnpm check:changed Классифицирует изменённые потоки перед выбором способа выполнения. Планы только с документацией, без изменений и с небольшими изменениями метаданных выполняются локально при наличии готовых зависимостей; планы с разветвлёнными проверками типов/линтинга, другими ресурсоёмкими потоками или отсутствующими локальными зависимостями вне CI делегируются Crabbox/Testbox. Не запускает Vitest; для проверки тестами используйте pnpm test:changed или pnpm test <target>.

Общее состояние тестов и вспомогательные средства для процессов

  • src/test-utils/openclaw-test-state.ts: используйте из Vitest, когда тесту требуется изолированный HOME, OPENCLAW_STATE_DIR, OPENCLAW_CONFIG_PATH, тестовая конфигурация, рабочее пространство, каталог агента или хранилище профилей аутентификации.
  • pnpm test:env-mutations:report: неблокирующий отчёт о тестах и тестовой инфраструктуре, которые напрямую изменяют HOME, OPENCLAW_STATE_DIR, OPENCLAW_CONFIG_PATH, OPENCLAW_WORKSPACE_DIR или связанные переменные среды. Используйте его для поиска кандидатов на миграцию к общему вспомогательному средству состояния тестов.
  • test/helpers/openclaw-test-instance.ts: для тестов E2E на уровне процессов, которым в одном месте требуются работающий Gateway, среда CLI, сбор журналов и очистка.
  • Потоки E2E для Docker/Bash, подключающие scripts/lib/docker-e2e-image.sh, могут передавать docker_e2e_test_state_shell_b64 <label> <scenario> в контейнер и декодировать его с помощью scripts/lib/openclaw-e2e-instance.sh; сценарии с несколькими домашними каталогами могут передавать docker_e2e_test_state_function_b64 и вызывать openclaw_test_state_create <label> <scenario> в каждом потоке. node scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --json записывает файл переменных среды хоста, пригодный для подключения (конструкция -- перед create не позволяет более новым средам выполнения Node интерпретировать --env-file как флаг Node). Потоки, запускающие Gateway, могут подключать scripts/lib/openclaw-e2e-instance.sh для разрешения точки входа, запуска имитации OpenAI, запуска в основном/фоновом режиме, проверок готовности, экспорта переменных среды состояния, выгрузки журналов и очистки процессов.

Потоки Control UI, TUI и расширений

  • E2E с имитацией Control UI: pnpm test:ui:e2e запускает связку Vitest + Playwright, которая поднимает Control UI в Vite и управляет реальной страницей Chromium, подключённой к имитируемому WebSocket Gateway. Тесты находятся в ui/src/**/*.e2e.test.ts; общие имитации и элементы управления — в ui/src/test-helpers/control-ui-e2e.ts. pnpm test:e2e включает эту связку. Запуски агентом по умолчанию выполняются в Testbox/Crabbox, включая целевую проверку; используйте node scripts/run-vitest.mjs run --config test/vitest/vitest.ui-e2e.config.ts --configLoader runner ui/src/ui/e2e/chat-flow.e2e.test.ts только как явно выбранный локальный резервный вариант.
  • PTY-тесты TUI: node scripts/run-vitest.mjs run --config test/vitest/vitest.tui-pty.config.ts запускает быструю PTY-связку с имитируемым бэкендом. OPENCLAW_TUI_PTY_INCLUDE_LOCAL=1 или pnpm tui:pty:test:watch --mode local запускает более медленную дымовую проверку tui --local, которая имитирует только внешнюю конечную точку модели. Проверяйте стабильный видимый текст или вызовы фикстур, а не необработанные снимки ANSI.
  • pnpm test:extensions и pnpm test extensions запускают все шарды расширений/плагинов. Ресурсоёмкие плагины каналов, браузерный плагин и OpenAI запускаются как отдельные шарды; остальные группы плагинов остаются объединёнными. pnpm test extensions/<id> запускает одну связку встроенного плагина.
  • Исходные файлы с соседними тестами сначала сопоставляются с этим соседним тестом, и только затем используются более широкие шаблоны каталогов. При изменении вспомогательных файлов в src/channels/plugins/contracts/test-helpers, src/plugin-sdk/test-helpers и src/plugins/contracts локальный граф импортов позволяет запускать импортирующие их тесты вместо широкого запуска всех шардов, когда путь зависимости определён точно.
  • Целевые каталоги контрактов распределяются по соответствующим связкам контрактов: pnpm test src/channels/plugins/contracts запускает четыре конфигурации контрактов каналов, а pnpm test src/plugins/contracts — конфигурацию контрактов плагинов, поскольку универсальные проекты channels/plugins исключают contracts/**.
  • auto-reply разделяется на три отдельные конфигурации (core, top-level, reply), чтобы инфраструктура ответов не преобладала над более лёгкими высокоуровневыми тестами состояния, токенов и вспомогательных средств.
  • Выбранные тестовые файлы plugin-sdk и commands направляются через отдельные облегчённые связки, в которых остаётся только test/setup.ts, а ресурсоёмкие сценарии среды выполнения продолжают выполняться в существующих связках.
  • Базовая конфигурация Vitest по умолчанию использует pool: "threads" и isolate: false, а общий неизолированный исполнитель включён во всех конфигурациях репозитория.
  • pnpm test:channels запускает vitest.channels.config.ts.

Gateway и E2E

  • Интеграция Gateway включается явно: OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm test или pnpm test:gateway.
  • pnpm test:e2e: совокупный E2E репозитория = pnpm test:e2e:gateway && pnpm test:ui:e2e.
  • pnpm test:e2e:gateway: сквозные дымовые тесты Gateway (сопряжение нескольких экземпляров по WS/HTTP/Node). По умолчанию используются threads + isolate: false с адаптивным числом исполнителей в vitest.e2e.config.ts; настройка выполняется через OPENCLAW_E2E_WORKERS=<n>, подробное журналирование — через OPENCLAW_E2E_VERBOSE=1.
  • pnpm test:live: тесты провайдеров в реальной среде (Claude/Minimax/DeepSeek/z.ai и т. д., управляются *.live.test.ts). Чтобы они не пропускались, требуются ключи API и LIVE=1 (или OPENCLAW_LIVE_TEST=1); подробный вывод включается через OPENCLAW_LIVE_TEST_QUIET=0.

Полный набор Docker (pnpm test:docker:all)

Создаёт общий образ для тестов в реальной среде, один раз упаковывает OpenClaw в tar-архив npm, создаёт или повторно использует минимальный образ исполнителя с Node/Git и функциональный образ, устанавливающий этот tar-архив в /app, а затем запускает связки дымовых проверок Docker через взвешенный планировщик. scripts/package-openclaw-for-docker.mjs — единый локальный/CI-упаковщик пакета, который проверяет tar-архив и dist/postinstall-inventory.json до их использования Docker.

  • Минимальный образ (OPENCLAW_DOCKER_E2E_BARE_IMAGE): связки установки, обновления и зависимостей плагинов; монтирует предварительно собранный tar-архив вместо скопированных исходных файлов репозитория.
  • Функциональный образ (OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE): связки проверки обычной функциональности собранного приложения.
  • Определения связок: scripts/lib/docker-e2e-scenarios.mjs. Планировщик: scripts/lib/docker-e2e-plan.mjs. Исполнитель: scripts/test-docker-all.mjs.
  • node scripts/test-docker-all.mjs --plan-json формирует принадлежащий планировщику план CI (связки, виды образов, потребности в пакете/образе для реальной среды, сценарии состояния, проверки учётных данных), не собирая и не запуская Docker.

Параметры планирования (переменные среды, значения по умолчанию в скобках):

Переменная среды По умолчанию Назначение
OPENCLAW_DOCKER_ALL_PARALLELISM 10 Слоты процессов.
OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM 10 Хвостовой пул, чувствительный к провайдеру.
OPENCLAW_DOCKER_ALL_LIVE_LIMIT 9 Ограничение ресурсоёмких связок реальных провайдеров.
OPENCLAW_DOCKER_ALL_NPM_LIMIT 5 Ограничение связок, использующих ресурсы npm.
OPENCLAW_DOCKER_ALL_SERVICE_LIMIT 7 Ограничение связок, использующих ресурсы сервисов.
OPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT / _CODEX_LIMIT / _GEMINI_LIMIT / _DROID_LIMIT / _OPENCODE_LIMIT 4 Ограничения ресурсоёмких связок для каждого провайдера.
OPENCLAW_DOCKER_ALL_LIVE_OPENAI_LIMIT / _TELEGRAM_LIMIT 1 Более строгие ограничения для отдельных провайдеров.
OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT / OPENCLAW_DOCKER_ALL_DOCKER_LIMIT - Переопределение для более мощных хостов.
OPENCLAW_DOCKER_ALL_START_STAGGER_MS 2000 Задержка между запусками связок, предотвращающая шквал операций создания в локальном демоне Docker.
OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS 7,200,000 (120 мин) Резервный тайм-аут для каждой связки; для выбранных связок реальных провайдеров и хвостовых связок действуют более строгие ограничения.
OPENCLAW_DOCKER_ALL_LIVE_RETRIES 1 Повторные попытки при временных сбоях реальных провайдеров.
OPENCLAW_DOCKER_ALL_DRY_RUN выкл. Выводит манифест связок без запуска Docker.
OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS 30000 Интервал вывода состояния активных связок.
OPENCLAW_DOCKER_ALL_TIMINGS вкл. Повторно использует .artifacts/docker-tests/lane-timings.json для упорядочивания от самых длительных; для отключения задайте 0.
OPENCLAW_DOCKER_ALL_LIVE_MODE - skip — только для детерминированных/локальных связок, only — только для связок реальных провайдеров. Псевдонимы: pnpm test:docker:local:all, pnpm test:docker:live:all. В режиме только реальных провайдеров основные и хвостовые связки реальных провайдеров объединяются в один пул с приоритетом самых длительных, чтобы группы провайдеров совместно размещали задачи Claude/Codex/Gemini.
OPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS 180 Тайм-аут настройки Docker для бэкенда CLI.

Шаблон переменной среды для ограничений ресурсов: OPENCLAW_DOCKER_ALL_&lt;RESOURCE&gt;_LIMIT (имя ресурса в верхнем регистре, последовательности символов, не являющихся буквами или цифрами, заменяются на _).

Другое поведение: раннер по умолчанию выполняет предварительную проверку Docker, удаляет устаревшие E2E-контейнеры OpenClaw, совместно использует кеши CLI-инструментов провайдеров между совместимыми линиями и прекращает планировать новые линии из пула после первого сбоя, если не задана переменная OPENCLAW_DOCKER_ALL_FAIL_FAST=0. Если одна линия превышает эффективный лимит веса/ресурсов на хосте с низким уровнем параллелизма, она всё равно может запуститься из пустого пула и выполняться одна, пока не освободит ресурсы. Журналы отдельных линий, summary.json, failures.json и данные о времени выполнения фаз записываются в .artifacts/docker-tests/<run-id>/; используйте pnpm test:docker:timings <summary.json> для анализа медленных линий и pnpm test:docker:rerun <run-id|summary.json|failures.json> для вывода недорогих команд целевого повторного запуска.

Примечательные линии Docker

Команда Что проверяет
pnpm test:docker:browser-cdp-snapshot E2E-контейнер исходного кода на базе Chromium с прямым CDP и изолированным Gateway; снимки ролей CDP browser doctor --deep включают URL-адреса ссылок, кликабельные элементы, распознанные по курсору, ссылки на iframe и метаданные фреймов.
pnpm test:docker:skill-install Устанавливает упакованный tar-архив в чистом Docker-раннере с skills.install.allowUploadedArchives: false, определяет актуальный идентификатор навыка через поиск в работающем ClawHub, устанавливает его с помощью openclaw skills install и проверяет SKILL.md, .clawhub/origin.json, .clawhub/lock.json и skills info --json.
pnpm test:docker:live-cli-backend:claude, :claude:resume, :claude:mcp Целевые проверки CLI-бэкендов в рабочей среде; для Gemini предусмотрены соответствующие псевдонимы :resume и :mcp.
pnpm test:docker:openwebui Контейнеризированные OpenClaw + Open WebUI: вход в систему, проверка /api/models, запуск реального чата через прокси посредством /api/chat/completions. Требует пригодного ключа рабочей модели и загружает внешний образ; в отличие от наборов модульных и E2E-тестов, стабильность в CI не предполагается.
pnpm test:docker:mcp-channels Контейнер Gateway с начальными данными и клиентский контейнер, запускающий openclaw mcp serve: обнаружение маршрутизируемых бесед, чтение расшифровок, метаданные вложений, поведение очереди событий в реальном времени, маршрутизация исходящей отправки, а также уведомления о каналах и разрешениях в стиле Claude через настоящий мост stdio (проверка напрямую считывает необработанные MCP-кадры stdio).
pnpm test:docker:upgrade-survivor Устанавливает упакованный tar-архив поверх изменённой фикстуры старого пользователя, выполняет обновление пакета и неинтерактивный doctor без рабочих ключей провайдеров и каналов, запускает Gateway на loopback-интерфейсе и проверяет сохранность агентов, конфигурации каналов, списков разрешённых плагинов, файлов рабочих пространств и сеансов, устаревшего состояния зависимостей старых плагинов, запуска и состояния RPC.
pnpm test:docker:published-upgrade-survivor По умолчанию устанавливает openclaw@latest, создаёт реалистичные файлы существующего пользователя, настраивает систему с помощью встроенного рецепта openclaw config set, обновляет её до упакованного tar-архива, запускает неинтерактивный doctor, записывает .artifacts/upgrade-survivor/summary.json и проверяет /healthz, /readyz и состояние RPC. Переопределите с помощью OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, расширьте матрицу посредством OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS или добавьте фикстуры сценариев с помощью OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues (включая configured-plugin-installs и stale-source-plugin-shadow). Package Acceptance предоставляет их как published_upgrade_survivor_baseline(s) / _scenarios и разрешает метатокены, такие как last-stable-4 или all-since-2026.4.23.
pnpm test:docker:update-migration Стенд проверки сохранности после опубликованного обновления в сценарии plugin-deps-cleanup, по умолчанию начинающий с [email protected]. Рабочий процесс Update Migration расширяет его с помощью baselines=all-since-2026.4.23, чтобы подтвердить очистку зависимостей настроенных плагинов вне Full Release CI.
pnpm test:docker:plugins Дымовая проверка установки/обновления для локального пути, file:, пакетов реестра npm с поднятыми зависимостями, перемещаемых ссылок git, фикстур ClawHub, обновлений маркетплейса, а также включения и проверки пакета Claude.

Локальный шлюз PR

Для локальных проверок перед слиянием PR и прохождением шлюза выполните:

  • pnpm check:changed
  • pnpm check
  • pnpm check:test-types
  • pnpm build
  • pnpm test
  • pnpm check:docs

Если pnpm test нестабилен на загруженном хосте, повторите запуск один раз, прежде чем считать это регрессией, а затем изолируйте проблему с помощью pnpm test <path/to/test>. Для хостов с ограниченным объёмом памяти:

  • OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test
  • OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed

Инструменты анализа производительности тестов

  • pnpm test:perf:imports: включает отчёты Vitest о длительности импорта и детализации импорта, продолжая использовать маршрутизацию по ограниченным областям линий для явно указанных файлов и каталогов. pnpm test:perf:imports:changed ограничивает такое же профилирование файлами, изменёнными после origin/main.
  • pnpm test:perf:changed:bench -- --ref <git-ref> сопоставляет производительность маршрутизируемого режима изменений с нативным запуском корневого проекта для одной и той же зафиксированной разницы git; pnpm test:perf:changed:bench -- --worktree измеряет производительность текущего набора изменений рабочего дерева без предварительной фиксации.
  • pnpm test:perf:profile:main записывает профиль CPU для основного потока Vitest (.artifacts/vitest-main-profile); pnpm test:perf:profile:runner записывает профили CPU и кучи для раннера модульных тестов (.artifacts/vitest-runner-profile).
  • pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json: последовательно запускает каждую конечную конфигурацию Vitest полного набора и записывает сгруппированные данные о длительности, а также JSON-артефакты и журналы для каждой конфигурации. По умолчанию отчёты полного набора изолируют файлы, чтобы сохранённые графы модулей и паузы сборки мусора из предыдущих файлов не учитывались в последующих проверках; передавайте -- --no-isolate только при намеренном профилировании накопления в общем воркере. Агент производительности тестов использует это как базовый уровень перед попытками ускорить медленные тесты. pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json сравнивает сгруппированные отчёты после изменения, направленного на повышение производительности.
  • Запуски шардов полного набора, расширений и шаблонов включения обновляют локальные данные о времени в .artifacts/vitest-shard-timings.json; последующие запуски всей конфигурации используют эти данные, чтобы сбалансировать медленные и быстрые шарды. Шарды CI с шаблонами включения добавляют имя шарда к ключу времени, благодаря чему данные о времени отфильтрованных шардов остаются видимыми, не заменяя данные о времени всей конфигурации. Задайте OPENCLAW_TEST_PROJECTS_TIMINGS=0, чтобы игнорировать локальный артефакт данных о времени.

Тесты производительности

Задержка модели (scripts/bench-model.ts)
bash
pnpm tsx scripts/bench-model.ts --runs 10

Необязательные переменные окружения: MINIMAX_API_KEY, MINIMAX_BASE_URL, MINIMAX_MODEL, ANTHROPIC_API_KEY. Запрос по умолчанию: «Ответьте одним словом: ok. Без знаков препинания и дополнительного текста».

Запуск CLI (scripts/bench-cli-startup.ts)
bash
pnpm test:startup:benchpnpm test:startup:bench:smokepnpm test:startup:bench:savepnpm test:startup:bench:updatepnpm test:startup:bench:checkpnpm tsx scripts/bench-cli-startup.ts --runs 12pnpm tsx scripts/bench-cli-startup.ts --preset real --case status --case gatewayStatus --runs 3pnpm tsx scripts/bench-cli-startup.ts --entry openclaw.mjs --entry-secondary dist/entry.js --preset all

Предустановки:

  • startup: --version, --help, health, health --json, status --json, status
  • real: health, status, status --json, sessions, sessions --json, tasks --json, tasks list --json, tasks audit --json, agents list --json, gateway status, gateway status --json, gateway health --json, config get gateway.port
  • all: обе предустановки вместе

Вывод содержит sampleCount, среднее значение, p50, p95, минимум/максимум, распределение кодов завершения/сигналов и максимальный RSS для каждой команды. --cpu-prof-dir / --heap-prof-dir записывают профили V8 для каждого запуска.

Сохранённый вывод: pnpm test:startup:bench:smoke записывает .artifacts/cli-startup-bench-smoke.json; pnpm test:startup:bench:save записывает .artifacts/cli-startup-bench-all.json (runs=5 warmup=1). Зафиксированная в репозитории фикстура: test/fixtures/cli-startup-bench.json, обновляется с помощью pnpm test:startup:bench:update и сравнивается с помощью pnpm test:startup:bench:check.

Запуск Gateway (scripts/bench-gateway-startup.ts)

По умолчанию используется собранная точка входа CLI в dist/entry.js; сначала выполните pnpm build. Передайте --entry scripts/run-node.mjs, чтобы вместо неё измерить средство запуска исходного кода, и храните эти результаты отдельно от базовых показателей собранной точки входа.

bash
pnpm test:startup:gateway -- --runs 5 --warmup 1pnpm test:startup:gateway -- --case skipChannels --case fiftyPlugins --runs 5node --import tsx scripts/bench-gateway-startup.ts --case default --runs 5 --output .artifacts/gateway-startup.json

Идентификаторы сценариев: default, skipChannels (запуск каналов пропущен), oneInternalHook, allInternalHooks, fiftyPlugins (50 плагинов с манифестами), fiftyStartupLazyPlugins (50 плагинов с манифестами и отложенным запуском).

Вывод содержит первые выходные данные процесса, /healthz, /readyz, время записи в журнал о начале прослушивания HTTP, время записи в журнал о готовности Gateway, процессорное время, коэффициент использования ядер процессора, максимальный RSS, кучу, метрики трассировки запуска, задержку цикла событий и подробные метрики таблицы поиска плагинов. Скрипт задаёт OPENCLAW_GATEWAY_STARTUP_TRACE=1 в окружении дочернего процесса Gateway.

/healthz обозначает работоспособность (HTTP-сервер может отвечать). /readyz обозначает фактическую готовность к использованию (завершилась подготовка вспомогательных процессов плагинов запуска, каналов и критически важной для готовности работы после подключения). Обработчики запуска выполняются асинхронно и не входят в гарантию готовности. Время записи в журнал о готовности — это внутренняя временная метка Gateway, полезная для атрибуции на стороне процесса, но не заменяющая внешнюю проверку /readyz.

При сравнении изменений используйте вывод JSON или --output. Используйте --cpu-prof-dir только после того, как данные трассировки укажут на импорт, компиляцию или процессорно-зависимую работу, которую невозможно объяснить одними временными показателями фаз.

Перезапуск Gateway (scripts/bench-gateway-restart.ts)

Только для macOS и Linux (использует SIGUSR1 для перезапусков внутри процесса; в Windows немедленно завершается с ошибкой). По умолчанию используется та же собранная точка входа и то же переопределение --entry scripts/run-node.mjs, что и при запуске Gateway выше.

bash
pnpm test:restart:gateway -- --case skipChannels --runs 1 --restarts 5pnpm test:restart:gateway -- --case default --runs 3 --restarts 3 --warmup 1

Идентификаторы сценариев: skipChannels, skipChannelsAcpxProbe (проверка запуска ACPX включена), skipChannelsNoAcpxProbe (проверка отключена), default, fiftyPlugins.

Вывод содержит следующие /healthz, следующие /readyz, время простоя, время готовности после перезапуска, показатели процессора, RSS, метрики трассировки запуска замещающего процесса и метрики трассировки перезапуска для обработки сигналов, ожидания завершения активной работы, фаз закрытия, следующего запуска, времени готовности и снимков памяти. Скрипт задаёт OPENCLAW_GATEWAY_STARTUP_TRACE=1 и OPENCLAW_GATEWAY_RESTART_TRACE=1.

Используйте этот тест производительности, когда изменение затрагивает сигнализацию перезапуска, обработчики закрытия, запуск после перезапуска, завершение вспомогательных процессов, передачу управления службой или готовность после перезапуска. Начните с skipChannels, чтобы изолировать механику Gateway от запуска каналов; используйте default или сценарии с большим количеством плагинов только после того, как узкий сценарий прояснит путь перезапуска. Метрики трассировки — это подсказки для атрибуции, а не окончательные выводы: оценивайте изменение перезапуска по нескольким выборкам, соответствующему диапазону владельца, поведению /healthz//readyz и пользовательскому контракту перезапуска.

Сквозное тестирование первоначальной настройки (Docker)

Необязательно; требуется только для дымовых тестов первоначальной настройки в контейнере. Полный процесс холодного запуска в чистом контейнере Linux:

bash
scripts/e2e/onboard-docker.sh

Управляет интерактивным мастером через псевдотерминал, проверяет файлы конфигурации, рабочей области и сеанса, затем запускает Gateway и выполняет openclaw health.

Дымовой тест импорта QR-кода (Docker)

Проверяет, что поддерживаемый вспомогательный модуль среды выполнения QR загружается в поддерживаемых средах выполнения Docker Node (Node 24 по умолчанию, совместимость с Node 22):

bash
pnpm test:docker:qr

Связанные материалы

Was this useful?
On this page

On this page