---
read_when:
    - Запуск или исправление тестов
summary: Как запускать тесты локально (vitest) и когда использовать режимы force/coverage
title: Тесты
x-i18n:
    generated_at: "2026-07-13T20:17:31Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 24
    provider: openai
    source_hash: 63806ea72da1579f4aa0b92c14a6d2d3e67990d6c10cb6d9b1b2bb4a63c8e140
    source_path: reference/test.md
    workflow: 16
---

- Полный набор средств тестирования (наборы тестов, тестирование в реальной среде, Docker): [Тестирование](/ru/help/testing)
- Проверка обновлений и пакетов плагинов: [Тестирование обновлений и плагинов](/ru/help/testing-updates-plugins)

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

В сеансах агента тесты и ресурсоёмкие проверки выполняются удалённо
через 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_<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: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`, чтобы игнорировать локальный артефакт временных показателей.

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

<Accordion title="Задержка модели (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. Без знаков препинания и дополнительного текста».

</Accordion>

<Accordion title="Запуск CLI (scripts/bench-cli-startup.ts)">

```bash
pnpm test:startup:bench
pnpm test:startup:bench:smoke
pnpm test:startup:bench:save
pnpm test:startup:bench:update
pnpm test:startup:bench:check
pnpm tsx scripts/bench-cli-startup.ts --runs 12
pnpm tsx scripts/bench-cli-startup.ts --preset real --case status --case gatewayStatus --runs 3
pnpm 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`.

</Accordion>

<Accordion title="Запуск 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 1
pnpm test:startup:gateway -- --case skipChannels --case fiftyPlugins --runs 5
node --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` только после того, как трассировка укажет на импорт, компиляцию или работу с высокой нагрузкой на процессор, которую нельзя объяснить одними временными показателями этапов.

</Accordion>

<Accordion title="Перезапуск 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 5
pnpm 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` и видимому пользователю контракту перезапуска.

</Accordion>

## Сквозное тестирование первоначальной настройки (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
```

## См. также

- [Тестирование](/ru/help/testing)
- [Тестирование в реальной среде](/ru/help/testing-live)
- [Тестирование обновлений и плагинов](/ru/help/testing-updates-plugins)
