Release and CI
Testy
-
Pełny zestaw testowy (zestawy, live, Docker): Testowanie
-
Walidacja aktualizacji i pakietów pluginów: Testowanie aktualizacji i pluginów
-
pnpm test:force: Zabija wszelkie pozostające procesy Gateway zajmujące domyślny port sterowania, a następnie uruchamia pełny zestaw Vitest z izolowanym portem Gateway, aby testy serwera nie kolidowały z działającą instancją. Użyj tego, gdy wcześniejsze uruchomienie Gateway pozostawiło zajęty port 18789. -
pnpm test:coverage: Uruchamia zestaw testów jednostkowych z pokryciem V8 (przezvitest.unit.config.ts). Jest to bramka pokrycia domyślnej ścieżki jednostkowej, a nie pokrycie wszystkich plików w całym repozytorium. Progi wynoszą 70% dla linii/funkcji/instrukcji oraz 55% dla gałęzi. Ponieważcoverage.allma wartość false, a domyślna ścieżka zakresuje uwzględnienia pokrycia do niewymagających szybkiego trybu testów jednostkowych z sąsiednimi plikami źródłowymi, bramka mierzy źródła należące do tej ścieżki, zamiast każdego przechodniego importu, który przypadkiem załaduje. -
pnpm test:coverage:changed: Uruchamia pokrycie testów jednostkowych tylko dla plików zmienionych odorigin/main. -
pnpm test:changed: tani, inteligentny przebieg testów zmian. Uruchamia precyzyjne cele z bezpośrednich edycji testów, sąsiednich plików*.test.ts, jawnych mapowań źródeł i lokalnego grafu importów. Szerokie zmiany konfiguracji/pakietów są pomijane, chyba że mapują się na precyzyjne testy. -
OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed: jawny szeroki przebieg testów zmian. Użyj go, gdy edycja uprzęży testowej/konfiguracji/pakietu powinna wrócić do szerszego zachowania Vitest dla zmienionych testów. -
pnpm changed:lanes: pokazuje ścieżki architektoniczne wyzwolone przez diff względemorigin/main. -
pnpm check:changed: uruchamia inteligentną bramkę sprawdzania zmian dla diffu względemorigin/main. Uruchamia typecheck, lint i polecenia ochronne dla dotkniętych ścieżek architektonicznych, ale nie uruchamia testów Vitest. Do dowodu testowego użyjpnpm test:changedlub jawnegopnpm test <target>. -
pnpm test: kieruje jawne cele plików/katalogów przez zakresowane ścieżki Vitest. Uruchomienia bez celu używają stałych grup shardów i rozwijają się do konfiguracji liści dla lokalnego wykonania równoległego; grupa rozszerzeń zawsze rozwija się do konfiguracji shardów per rozszerzenie zamiast jednego ogromnego procesu projektu głównego. -
Uruchomienia wrappera testów kończą się krótkim podsumowaniem
[test] passed|failed|skipped ... in .... Własna linia czasu trwania Vitest pozostaje szczegółem per shard. -
Współdzielony stan testów OpenClaw: używaj
src/test-utils/openclaw-test-state.tsz Vitest, gdy test potrzebuje izolowanegoHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH, fixture konfiguracji, workspace, katalogu agenta lub magazynu auth-profile. -
Pomocniki E2E procesów: używaj
test/helpers/openclaw-test-instance.ts, gdy test E2E na poziomie procesu Vitest potrzebuje działającego Gateway, środowiska CLI, przechwytywania logów i sprzątania w jednym miejscu. -
Pomocniki E2E Docker/Bash: ścieżki, które source'ują
scripts/lib/docker-e2e-image.sh, mogą przekazaćdocker_e2e_test_state_shell_b64 <label> <scenario>do kontenera i zdekodować go przy użyciuscripts/lib/openclaw-e2e-instance.sh; skrypty multi-home mogą przekazaćdocker_e2e_test_state_function_b64i wywołaćopenclaw_test_state_create <label> <scenario>w każdym przepływie. Wywołujący niższego poziomu mogą użyćscripts/lib/openclaw-test-state.mjs shell --label <name> --scenario <name>dla fragmentu powłoki w kontenerze albonode scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --jsondla możliwego do source'owania pliku środowiska hosta.--przedcreatezapobiega traktowaniu--env-filejako flagi Node przez nowsze runtime’y Node. Ścieżki Docker/Bash uruchamiające Gateway mogą source'owaćscripts/lib/openclaw-e2e-instance.shwewnątrz kontenera w celu rozwiązywania entrypointu, startu mocka OpenAI, uruchomienia Gateway na pierwszym planie/w tle, sond gotowości, eksportu środowiska stanu, zrzutów logów i sprzątania procesów. -
Pełne, rozszerzeniowe oraz include-pattern uruchomienia shardów aktualizują lokalne dane czasowe w
.artifacts/vitest-shard-timings.json; późniejsze uruchomienia całych konfiguracji używają tych czasów, aby równoważyć wolne i szybkie shardy. Shardy CI include-pattern dopisują nazwę shardu do klucza czasów, co utrzymuje widoczność czasów shardów filtrowanych bez zastępowania danych czasowych całej konfiguracji. UstawOPENCLAW_TEST_PROJECTS_TIMINGS=0, aby zignorować lokalny artefakt czasów. -
Wybrane pliki testowe
plugin-sdkicommandssą teraz kierowane przez dedykowane lekkie ścieżki, które zachowują tylkotest/setup.ts, pozostawiając przypadki ciężkie runtime’owo na ich istniejących ścieżkach. -
Pliki źródłowe z sąsiednimi testami mapują się na tego sąsiada, zanim wrócą do szerszych globów katalogowych. Edycje pomocników w
src/channels/plugins/contracts/test-helpers,src/plugin-sdk/test-helpersisrc/plugins/contractsużywają lokalnego grafu importów, aby uruchomić importujące testy zamiast szeroko uruchamiać każdy shard, gdy ścieżka zależności jest precyzyjna. -
auto-replydzieli się teraz także na trzy dedykowane konfiguracje (core,top-level,reply), aby uprząż odpowiedzi nie dominowała lżejszych testów statusu/tokenów/pomocników najwyższego poziomu. -
Bazowa konfiguracja Vitest teraz domyślnie używa
pool: "threads"iisolate: false, z włączonym współdzielonym nieizolowanym runnerem w konfiguracjach repozytorium. -
pnpm test:channelsuruchamiavitest.channels.config.ts. -
pnpm test:extensionsipnpm test extensionsuruchamiają wszystkie shardy rozszerzeń/pluginów. Ciężkie pluginy kanałów, plugin przeglądarki i OpenAI działają jako dedykowane shardy; pozostałe grupy pluginów pozostają zgrupowane. Użyjpnpm test extensions/<id>dla jednej ścieżki bundlowanego pluginu. -
pnpm test:perf:imports: włącza raportowanie czasu trwania importów Vitest oraz podziału importów, nadal używając zakresowanego routingu ścieżek dla jawnych celów plików/katalogów. -
pnpm test:perf:imports:changed: to samo profilowanie importów, ale tylko dla plików zmienionych odorigin/main. -
pnpm test:perf:changed:bench -- --ref <git-ref>benchmarkuje kierowaną ścieżkę trybu zmian względem natywnego uruchomienia projektu głównego dla tego samego zatwierdzonego diffu git. -
pnpm test:perf:changed:bench -- --worktreebenchmarkuje bieżący zestaw zmian w worktree bez wcześniejszego commitowania. -
pnpm test:perf:profile:main: zapisuje profil CPU dla głównego wątku Vitest (.artifacts/vitest-main-profile). -
pnpm test:perf:profile:runner: zapisuje profile CPU + heap dla runnera jednostkowego (.artifacts/vitest-runner-profile). -
pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json: uruchamia seryjnie każdą liściową konfigurację Vitest pełnego zestawu i zapisuje pogrupowane dane czasu trwania oraz artefakty JSON/log per konfiguracja. Test Performance Agent używa tego jako punktu bazowego przed próbą napraw wolnych testów. -
pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json: porównuje pogrupowane raporty po zmianie ukierunkowanej na wydajność. -
Integracja Gateway: włączana opcjonalnie przez
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm testlubpnpm test:gateway. -
pnpm test:e2e: Uruchamia end-to-end smoke testy Gateway (parowanie wielu instancji WS/HTTP/node). Domyślnie używathreads+isolate: falsez adaptacyjnymi workerami wvitest.e2e.config.ts; dostrój przezOPENCLAW_E2E_WORKERS=<n>i ustawOPENCLAW_E2E_VERBOSE=1dla szczegółowych logów. -
pnpm test:live: Uruchamia testy live dostawców (minimax/zai). Wymaga kluczy API orazLIVE=1(lub specyficznego dla dostawcy*_LIVE_TEST=1), aby odblokować. -
pnpm test:docker:all: Buduje współdzielony obraz live-test, pakuje OpenClaw raz jako tarball npm, buduje/ponownie używa bazowego obrazu runnera Node/Git oraz obrazu funkcjonalnego, który instaluje ten tarball do/app, a następnie uruchamia ścieżki smoke Docker zOPENCLAW_SKIP_DOCKER_BUILD=1przez ważony scheduler. Bazowy obraz (OPENCLAW_DOCKER_E2E_BARE_IMAGE) jest używany dla ścieżek instalatora/aktualizacji/zależności pluginów; te ścieżki montują wstępnie zbudowany tarball zamiast używać skopiowanych źródeł repozytorium. Obraz funkcjonalny (OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE) jest używany dla normalnych ścieżek funkcjonalności zbudowanej aplikacji.scripts/package-openclaw-for-docker.mjsjest jedynym lokalnym/CI packerem pakietu i waliduje tarball orazdist/postinstall-inventory.json, zanim Docker go użyje. Definicje ścieżek Docker znajdują się wscripts/lib/docker-e2e-scenarios.mjs; logika planera znajduje się wscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjswykonuje wybrany plan.node scripts/test-docker-all.mjs --plan-jsonemituje należący do schedulera plan CI dla wybranych ścieżek, typów obrazów, potrzeb pakietu/obrazu live, scenariuszy stanu i kontroli poświadczeń bez budowania ani uruchamiania Docker.OPENCLAW_DOCKER_ALL_PARALLELISM=<n>kontroluje sloty procesów i domyślnie wynosi 10;OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>kontroluje wrażliwą na dostawców pulę końcową i domyślnie wynosi 10. Domyślne limity ciężkich ścieżek toOPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=10iOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; limity dostawców domyślnie wynoszą jedną ciężką ścieżkę na dostawcę przezOPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT=4,OPENCLAW_DOCKER_ALL_LIVE_CODEX_LIMIT=4iOPENCLAW_DOCKER_ALL_LIVE_GEMINI_LIMIT=4. UżyjOPENCLAW_DOCKER_ALL_WEIGHT_LIMITlubOPENCLAW_DOCKER_ALL_DOCKER_LIMITdla większych hostów. Jeśli jedna ścieżka przekroczy efektywny limit wagi lub zasobów na hoście o niskiej równoległości, nadal może wystartować z pustej puli i będzie działać sama, dopóki nie zwolni pojemności. Starty ścieżek są domyślnie rozłożone co 2 sekundy, aby uniknąć lokalnych burz tworzenia w daemonie Docker; nadpisz przezOPENCLAW_DOCKER_ALL_START_STAGGER_MS=<ms>. Runner domyślnie wykonuje preflight Docker, czyści przestarzałe kontenery E2E OpenClaw, emituje status aktywnych ścieżek co 30 sekund, współdzieli cache narzędzi CLI dostawców między kompatybilnymi ścieżkami, domyślnie ponawia przejściowe awarie dostawców live jeden raz (OPENCLAW_DOCKER_ALL_LIVE_RETRIES=<n>) i przechowuje czasy ścieżek w.artifacts/docker-tests/lane-timings.jsondla kolejności od najdłuższych w późniejszych uruchomieniach. UżyjOPENCLAW_DOCKER_ALL_DRY_RUN=1, aby wypisać manifest ścieżek bez uruchamiania Docker,OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS=<ms>, aby dostroić wyjście statusu, alboOPENCLAW_DOCKER_ALL_TIMINGS=0, aby wyłączyć ponowne użycie czasów. UżyjOPENCLAW_DOCKER_ALL_LIVE_MODE=skiptylko dla deterministycznych/lokalnych ścieżek alboOPENCLAW_DOCKER_ALL_LIVE_MODE=onlytylko dla ścieżek dostawców live; aliasy pakietu topnpm test:docker:local:allipnpm test:docker:live:all. Tryb tylko live łączy główne i końcowe ścieżki live w jedną pulę od najdłuższych, aby koszyki dostawców mogły razem pakować prace Claude, Codex i Gemini. Runner przestaje planować nowe ścieżki pulowane po pierwszej awarii, chyba że ustawionoOPENCLAW_DOCKER_ALL_FAIL_FAST=0, a każda ścieżka ma 120-minutowy zapasowy limit czasu nadpisywalny przezOPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS; wybrane ścieżki live/końcowe używają ciaśniejszych limitów per ścieżka. Polecenia konfiguracji Docker backendu CLI mają własny limit czasu przezOPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS(domyślnie 180). Logi per ścieżka,summary.json,failures.jsoni czasy faz są zapisywane pod.artifacts/docker-tests/<run-id>/; użyjpnpm test:docker:timings <summary.json>, aby sprawdzić wolne ścieżki, orazpnpm test:docker:rerun <run-id|summary.json|failures.json>, aby wypisać tanie, ukierunkowane polecenia ponownego uruchomienia. -
pnpm test:docker:browser-cdp-snapshot: Buduje źródłowy kontener E2E oparty na Chromium, uruchamia surowe CDP oraz izolowany Gateway, wykonujebrowser doctor --deepi weryfikuje, że snapshoty ról CDP obejmują URL-e linków, elementy klikalne promowane przez kursor, referencje iframe i metadane ramek. -
Sondy live Docker backendu CLI można uruchamiać jako ukierunkowane ścieżki, na przykład
pnpm test:docker:live-cli-backend:codex,pnpm test:docker:live-cli-backend:codex:resumelubpnpm test:docker:live-cli-backend:codex:mcp. Claude i Gemini mają pasujące aliasy:resumei:mcp. -
pnpm test:docker:openwebui: Uruchamia zdockeryzowane OpenClaw + Open WebUI, loguje się przez Open WebUI, sprawdza/api/models, a następnie uruchamia rzeczywisty proxowany chat przez/api/chat/completions. Wymaga używalnego klucza modelu live (na przykład OpenAI w~/.profile), pobiera zewnętrzny obraz Open WebUI i nie oczekuje się, że będzie stabilne w CI jak normalne zestawy unit/e2e. -
pnpm test:docker:mcp-channels: Uruchamia zasiany kontener Gateway i drugi kontener klienta, który uruchamiaopenclaw mcp serve, a następnie weryfikuje odnajdywanie routowanych rozmów, odczyty transkrypcji, metadane załączników, zachowanie kolejki zdarzeń na żywo, routing wysyłania wychodzącego oraz powiadomienia kanałowe i uprawnień w stylu Claude przez rzeczywisty most stdio. Asercja powiadomień Claude odczytuje bezpośrednio surowe ramki stdio MCP, więc smoke odzwierciedla to, co most faktycznie emituje. -
pnpm test:docker:upgrade-survivor: Instaluje spakowany tarball OpenClaw na brudnym fiksturze starego użytkownika, uruchamia aktualizację pakietu oraz nieinteraktywnego doctora bez kluczy dostawcy ani kanału na żywo, a następnie uruchamia Gateway przez local loopback i sprawdza, czy agenci, konfiguracja kanału, listy dozwolonych pluginów, pliki workspace/sesji, przestarzały stan zależności legacy pluginu, uruchamianie oraz status RPC przetrwają. -
pnpm test:docker:published-upgrade-survivor: Domyślnie instalujeopenclaw@latest, zasiewa realistyczne pliki istniejącego użytkownika bez kluczy dostawcy ani kanału na żywo, konfiguruje tę bazę za pomocą wbudowanej receptury poleceniaopenclaw config set, aktualizuje tę opublikowaną instalację do spakowanego tarballa OpenClaw, uruchamia nieinteraktywnego doctora, zapisuje.artifacts/upgrade-survivor/summary.json, a następnie uruchamia Gateway przez local loopback i sprawdza, czy skonfigurowane intencje, pliki workspace/sesji, przestarzała konfiguracja pluginu i legacy stan zależności, uruchamianie,/healthz,/readyzoraz status RPC przetrwają albo zostaną poprawnie naprawione. Nadpisz jedną bazę za pomocąOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, rozwiń dokładną lokalną macierz za pomocąOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS, np.[email protected] [email protected] [email protected], albo dodaj fikstury scenariuszy za pomocąOPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues; zestaw reported-issues obejmujeconfigured-plugin-installs, aby zweryfikować, że skonfigurowane zewnętrzne pluginy OpenClaw instalują się automatycznie podczas aktualizacji, orazstale-source-plugin-shadow, aby cienie pluginów dostępnych tylko w źródłach nie psuły uruchamiania. Package Acceptance udostępnia je jakopublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesipublished_upgrade_survivor_scenariosoraz rozwiązuje metatokeny bazowe, takie jaklast-stable-4luball-since-2026.4.23, zanim przekaże dokładne specyfikacje pakietów do lane’ów Docker. -
pnpm test:docker:update-migration: Uruchamia harness published-upgrade survivor w scenariuszuplugin-deps-cleanup, który intensywnie wykonuje czyszczenie, domyślnie zaczynając od[email protected]. Osobny workflowUpdate Migrationrozszerza ten lane przezbaselines=all-since-2026.4.23, dzięki czemu każdy stabilny opublikowany pakiet od.23wzwyż aktualizuje się do kandydata i dowodzi czyszczenia zależności skonfigurowanych pluginów poza Full Release CI. -
pnpm test:docker:plugins: Uruchamia smoke instalacji/aktualizacji dla ścieżki lokalnej,file:, pakietów z rejestru npm z wyniesionymi zależnościami, ruchomych referencji git, fikstur ClawHub, aktualizacji marketplace oraz włączania/inspekcji pakietu Claude.
Lokalna bramka PR
Dla lokalnych kontroli PR land/gate uruchom:
pnpm check:changedpnpm checkpnpm check:test-typespnpm buildpnpm testpnpm check:docs
Jeśli pnpm test sporadycznie zawodzi na obciążonym hoście, uruchom ponownie raz, zanim potraktujesz to jako regresję, a następnie wyizoluj problem za pomocą pnpm test <path/to/test>. Dla hostów z ograniczoną pamięcią użyj:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed
Test opóźnień modeli (lokalne klucze)
Skrypt: scripts/bench-model.ts
Użycie:
source ~/.profile && pnpm tsx scripts/bench-model.ts --runs 10- Opcjonalne zmienne środowiskowe:
MINIMAX_API_KEY,MINIMAX_BASE_URL,MINIMAX_MODEL,ANTHROPIC_API_KEY - Domyślny prompt: "Odpowiedz jednym słowem: ok. Bez interpunkcji ani dodatkowego tekstu."
Ostatnie uruchomienie (2025-12-31, 20 przebiegów):
- minimax mediana 1279 ms (min. 1114, maks. 2431)
- opus mediana 2454 ms (min. 1224, maks. 3170)
Test czasu startu CLI
Skrypt: scripts/bench-cli-startup.ts
Użycie:
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.tspnpm tsx scripts/bench-cli-startup.ts --runs 12pnpm tsx scripts/bench-cli-startup.ts --preset realpnpm tsx scripts/bench-cli-startup.ts --preset real --case status --case gatewayStatus --runs 3pnpm tsx scripts/bench-cli-startup.ts --preset real --case tasksJson --case tasksListJson --case tasksAuditJson --runs 3pnpm tsx scripts/bench-cli-startup.ts --entry openclaw.mjs --entry-secondary dist/entry.js --preset allpnpm tsx scripts/bench-cli-startup.ts --preset all --output .artifacts/cli-startup-bench-all.jsonpnpm tsx scripts/bench-cli-startup.ts --preset real --case gatewayStatusJson --output .artifacts/cli-startup-bench-smoke.jsonpnpm tsx scripts/bench-cli-startup.ts --preset real --cpu-prof-dir .artifacts/cli-cpupnpm tsx scripts/bench-cli-startup.ts --json
Presety:
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: oba presety
Dane wyjściowe obejmują sampleCount, średnią, p50, p95, min./maks., rozkład kodów wyjścia/sygnałów oraz podsumowania maksymalnego RSS dla każdego polecenia. Opcjonalne --cpu-prof-dir / --heap-prof-dir zapisują profile V8 dla każdego przebiegu, aby pomiar czasu i przechwytywanie profilu korzystały z tego samego mechanizmu.
Konwencje zapisanych danych wyjściowych:
pnpm test:startup:bench:smokezapisuje docelowy artefakt smoke w.artifacts/cli-startup-bench-smoke.jsonpnpm test:startup:bench:savezapisuje artefakt pełnego zestawu w.artifacts/cli-startup-bench-all.json, używającruns=5iwarmup=1pnpm test:startup:bench:updateodświeża wersjonowany fixture bazowy wtest/fixtures/cli-startup-bench.json, używającruns=5iwarmup=1
Wersjonowany fixture:
test/fixtures/cli-startup-bench.json- Odśwież za pomocą
pnpm test:startup:bench:update - Porównaj bieżące wyniki z fixture za pomocą
pnpm test:startup:bench:check
Onboarding E2E (Docker)
Docker jest opcjonalny; jest to potrzebne tylko do skonteneryzowanych testów smoke onboardingu.
Pełny przepływ zimnego startu w czystym kontenerze Linux:
scripts/e2e/onboard-docker.sh
Ten skrypt steruje interaktywnym kreatorem przez pseudo-tty, weryfikuje pliki konfiguracji/workspace/sesji, a następnie uruchamia Gateway i wykonuje openclaw health.
Smoke importu QR (Docker)
Zapewnia, że utrzymywany pomocnik runtime QR ładuje się w obsługiwanych runtime Docker Node (domyślnie Node 24, zgodny Node 22):
pnpm test:docker:qr