Release and CI

Тесты

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

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

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

bash
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 перед загрузкой любого скрипта.

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

  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/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_&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 с обратной петлёй и проверяет сохранность агентов, конфигурации каналов, списков разрешённых плагинов, файлов рабочей области и сеансов, устаревшего состояния зависимостей старых плагинов, запуска и состояния 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: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 записывает профиль ЦП для основного потока 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)
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