Release and CI
Тесты
- Полный набор средств тестирования (наборы тестов, тестирование в реальной среде, Docker): Тестирование
- Проверка обновлений и пакетов плагинов: Тестирование обновлений и плагинов
Настройки агента по умолчанию
В сеансах агента один или несколько целевых тестов и недорогие статические проверки выполняются локально только для доверенного исходного кода и при наличии готовых установленных зависимостей. Никогда не выполняйте локально инструменты из недоверенного репозитория. Более крупные наборы тестов, изменённые проверки с параллельным выполнением проверки типов и линтинга, сборки, 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 перед загрузкой любого скрипта.
Обычный порядок локального выполнения
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/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_<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 на 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: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записывает профиль 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)
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