Release and CI
Тесты
- Полный набор средств тестирования (наборы тестов, тестирование в реальной среде, Docker): Тестирование
- Проверка обновлений и пакетов плагинов: Тестирование обновлений и плагинов
Настройки агента по умолчанию
В сеансах агента тесты и ресурсоёмкие проверки выполняются удалённо через Crabbox. Для доверенного кода сопровождающих по умолчанию используется Blacksmith Testbox. Настроенный рабочий процесс Testbox загружает учётные данные, поэтому для недоверенного кода участников или форков необходимо вместо него использовать CI форка без секретов либо защищённый прямой AWS Crabbox.
Если для задачи с доверенным кодом, вероятно, потребуются тесты или ресурсоёмкая проверка, немедленно
запустите предварительный прогрев в фоновом сеансе командной строки, продолжайте работу во время его выполнения,
повторно используйте возвращённый идентификатор tbx_..., синхронизируйте текущую рабочую копию при каждом запуске и
остановите его перед передачей работы:
node scripts/crabbox-wrapper.mjs warmup --provider blacksmith-testbox --keep --timing-jsonПосле первого успешного повторного использования обёртка записывает базовый отпечаток аренды,
отпечаток зависимостей и рабочего процесса 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 перед загрузкой любого скрипта.
Обычный порядок локальных действий
pnpm test:changedдля подтверждения Vitest в области изменений.pnpm test <path-or-filter>для одного файла, каталога или явно указанной цели.pnpm testтолько когда вам намеренно требуется полный локальный набор тестов Vitest.
В рабочем дереве Codex или связанном/разреженном рабочем дереве агенты избегают прямого локального запуска
pnpm test* / pnpm check* / pnpm crabbox:run:
- Явно запрошенный пользователем локальный резервный вариант для небольшого файла:
node scripts/run-vitest.mjs <path-or-filter>. - Проверки изменений или широкое подтверждение:
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: сквозные тесты уровня процессов, которым требуются работающий Gateway, окружение CLI, сбор журналов и очистка в одном месте.- Дорожки сквозных тестов 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, который поднимает Vite Control UI и управляет реальной страницей 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 как tarball npm, создаёт или повторно использует базовый образ исполнителя Node/Git, а также функциональный образ, устанавливающий этот tarball в /app, после чего запускает дымовые наборы Docker через взвешенный планировщик. scripts/package-openclaw-for-docker.mjs — единый локальный/CI-упаковщик пакета, который проверяет tarball и dist/postinstall-inventory.json до их использования Docker.
- Базовый образ (
OPENCLAW_DOCKER_E2E_BARE_IMAGE): наборы установщика, обновления и зависимостей плагинов; монтирует заранее собранный tarball вместо скопированных исходников репозитория. - Функциональный образ (
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_<RESOURCE>_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 с обратной петлёй и проверяет сохранность агентов, конфигурации каналов, списков разрешённых плагинов, файлов рабочей области и сеансов, устаревшего состояния зависимостей старых плагинов, запуска и состояния 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, по умолчанию начинающий с openclaw@2026.4.23. Рабочий процесс Update Migration расширяет его с помощью baselines=all-since-2026.4.23, чтобы подтвердить очистку зависимостей настроенных плагинов за пределами Full Release CI. |
pnpm test:docker:plugins |
Дымовая проверка установки и обновления для локального пути, file:, пакетов реестра npm с поднятыми зависимостями, перемещаемых ссылок git, фикстур ClawHub, обновлений marketplace, а также включения и проверки комплекта Claude. |
Локальный шлюз PR
Для локальных проверок перед включением PR выполните:
pnpm check:changedpnpm checkpnpm check:test-typespnpm buildpnpm testpnpm check:docs
Если pnpm test нестабилен на загруженном узле, повторите запуск один раз, прежде чем считать это регрессией, а затем изолируйте проблему с помощью pnpm test <path/to/test>. Для узлов с ограниченной памятью:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_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записывает профиль ЦП для основного потока Vitest (.artifacts/vitest-main-profile);pnpm test:perf:profile:runnerзаписывает профили ЦП и кучи для средства запуска модульных тестов (.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)
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)
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,statusreal: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.portall: обе предустановки вместе
Вывод включает 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, чтобы вместо неё измерить запуск из исходного кода, и храните эти результаты отдельно от базовых показателей собранной точки входа.
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 выше.
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:
scripts/e2e/onboard-docker.shУправляет интерактивным мастером через псевдотерминал, проверяет файлы конфигурации, рабочего пространства и сеанса, затем запускает Gateway и выполняет openclaw health.
Дымовой тест импорта QR-кода (Docker)
Проверяет, что поддерживаемый вспомогательный модуль среды выполнения QR-кодов загружается в поддерживаемых средах выполнения Docker Node (Node 24 по умолчанию, совместимо с Node 22):
pnpm test:docker:qr