diff --git a/docs/uk/reference/test.md b/docs/uk/reference/test.md index 59e75b483..c96e71ed8 100644 --- a/docs/uk/reference/test.md +++ b/docs/uk/reference/test.md @@ -1,50 +1,49 @@ --- read_when: - Запуск або виправлення тестів -summary: Як локально запускати тести (`vitest`) і коли використовувати режими force/coverage +summary: Як запускати тести локально (`vitest`) і коли використовувати режими force/coverage title: Тести x-i18n: - generated_at: "2026-04-20T14:50:23Z" + generated_at: "2026-04-20T15:52:07Z" model: gpt-5.4 provider: openai - source_hash: 60eac73850ec1b573113a89b9f9a75079b963a1dcd0f774d96e68b08b29f221d + source_hash: 6f1e2b7bbeb21f4e49af9240e77667f449d6dc02d89bf70f9e3db721326e1824 source_path: reference/test.md workflow: 15 --- # Тести -- Повний набір для тестування (сьюти, live, Docker): [Тестування](/uk/help/testing) +- Повний набір тестування (с’юти, live, Docker): [Тестування](/uk/help/testing) -- `pnpm test:force`: завершує будь-який завислий процес gateway, який утримує стандартний контрольний порт, а потім запускає повний набір Vitest з ізольованим портом gateway, щоб тести сервера не конфліктували із запущеним екземпляром. Використовуйте це, коли попередній запуск gateway залишив зайнятим порт 18789. -- `pnpm test:coverage`: запускає набір unit-тестів з V8 coverage (через `vitest.unit.config.ts`). Глобальні пороги становлять 70% для lines/branches/functions/statements. Coverage виключає точки входу з важкою інтеграцією (обв’язка CLI, мости gateway/telegram, статичний сервер webchat), щоб зосередити ціль на логіці, придатній для unit-тестування. -- `pnpm test:coverage:changed`: запускає unit coverage лише для файлів, змінених відносно `origin/main`. -- `pnpm test:changed`: розгортає змінені git-шляхи в scoped-режими Vitest, коли diff торкається лише routable файлів source/test. Зміни config/setup, як і раніше, повертаються до нативного запуску root projects, щоб зміни в обв’язці за потреби перезапускали ширший набір. -- `pnpm changed:lanes`: показує архітектурні режими, які спрацьовують для diff відносно `origin/main`. -- `pnpm check:changed`: запускає розумну перевірку changed для diff відносно `origin/main`. Вона запускає core-роботи з core test lanes, роботу extensions — з extension test lanes, зміни лише в тестах — тільки з test typecheck/tests, а також розширює зміни публічного Plugin SDK або plugin-contract до валідації extensions. -- `pnpm test`: спрямовує явні цілі file/directory через scoped-режими Vitest. Ненацілені запуски тепер виконують одинадцять послідовних shard-конфігів (`vitest.full-core-unit-src.config.ts`, `vitest.full-core-unit-security.config.ts`, `vitest.full-core-unit-ui.config.ts`, `vitest.full-core-unit-support.config.ts`, `vitest.full-core-support-boundary.config.ts`, `vitest.full-core-contracts.config.ts`, `vitest.full-core-bundled.config.ts`, `vitest.full-core-runtime.config.ts`, `vitest.full-agentic.config.ts`, `vitest.full-auto-reply.config.ts`, `vitest.full-extensions.config.ts`) замість одного гігантського процесу root-project. -- Вибрані тестові файли `plugin-sdk` і `commands` тепер спрямовуються через окремі легкі режими, які зберігають лише `test/setup.ts`, залишаючи runtime-важкі випадки у їхніх наявних режимах. -- Вибрані вихідні helper-файли `plugin-sdk` і `commands` також зіставляють `pnpm test:changed` з явними сусідніми тестами в цих легких режимах, щоб невеликі зміни helper-файлів не спричиняли повторний запуск важких наборів із backing runtime. -- `auto-reply` тепер також розділено на три окремі конфіги (`core`, `top-level`, `reply`), щоб harness для reply не домінував над легшими top-level тестами status/token/helper. -- Базовий конфіг Vitest тепер типово використовує `pool: "threads"` і `isolate: false`, а спільний неізольований runner увімкнено в усіх конфігах репозиторію. +- `pnpm test:force`: Завершує будь-який завислий процес gateway, який утримує типовий порт керування, а потім запускає повний набір Vitest з ізольованим портом gateway, щоб тести сервера не конфліктували із запущеним екземпляром. Використовуйте це, коли попередній запуск gateway залишив зайнятим порт 18789. +- `pnpm test:coverage`: Запускає набір unit-тестів із покриттям V8 (через `vitest.unit.config.ts`). Глобальні пороги становлять 70% для рядків/гілок/функцій/інструкцій. Із покриття виключено entrypoint-и з великою часткою інтеграції (обв’язка CLI, мости gateway/telegram, статичний сервер webchat), щоб ціль залишалася зосередженою на логіці, придатній для unit-тестування. +- `pnpm test:coverage:changed`: Запускає покриття unit-тестів лише для файлів, змінених відносно `origin/main`. +- `pnpm test:changed`: розгортає змінені git-шляхи в scoped lane-и Vitest, коли diff торкається лише routable файлів source/test. Зміни конфігурації/налаштування все одно повертаються до нативного запуску root project-ів, тож зміни в обв’язці за потреби спричиняють ширший повторний запуск. +- `pnpm changed:lanes`: показує архітектурні lane-и, які спрацьовують для diff відносно `origin/main`. +- `pnpm check:changed`: запускає розумну перевірку changed gate для diff відносно `origin/main`. Вона запускає core-роботи разом із lane-ами core-тестів, extension-роботи разом із lane-ами extension-тестів, зміни лише в тестах — тільки з typecheck/тестами для тестів, а зміни в публічному Plugin SDK або plugin-contract додатково розгортає до валідації extension. +- `pnpm test`: маршрутизує явні цілі файлів/каталогів через scoped lane-и Vitest. Запуски без цілей використовують фіксовані shard-групи й розгортаються до leaf config-ів для локального паралельного виконання; група extension завжди розгортається до per-extension shard config-ів замість одного великого root-project процесу. +- Вибрані тестові файли `plugin-sdk` і `commands` тепер маршрутизуються через окремі легкі lane-и, які залишають лише `test/setup.ts`, а важчі runtime-кейси — на наявних lane-ах. +- Вибрані допоміжні source-файли `plugin-sdk` і `commands` також зіставляють `pnpm test:changed` з явними sibling-тестами в цих легких lane-ах, тож невеликі зміни в helper-ах не спричиняють повторний запуск важких suite-ів, прив’язаних до runtime. +- `auto-reply` тепер також розділено на три окремі config-и (`core`, `top-level`, `reply`), щоб harness для reply не домінував над легшими top-level тестами status/token/helper. +- Базова конфігурація Vitest тепер типово використовує `pool: "threads"` і `isolate: false`, а спільний неізольований runner увімкнено в конфігураціях усього репозиторію. - `pnpm test:channels` запускає `vitest.channels.config.ts`. -- `pnpm test:extensions` запускає `vitest.extensions.config.ts`. -- `pnpm test:extensions`: запускає набори extension/plugin. -- `pnpm test:perf:imports`: вмикає звітність Vitest щодо тривалості імпорту та import-breakdown, і водночас використовує маршрутизацію scoped-режимів для явних цілей file/directory. -- `pnpm test:perf:imports:changed`: те саме профілювання імпорту, але лише для файлів, змінених відносно `origin/main`. -- `pnpm test:perf:changed:bench -- --ref ` вимірює продуктивність маршрутизованого changed-режиму порівняно з нативним запуском root-project для того самого закоміченого git diff. +- `pnpm test:extensions` і `pnpm test extensions` запускають усі shard-и extension/plugin. Важкі channel extension-и та OpenAI працюють як окремі shard-и; інші групи extension залишаються згрупованими. Використовуйте `pnpm test extensions/` для одного lane вбудованого plugin. +- `pnpm test:perf:imports`: вмикає звітність Vitest про тривалість імпортів і структуру імпортів, водночас зберігаючи scoped lane routing для явних цілей файлів/каталогів. +- `pnpm test:perf:imports:changed`: те саме профілювання імпортів, але лише для файлів, змінених відносно `origin/main`. +- `pnpm test:perf:changed:bench -- --ref ` вимірює продуктивність маршрутизованого шляху changed mode порівняно з нативним запуском root project-ів для того самого закоміченого git diff. - `pnpm test:perf:changed:bench -- --worktree` вимірює продуктивність поточного набору змін у worktree без попереднього коміту. - `pnpm test:perf:profile:main`: записує CPU-профіль для головного потоку Vitest (`.artifacts/vitest-main-profile`). - `pnpm test:perf:profile:runner`: записує CPU- і heap-профілі для unit runner (`.artifacts/vitest-runner-profile`). -- Інтеграція Gateway: вмикається через `OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm test` або `pnpm test:gateway`. -- `pnpm test:e2e`: запускає наскрізні smoke-тести gateway (multi-instance WS/HTTP/node pairing). Типово використовує `threads` + `isolate: false` з адаптивною кількістю workers у `vitest.e2e.config.ts`; налаштовується через `OPENCLAW_E2E_WORKERS=`, а для докладних логів установіть `OPENCLAW_E2E_VERBOSE=1`. -- `pnpm test:live`: запускає live-тести provider’ів (minimax/zai). Потребує API-ключів і `LIVE=1` (або provider-specific `*_LIVE_TEST=1`) для зняття skip. -- `pnpm test:docker:openwebui`: запускає Dockerized OpenClaw + Open WebUI, виконує вхід через Open WebUI, перевіряє `/api/models`, а потім запускає реальний проксійований чат через `/api/chat/completions`. Потребує придатного ключа live-моделі (наприклад, OpenAI у `~/.profile`), завантажує зовнішній образ Open WebUI і не вважається таким стабільним для CI, як звичайні набори unit/e2e. -- `pnpm test:docker:mcp-channels`: запускає seeded-контейнер Gateway і другий контейнер клієнта, який запускає `openclaw mcp serve`, а потім перевіряє routed discovery розмов, читання transcript, metadata вкладень, поведінку черги live-подій, outbound send routing, а також сповіщення про channel + permission у стилі Claude через реальний міст stdio. Перевірка сповіщень Claude читає сирі stdio MCP-кадри безпосередньо, щоб smoke-тест відображав те, що міст реально надсилає. +- Інтеграція gateway: вмикається через `OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm test` або `pnpm test:gateway`. +- `pnpm test:e2e`: Запускає наскрізні smoke-тести gateway (парування кількох екземплярів WS/HTTP/node). Типово використовує `threads` + `isolate: false` з адаптивною кількістю worker-ів у `vitest.e2e.config.ts`; налаштовується через `OPENCLAW_E2E_WORKERS=`, а для докладних логів встановіть `OPENCLAW_E2E_VERBOSE=1`. +- `pnpm test:live`: Запускає live-тести провайдерів (minimax/zai). Потребує API-ключів і `LIVE=1` (або специфічного для провайдера `*_LIVE_TEST=1`) для зняття пропуску. +- `pnpm test:docker:openwebui`: Запускає Dockerized OpenClaw + Open WebUI, виконує вхід через Open WebUI, перевіряє `/api/models`, а потім запускає реальний проксійований чат через `/api/chat/completions`. Потребує придатного ключа live-моделі (наприклад, OpenAI у `~/.profile`), завантажує зовнішній образ Open WebUI і не вважається таким, що має бути стабільним у CI, як звичайні набори unit/e2e. +- `pnpm test:docker:mcp-channels`: Запускає контейнер Gateway з попередньо заповненими даними і другий клієнтський контейнер, який запускає `openclaw mcp serve`, а потім перевіряє routed conversation discovery, читання transcript, метадані вкладень, поведінку черги live-подій, маршрутизацію вихідних відправлень і сповіщення про channel + permission у стилі Claude через реальний міст stdio. Перевірка сповіщень Claude читає сирі stdio MCP-кадри безпосередньо, тож smoke відображає те, що міст насправді надсилає. -## Локальна PR-перевірка +## Локальний PR gate -Для локальних перевірок перед злиттям PR запускайте: +Для локальних перевірок перед land/gate PR виконайте: - `pnpm check:changed` - `pnpm check` @@ -53,27 +52,27 @@ x-i18n: - `pnpm test` - `pnpm check:docs` -Якщо `pnpm test` дає flaky-результат на навантаженій машині, перезапустіть його один раз, перш ніж вважати це регресією, а потім ізолюйте проблему через `pnpm test `. Для хостів з обмеженою пам’яттю використовуйте: +Якщо `pnpm test` нестабільно спрацьовує на завантаженому хості, перезапустіть його один раз, перш ніж вважати це регресією, а потім ізолюйте через `pnpm test `. Для хостів з обмеженою пам’яттю використовуйте: - `OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test` - `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed` -## Bench затримки моделей (локальні ключі) +## Бенч затримки моделі (локальні ключі) Скрипт: [`scripts/bench-model.ts`](https://github.com/openclaw/openclaw/blob/main/scripts/bench-model.ts) Використання: - `source ~/.profile && pnpm tsx scripts/bench-model.ts --runs 10` -- Необов’язкові змінні середовища: `MINIMAX_API_KEY`, `MINIMAX_BASE_URL`, `MINIMAX_MODEL`, `ANTHROPIC_API_KEY` -- Типовий prompt: “Відповідай одним словом: ok. Без розділових знаків чи додаткового тексту.” +- Необов’язкові env: `MINIMAX_API_KEY`, `MINIMAX_BASE_URL`, `MINIMAX_MODEL`, `ANTHROPIC_API_KEY` +- Типовий prompt: “Відповідай одним словом: ok. Без розділових знаків або додаткового тексту.” Останній запуск (2025-12-31, 20 запусків): - minimax median 1279ms (min 1114, max 2431) - opus median 2454ms (min 1224, max 3170) -## Bench запуску CLI +## Бенч запуску CLI Скрипт: [`scripts/bench-cli-startup.ts`](https://github.com/openclaw/openclaw/blob/main/scripts/bench-cli-startup.ts) @@ -94,15 +93,15 @@ x-i18n: - `pnpm tsx scripts/bench-cli-startup.ts --preset real --cpu-prof-dir .artifacts/cli-cpu` - `pnpm tsx scripts/bench-cli-startup.ts --json` -Пресети: +Preset-и: - `startup`: `--version`, `--help`, `health`, `health --json`, `status --json`, `status` - `real`: `health`, `status`, `status --json`, `sessions`, `sessions --json`, `agents list --json`, `gateway status`, `gateway status --json`, `gateway health --json`, `config get gateway.port` -- `all`: обидва пресети +- `all`: обидва preset-и -Вивід містить `sampleCount`, avg, p50, p95, min/max, розподіл exit-code/signal і підсумки max RSS для кожної команди. Необов’язкові `--cpu-prof-dir` / `--heap-prof-dir` записують V8-профілі для кожного запуску, щоб заміри часу й зняття профілів виконувалися тим самим harness. +Вивід містить `sampleCount`, avg, p50, p95, min/max, розподіл exit-code/signal і зведення max RSS для кожної команди. Необов’язкові `--cpu-prof-dir` / `--heap-prof-dir` записують профілі V8 для кожного запуску, тож вимірювання часу й захоплення профілів використовують один і той самий harness. -Угоди щодо збереженого виводу: +Умовні позначення для збереженого виводу: - `pnpm test:startup:bench:smoke` записує цільовий smoke-артефакт у `.artifacts/cli-startup-bench-smoke.json` - `pnpm test:startup:bench:save` записує артефакт повного набору в `.artifacts/cli-startup-bench-all.json` з `runs=5` і `warmup=1` @@ -111,24 +110,24 @@ x-i18n: Закомічений fixture: - `test/fixtures/cli-startup-bench.json` -- Оновлення: `pnpm test:startup:bench:update` -- Порівняння поточних результатів із fixture: `pnpm test:startup:bench:check` +- Оновіть через `pnpm test:startup:bench:update` +- Порівняйте поточні результати з fixture через `pnpm test:startup:bench:check` ## Onboarding E2E (Docker) -Docker необов’язковий; це потрібно лише для containerized smoke-тестів onboarding. +Docker необов’язковий; це потрібно лише для контейнеризованих smoke-тестів onboarding. -Повний cold-start потік у чистому Linux-контейнері: +Повний cold-start flow у чистому Linux-контейнері: ```bash scripts/e2e/onboard-docker.sh ``` -Цей скрипт керує інтерактивним майстром через pseudo-tty, перевіряє файли config/workspace/session, потім запускає gateway і виконує `openclaw health`. +Цей скрипт керує інтерактивним wizard через pseudo-tty, перевіряє файли config/workspace/session, потім запускає gateway і виконує `openclaw health`. -## Smoke-тест імпорту QR (Docker) +## QR import smoke (Docker) -Гарантує, що `qrcode-terminal` завантажується в підтримуваних Docker runtime Node (Node 24 типово, Node 22 сумісний): +Переконується, що `qrcode-terminal` завантажується в підтримуваних Docker runtime Node (Node 24 типово, Node 22 сумісний): ```bash pnpm test:docker:qr