Testing
Testowanie
OpenClaw ma trzy zestawy testów Vitest (jednostkowe/integracyjne, e2e, live) oraz niewielki zestaw runnerów Docker. Ten dokument jest przewodnikiem „jak testujemy”:
- Co obejmuje każdy zestaw (i czego celowo nie obejmuje).
- Jakie polecenia uruchamiać w typowych przepływach pracy (lokalnie, przed wypchnięciem, podczas debugowania).
- Jak testy live wykrywają dane uwierzytelniające i wybierają modele/dostawców.
- Jak dodawać regresje dla rzeczywistych problemów z modelami/dostawcami.
Szybki start
W większość dni:
- Pełna bramka (oczekiwana przed wypchnięciem):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Szybsze lokalne uruchomienie pełnego zestawu na przestronnej maszynie:
pnpm test:max - Bezpośrednia pętla obserwowania Vitest:
pnpm test:watch - Bezpośrednie wskazywanie plików obsługuje teraz także ścieżki rozszerzeń/kanałów:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Gdy iterujesz nad pojedynczą awarią, najpierw preferuj uruchomienia ukierunkowane.
- Witryna QA oparta na Docker:
pnpm qa:lab:up - Pasmo QA oparte na maszynie wirtualnej Linux:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
Gdy dotykasz testów lub chcesz mieć większą pewność:
- Bramka pokrycia:
pnpm test:coverage - Zestaw E2E:
pnpm test:e2e
Katalogi tymczasowe testów
Preferuj współdzielone helpery w test/helpers/temp-dir.ts dla katalogów
tymczasowych należących do testów. Jawnie określają właścicielstwo i utrzymują sprzątanie w tym samym
cyklu życia testu:
const tempDirs = useAutoCleanupTempDirTracker(afterEach); it("uses a temp workspace", () => { const workspace = tempDirs.make("openclaw-example-"); // use workspace});useAutoCleanupTempDirTracker(afterEach) celowo nie udostępnia ręcznej metody sprzątania; Vitest
jest właścicielem sprzątania po każdym teście. Istniejące helpery niższego poziomu pozostają dla testów, które
jeszcze nie zostały przeniesione, ale nowe i migrowane testy powinny używać automatycznie czyszczącego
trackera. Unikaj nowego użycia ręcznych makeTempDir, cleanupTempDirs lub
createTempDirTracker oraz unikaj nowych bezpośrednich wywołań fs.mkdtemp* w testach,
chyba że przypadek jawnie weryfikuje surowe zachowanie temp-dir. Dodaj audytowalny
komentarz zezwalający z konkretnym powodem, gdy test celowo potrzebuje bezpośredniego katalogu
tymczasowego:
// openclaw-temp-dir: allow verifies raw fs cleanup behaviorconst workspace = fs.mkdtempSync(prefix);Dla widoczności migracji node scripts/report-test-temp-creations.mjs raportuje
nowe bezpośrednie tworzenie temp-dir i nowe ręczne użycie współdzielonych helperów w dodanych liniach
diffu, bez blokowania istniejących stylów sprzątania. Jego zakres plików celowo
stosuje tę samą klasyfikację ścieżek testów, której używa scripts/changed-lanes.mjs,
zamiast utrzymywać oddzielną heurystykę nazw plików helperów testowych, pomijając
samą implementację współdzielonego helpera. check:changed uruchamia ten raport dla
zmienionych ścieżek testów jako sygnał CI tylko z ostrzeżeniem; ustalenia są adnotacjami ostrzegawczymi
GitHub, a nie awariami.
Podczas debugowania rzeczywistych dostawców/modeli (wymaga prawdziwych danych uwierzytelniających):
- Zestaw live (modele + sondy narzędzi/obrazów Gateway):
pnpm test:live - Ukierunkowanie jednego pliku live w trybie cichym:
pnpm test:live -- src/agents/models.profiles.live.test.ts - Raporty wydajności runtime: wywołaj
OpenClaw Performancezlive_openai_candidate=truedla rzeczywistego przebiegu agentaopenai/gpt-5.5albodeep_profile=truedla artefaktów CPU/sterty/śledzenia Kova. Codzienne zaplanowane uruchomienia publikują artefakty pasm mock-provider, deep-profile i GPT 5.5 doopenclaw/clawgrit-reports, gdyCLAWGRIT_REPORTS_TOKENjest skonfigurowany. Raport mock-provider obejmuje również liczby dotyczące rozruchu Gateway na poziomie źródeł, pamięci, obciążenia pluginów, powtarzanej pętli hello-loop fałszywego modelu oraz startu CLI. - Przegląd modeli live w Docker:
pnpm test:docker:live-models- Każdy wybrany model uruchamia teraz przebieg tekstowy oraz małą sondę w stylu odczytu pliku.
Modele, których metadane deklarują wejście
image, uruchamiają też mały przebieg obrazowy. Wyłącz dodatkowe sondy za pomocąOPENCLAW_LIVE_MODEL_FILE_PROBE=0lubOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0podczas izolowania awarii dostawcy. - Pokrycie CI: codzienne
OpenClaw Scheduled Live And E2E Checksi ręczneOpenClaw Release Checksoba wywołują wielokrotnego użytku workflow live/E2E zinclude_live_suites: true, który obejmuje osobne zadania macierzy modeli live w Docker podzielone na shardy według dostawcy. - Dla ukierunkowanych ponownych uruchomień CI wywołaj
OpenClaw Live And E2E Checks (Reusable)zinclude_live_suites: trueilive_models_only: true. - Dodaj nowe sekrety dostawców o wysokim sygnale do
scripts/ci-hydrate-live-auth.shoraz.github/workflows/openclaw-live-and-e2e-checks-reusable.ymli jego zaplanowanych/wywoływanych przez wydanie callerów.
- Każdy wybrany model uruchamia teraz przebieg tekstowy oraz małą sondę w stylu odczytu pliku.
Modele, których metadane deklarują wejście
- Smoke test natywnego powiązanego czatu Codex:
pnpm test:docker:live-codex-bind- Uruchamia pasmo live Docker względem ścieżki app-server Codex, wiąże syntetyczny
Slack DM za pomocą
/codex bind, wykonuje/codex fasti/codex permissions, a następnie weryfikuje zwykłą odpowiedź i trasę załącznika obrazu przez natywne powiązanie pluginu zamiast ACP.
- Uruchamia pasmo live Docker względem ścieżki app-server Codex, wiąże syntetyczny
Slack DM za pomocą
- Smoke test uprzęży app-server Codex:
pnpm test:docker:live-codex-harness- Uruchamia przebiegi agenta Gateway przez należącą do pluginu uprząż app-server Codex,
weryfikuje
/codex statusi/codex models, a domyślnie wykonuje sondy obrazu, cron MCP, sub-agenta i Guardian. Wyłącz sondę sub-agenta za pomocąOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0podczas izolowania innych awarii app-server Codex. Dla ukierunkowanego sprawdzenia sub-agenta wyłącz pozostałe sondy:OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=1 pnpm test:docker:live-codex-harness. To kończy działanie po sondzie sub-agenta, chyba że ustawionoOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0.
- Uruchamia przebiegi agenta Gateway przez należącą do pluginu uprząż app-server Codex,
weryfikuje
- Smoke test instalacji Codex na żądanie:
pnpm test:docker:codex-on-demand- Instaluje spakowany tarball OpenClaw w Docker, uruchamia onboarding z kluczem API OpenAI
i weryfikuje, że plugin Codex oraz zależność
@openai/codexzostały pobrane na żądanie do zarządzanego katalogu głównego projektu npm.
- Instaluje spakowany tarball OpenClaw w Docker, uruchamia onboarding z kluczem API OpenAI
i weryfikuje, że plugin Codex oraz zależność
- Smoke test zależności narzędzia pluginu live:
pnpm test:docker:live-plugin-tool- Pakuje fixture plugin z rzeczywistą zależnością
slugify, instaluje go przeznpm-pack:, weryfikuje zależność pod zarządzanym katalogiem głównym projektu npm, a następnie prosi model OpenAI live o wywołanie narzędzia pluginu i zwrócenie ukrytego sluga.
- Pakuje fixture plugin z rzeczywistą zależnością
- Smoke test polecenia ratunkowego Crestodian:
pnpm test:live:crestodian-rescue-channel- Opcjonalne, dodatkowo zabezpieczające sprawdzenie powierzchni polecenia ratunkowego kanału wiadomości.
Wykonuje
/crestodian status, kolejkuje trwałą zmianę modelu, odpowiada/crestodian yesi weryfikuje ścieżkę zapisu audytu/konfiguracji.
- Opcjonalne, dodatkowo zabezpieczające sprawdzenie powierzchni polecenia ratunkowego kanału wiadomości.
Wykonuje
- Smoke test plannera Crestodian w Docker:
pnpm test:docker:crestodian-planner- Uruchamia Crestodian w kontenerze bez konfiguracji z fałszywym Claude CLI w
PATHi weryfikuje, że rozmyty fallback plannera przekłada się na audytowany typowany zapis konfiguracji.
- Uruchamia Crestodian w kontenerze bez konfiguracji z fałszywym Claude CLI w
- Smoke test pierwszego uruchomienia Crestodian w Docker:
pnpm test:docker:crestodian-first-run- Startuje z pustego katalogu stanu OpenClaw, weryfikuje nowoczesny punkt wejścia onboard
Crestodian, stosuje zapisy setup/model/agent/plugin Discord + SecretRef,
waliduje konfigurację i weryfikuje wpisy audytu. Ta sama ścieżka konfiguracji Ring 0
jest również objęta w QA Lab przez
pnpm openclaw qa suite --scenario crestodian-ring-zero-setup.
- Startuje z pustego katalogu stanu OpenClaw, weryfikuje nowoczesny punkt wejścia onboard
Crestodian, stosuje zapisy setup/model/agent/plugin Discord + SecretRef,
waliduje konfigurację i weryfikuje wpisy audytu. Ta sama ścieżka konfiguracji Ring 0
jest również objęta w QA Lab przez
- Smoke test kosztów Moonshot/Kimi: z ustawionym
MOONSHOT_API_KEYuruchomopenclaw models list --provider moonshot --json, a następnie uruchom izolowanyopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsonwzględemmoonshot/kimi-k2.6. Zweryfikuj, że JSON raportuje Moonshot/K2.6, a transkrypt asystenta przechowuje znormalizowaneusage.cost.
Runnery specyficzne dla QA
Te polecenia znajdują się obok głównych zestawów testów, gdy potrzebujesz realizmu QA-lab:
CI uruchamia QA Lab w dedykowanych workflow. Parzystość agentowa jest zagnieżdżona pod
QA-Lab - All Lanes i walidacją wydania, a nie jako samodzielny workflow PR.
Szeroka walidacja powinna używać Full Release Validation z
rerun_group=qa-parity albo grupy QA release-checks. Stabilne/domyślne sprawdzenia wydania
utrzymują wyczerpujący soak live/Docker za run_release_soak=true; profil
full wymusza włączenie soak. QA-Lab - All Lanes
uruchamia się nocą na main oraz z ręcznego wywołania z pasmem mock parity, pasmem live
Matrix, pasmem live Telegram zarządzanym przez Convex i pasmem live Discord
zarządzanym przez Convex jako zadaniami równoległymi. Zaplanowane QA i sprawdzenia wydań przekazują Matrix
--profile fast jawnie, podczas gdy domyślne wartości wejścia CLI Matrix i ręcznego workflow
pozostają all; ręczne wywołanie może podzielić all na zadania transport,
media, e2ee-smoke, e2ee-deep i e2ee-cli. OpenClaw Release Checks uruchamia parzystość oraz szybkie pasma Matrix i Telegram przed zatwierdzeniem
wydania, używając mock-openai/gpt-5.5 dla sprawdzeń transportu wydania, aby pozostały
deterministyczne i omijały normalny start pluginu dostawcy. Te Gateway transportu live
wyłączają wyszukiwanie w pamięci; zachowanie pamięci pozostaje objęte przez zestawy
QA parity.
Shardy pełnego wydania live media używają
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04, który ma już
ffmpeg i ffprobe. Shardy modeli/backendów live Docker używają współdzielonego obrazu
ghcr.io/openclaw/openclaw-live-test:<sha> zbudowanego raz dla wybranego
commita, a następnie pobierają go z OPENCLAW_SKIP_DOCKER_BUILD=1 zamiast przebudowywać
w każdym shardzie.
pnpm openclaw qa suite- Uruchamia scenariusze QA oparte na repozytorium bezpośrednio na hoście.
- Zapisuje artefakty najwyższego poziomu
qa-evidence.json,qa-suite-summary.jsoniqa-suite-report.mddla wybranego zestawu scenariuszy, w tym wybory scenariuszy mixed flow, Vitest i Playwright. - Gdy jest uruchamiane przez
pnpm openclaw qa run --qa-profile <profile>, osadza kartę wyników wybranego profilu taksonomii w tym samymqa-evidence.json.smoke-cizapisuje odchudzone dowody, co ustawiaevidenceMode: "slim"i pomijaexecutiondla poszczególnych wpisów.releaseobejmuje wybrany wycinek gotowości do wydania;allwybiera każdą aktywną kategorię dojrzałości i jest przeznaczone do jawnych uruchomień workflow QA Profile Evidence, gdy potrzebny jest pełny artefakt karty wyników. - Domyślnie uruchamia wiele wybranych scenariuszy równolegle z izolowanymi
workerami Gateway.
qa-channeldomyślnie używa współbieżności 4 (ograniczonej liczbą wybranych scenariuszy). Użyj--concurrency <count>, aby dostroić liczbę workerów, albo--concurrency 1dla starszej ścieżki szeregowej. - Kończy się kodem różnym od zera, gdy dowolny scenariusz zawiedzie. Użyj
--allow-failures, gdy chcesz uzyskać artefakty bez błędnego kodu wyjścia. - Obsługuje tryby dostawcy
live-frontier,mock-openaiiaimock.aimockuruchamia lokalny serwer dostawcy oparty na AIMock dla eksperymentalnego pokrycia fixture i mocków protokołu bez zastępowania ścieżkimock-openaiświadomej scenariuszy.
pnpm openclaw qa coverage --match <query>- Przeszukuje identyfikatory scenariuszy, tytuły, powierzchnie, identyfikatory pokrycia, odwołania do dokumentacji, odwołania do kodu, plugins i wymagania dostawców, a następnie wypisuje pasujące cele zestawu.
- Użyj tego przed uruchomieniem QA Lab, gdy znasz zmieniane zachowanie lub ścieżkę pliku, ale nie znasz najmniejszego scenariusza. Ma to wyłącznie charakter doradczy; nadal wybierz dowód mock, live, Multipass, Matrix lub transportowy na podstawie zmienianego zachowania.
pnpm test:plugins:kitchen-sink-live- Uruchamia pełny live zestaw prób Plugin OpenAI Kitchen Sink przez QA Lab. Instaluje
zewnętrzny pakiet Kitchen Sink, weryfikuje inwentarz powierzchni plugin SDK,
sprawdza
/healthzi/readyz, rejestruje dowody CPU/RSS Gateway, uruchamia live turę OpenAI i sprawdza diagnostykę adwersarialną. Wymaga live uwierzytelnienia OpenAI, takiego jakOPENAI_API_KEY. W uwodnionych sesjach Testbox automatycznie pobiera profil live-auth Testbox, gdy obecny jest helperopenclaw-testbox-env.
- Uruchamia pełny live zestaw prób Plugin OpenAI Kitchen Sink przez QA Lab. Instaluje
zewnętrzny pakiet Kitchen Sink, weryfikuje inwentarz powierzchni plugin SDK,
sprawdza
pnpm test:gateway:cpu-scenarios- Uruchamia benchmark startu Gateway oraz mały pakiet scenariuszy QA Lab z mockami
(
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) i zapisuje połączone podsumowanie obserwacji CPU w.artifacts/gateway-cpu-scenarios/. - Domyślnie flaguje tylko utrzymujące się obserwacje wysokiego CPU (
--cpu-core-warnplus--hot-wall-warn-ms), więc krótkie skoki podczas startu są rejestrowane jako metryki bez wyglądania jak wielominutowa regresja obciążenia Gateway. - Używa zbudowanych artefaktów
dist; najpierw uruchom build, gdy checkout nie ma jeszcze świeżego wyjścia runtime.
- Uruchamia benchmark startu Gateway oraz mały pakiet scenariuszy QA Lab z mockami
(
pnpm openclaw qa suite --runner multipass- Uruchamia ten sam zestaw QA w jednorazowej maszynie wirtualnej Linux Multipass.
- Zachowuje to samo zachowanie wyboru scenariuszy co
qa suitena hoście. - Ponownie używa tych samych flag wyboru dostawcy/modelu co
qa suite. - Uruchomienia live przekazują obsługiwane dane wejściowe uwierzytelniania QA, które są praktyczne dla gościa:
klucze dostawców oparte na env, ścieżkę konfiguracji dostawcy QA live oraz
CODEX_HOME, gdy jest obecne. - Katalogi wyjściowe muszą pozostać pod katalogiem głównym repozytorium, aby gość mógł zapisywać z powrotem przez zamontowany workspace.
- Zapisuje normalny raport QA i podsumowanie oraz logi Multipass w
.artifacts/qa-e2e/....
pnpm qa:lab:up- Uruchamia opartą na Dockerze stronę QA do pracy QA w stylu operatorskim.
pnpm test:docker:npm-onboard-channel-agent- Buduje tarball npm z bieżącego checkoutu, instaluje go globalnie w Dockerze, uruchamia nieinteraktywny onboarding klucza API OpenAI, domyślnie konfiguruje Telegram, weryfikuje, że spakowany runtime plugin ładuje się bez naprawy zależności przy starcie, uruchamia doctor i uruchamia jedną lokalną turę agenta wobec zamockowanego endpointu OpenAI.
- Użyj
OPENCLAW_NPM_ONBOARD_CHANNEL=discord, aby uruchomić tę samą ścieżkę instalacji pakietu z Discord.
pnpm test:docker:session-runtime-context- Uruchamia deterministyczny smoke Docker zbudowanej aplikacji dla osadzonych transkryptów kontekstu runtime.
Weryfikuje, że ukryty kontekst runtime OpenClaw jest utrwalany jako
niewyświetlany komunikat niestandardowy zamiast wyciekać do widocznej tury użytkownika,
następnie zasiewa dotknięty problemem uszkodzony JSONL sesji i weryfikuje, że
openclaw doctor --fixprzepisuje go do aktywnej gałęzi z kopią zapasową.
- Uruchamia deterministyczny smoke Docker zbudowanej aplikacji dla osadzonych transkryptów kontekstu runtime.
Weryfikuje, że ukryty kontekst runtime OpenClaw jest utrwalany jako
niewyświetlany komunikat niestandardowy zamiast wyciekać do widocznej tury użytkownika,
następnie zasiewa dotknięty problemem uszkodzony JSONL sesji i weryfikuje, że
pnpm test:docker:npm-telegram-live- Instaluje kandydujący pakiet OpenClaw w Dockerze, uruchamia onboarding zainstalowanego pakietu, konfiguruje Telegram przez zainstalowane CLI, a następnie ponownie używa live ścieżki QA Telegram z tym zainstalowanym pakietem jako testowanym Gateway SUT.
- Wrapper montuje z checkoutu tylko źródło harnessa
qa-lab; zainstalowany pakiet jest właścicielemdist,openclaw/plugin-sdki runtime bundled plugin, więc ścieżka nie miesza plugins z bieżącego checkoutu do testowanego pakietu. - Domyślnie używa
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta; ustawOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzalboOPENCLAW_CURRENT_PACKAGE_TGZ, aby zamiast instalacji z rejestru testować rozwiązany lokalny tarball. - Domyślnie emituje powtarzane pomiary czasu RTT w
qa-evidence.jsonzOPENCLAW_NPM_TELEGRAM_RTT_SAMPLES=20. NadpiszOPENCLAW_NPM_TELEGRAM_RTT_SAMPLES,OPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MSalboOPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURES, aby dostroić uruchomienie RTT.OPENCLAW_NPM_TELEGRAM_RTT_CHECKSprzyjmuje rozdzieloną przecinkami listę identyfikatorów kontroli QA Telegram do próbkowania; gdy nie jest ustawione, domyślną kontrolą obsługującą RTT jesttelegram-mentioned-message-reply. - Używa tych samych poświadczeń env Telegram albo źródła poświadczeń Convex co
pnpm openclaw qa telegram. Dla automatyzacji CI/wydania ustawOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexorazOPENCLAW_QA_CONVEX_SITE_URLi sekret roli. JeśliOPENCLAW_QA_CONVEX_SITE_URLoraz sekret roli Convex są obecne w CI, wrapper Docker wybiera Convex automatycznie. - Wrapper waliduje env poświadczeń Telegram albo Convex na hoście przed
pracą build/install Docker. Ustaw
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1tylko podczas celowego debugowania konfiguracji przed poświadczeniami. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainernadpisuje współdzieloneOPENCLAW_QA_CREDENTIAL_ROLEtylko dla tej ścieżki. Gdy wybrane są poświadczenia Convex i nie ustawiono roli, wrapper używaciw CI orazmaintainerpoza CI.- GitHub Actions udostępnia tę ścieżkę jako ręczny workflow maintainerów
NPM Telegram Beta E2E. Nie uruchamia się przy merge. Workflow używa środowiskaqa-live-sharedi dzierżaw poświadczeń Convex CI.
- GitHub Actions udostępnia także
Package Acceptancedla pobocznego dowodu produktu wobec jednego kandydującego pakietu. Przyjmuje zaufany ref, opublikowaną specyfikację npm, URL tarballa HTTPS plus SHA-256 albo artefakt tarballa z innego uruchomienia, przesyła znormalizowanyopenclaw-current.tgzjakopackage-under-test, a następnie uruchamia istniejący harmonogram Docker E2E z profilami ścieżek smoke, package, product, full albo custom. Ustawtelegram_mode=mock-openaialbolive-frontier, aby uruchomić workflow QA Telegram wobec tego samego artefaktupackage-under-test.- Najnowszy dowód produktu beta:
gh workflow run package-acceptance.yml --ref main \ -f source=npm \ -f package_spec=openclaw@beta \ -f suite_profile=product \ -f telegram_mode=mock-openai- Dowód dokładnego URL tarballa wymaga skrótu i używa publicznej polityki bezpieczeństwa URL:
gh workflow run package-acceptance.yml --ref main \ -f source=url \ -f package_url=https://registry.npmjs.org/openclaw/-/openclaw-VERSION.tgz \ -f package_sha256=<sha256> \ -f suite_profile=package- Firmowe/prywatne mirrory tarballi używają jawnej polityki zaufanego źródła:
gh workflow run package-acceptance.yml --ref main \ -f source=trusted-url \ -f trusted_source_id=enterprise-artifactory \ -f package_url=https://packages.example.internal:8443/artifactory/openclaw/openclaw-VERSION.tgz \ -f package_sha256=<sha256> \ -f suite_profile=packagesource=trusted-url odczytuje .github/package-trusted-sources.json z zaufanego ref workflow i nie akceptuje poświadczeń URL ani obejścia sieci prywatnej przez dane wejściowe workflow. Jeśli nazwana polityka deklaruje uwierzytelnianie bearer, skonfiguruj stały sekret OPENCLAW_TRUSTED_PACKAGE_TOKEN.
- Dowód artefaktu pobiera artefakt tarballa z innego uruchomienia Actions:
gh workflow run package-acceptance.yml --ref main \ -f source=artifact \ -f artifact_run_id=<run-id> \ -f artifact_name=<artifact-name> \ -f suite_profile=smoke-
pnpm test:docker:plugins- Pakuje i instaluje bieżący build OpenClaw w Dockerze, uruchamia Gateway ze skonfigurowanym OpenAI, a następnie włącza bundled channel/plugins przez edycje konfiguracji.
- Weryfikuje, że odkrywanie konfiguracji pozostawia nieskonfigurowane pobieralne plugins nieobecne, pierwsza skonfigurowana naprawa doctor instaluje jawnie każdy brakujący pobieralny plugin, a drugi restart nie uruchamia ukrytej naprawy zależności.
- Instaluje także znany starszy baseline npm, włącza Telegram przed uruchomieniem
openclaw update --tag <candidate>i weryfikuje, że doctor kandydata po aktualizacji czyści pozostałości zależności legacy plugin bez naprawy postinstall po stronie harnessa.
-
pnpm test:parallels:npm-update-
Uruchamia natywny smoke aktualizacji instalacji pakietu na gościach Parallels. Każda wybrana platforma najpierw instaluje żądany pakiet bazowy, następnie uruchamia zainstalowane polecenie
openclaw updatew tym samym gościu i weryfikuje zainstalowaną wersję, status aktualizacji, gotowość Gateway oraz jedną lokalną turę agenta. -
Użyj
--platform macos,--platform windowsalbo--platform linuxpodczas iteracji na jednym gościu. Użyj--json, aby uzyskać ścieżkę artefaktu podsumowania i status każdej ścieżki. -
Ścieżka OpenAI domyślnie używa
openai/gpt-5.5dla live dowodu tury agenta. Przekaż--model <provider/model>albo ustawOPENCLAW_PARALLELS_OPENAI_MODEL, gdy celowo walidujesz inny model OpenAI. -
Owiń długie lokalne uruchomienia timeoutem hosta, aby zastoje transportu Parallels nie mogły zużyć reszty okna testowego:
bash timeout --foreground 150m pnpm test:parallels:npm-update -- --jsontimeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json -
Skrypt zapisuje zagnieżdżone logi ścieżek w
/tmp/openclaw-parallels-npm-update.*. Sprawdźwindows-update.log,macos-update.logalbolinux-update.logprzed założeniem, że zewnętrzny wrapper się zawiesił. -
Aktualizacja Windows może spędzić od 10 do 15 minut w doctor po aktualizacji i pracach aktualizacji pakietów na zimnym gościu; nadal jest to zdrowy stan, gdy zagnieżdżony log debug npm postępuje.
-
Nie uruchamiaj tego zbiorczego wrappera równolegle z pojedynczymi ścieżkami smoke Parallels macOS, Windows albo Linux. Współdzielą stan VM i mogą kolidować przy przywracaniu snapshotu, serwowaniu pakietu albo stanie Gateway gościa.
-
Dowód po aktualizacji uruchamia normalną powierzchnię bundled plugin, ponieważ fasady capability, takie jak mowa, generowanie obrazów i rozumienie mediów, są ładowane przez API bundled runtime nawet wtedy, gdy sama tura agenta sprawdza tylko prostą odpowiedź tekstową.
-
-
pnpm openclaw qa aimock- Uruchamia tylko lokalny serwer providera AIMock do bezpośrednich testów smoke protokołu.
-
pnpm openclaw qa matrix- Uruchamia ścieżkę QA Matrix na żywo względem jednorazowego homeservera Tuwunel opartego na Dockerze. Tylko checkout źródłowy - instalacje pakietowe nie dostarczają
qa-lab. - Pełne CLI, katalog profili/scenariuszy, zmienne środowiskowe i układ artefaktów: QA Matrix.
- Uruchamia ścieżkę QA Matrix na żywo względem jednorazowego homeservera Tuwunel opartego na Dockerze. Tylko checkout źródłowy - instalacje pakietowe nie dostarczają
-
pnpm openclaw qa telegram- Uruchamia ścieżkę QA Telegram na żywo względem rzeczywistej grupy prywatnej, używając tokenów bota sterownika i bota SUT ze środowiska.
- Wymaga
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENiOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. Identyfikator grupy musi być numerycznym identyfikatorem czatu Telegram. - Obsługuje
--credential-source convexdla współdzielonych poświadczeń z puli. Domyślnie używaj trybu env albo ustawOPENCLAW_QA_CREDENTIAL_SOURCE=convex, aby włączyć dzierżawy z puli. - Domyślne ustawienia obejmują canary, bramkowanie wzmianek, adresowanie poleceń,
/status, wspomniane odpowiedzi bot-bot oraz natywne odpowiedzi poleceń rdzenia. Domyślne ustawieniamock-openaiobejmują także deterministyczne regresje łańcucha odpowiedzi i streamingu końcowej wiadomości Telegram. Użyj--list-scenarios, aby zobaczyć opcjonalne sondy, takie jaksession_status. - Kończy działanie z kodem niezerowym, gdy dowolny scenariusz się nie powiedzie. Użyj
--allow-failures, gdy chcesz uzyskać artefakty bez kodu wyjścia oznaczającego błąd. - Wymaga dwóch różnych botów w tej samej grupie prywatnej, przy czym bot SUT musi udostępniać nazwę użytkownika Telegram.
- Aby stabilnie obserwować komunikację bot-bot, włącz tryb komunikacji bot-bot w
@BotFatherdla obu botów i upewnij się, że bot sterownika może obserwować ruch botów w grupie. - Zapisuje raport QA Telegram, podsumowanie i
qa-evidence.jsonw.artifacts/qa-e2e/.... Scenariusze z odpowiedziami zawierają RTT od żądania wysłania sterownika do zaobserwowanej odpowiedzi SUT.
Mantis Telegram Live to wrapper dowodowy PR wokół tej ścieżki. Uruchamia
ref kandydujący z poświadczeniami Telegram dzierżawionymi przez Convex, renderuje zredagowany pakiet raportu/dowodów QA w przeglądarce desktopowej Crabbox, nagrywa dowód MP4,
generuje GIF przycięty do ruchu, przesyła pakiet artefaktów i publikuje dowód PR
inline przez aplikację Mantis GitHub App, gdy ustawiono pr_number. Maintainerzy mogą
uruchomić go z interfejsu Actions przez Mantis Scenario (scenario_id: telegram-live) albo bezpośrednio z komentarza pull requesta:
@openclaw-mantis telegram@openclaw-mantis telegram scenario=telegram-status-command@openclaw-mantis telegram scenarios=telegram-status-command,telegram-mentioned-message-replyMantis Telegram Desktop Proof to agentowy natywny wrapper Telegram Desktop
przed/po dla wizualnego dowodu PR. Uruchom go z interfejsu Actions z
dowolnymi instructions, przez Mantis Scenario (scenario_id: telegram-desktop-proof) albo z komentarza PR:
@openclaw-mantis telegram desktop proofAgent Mantis czyta PR, decyduje, jakie widoczne w Telegram zachowanie dowodzi
zmiany, uruchamia ścieżkę dowodową rzeczywistego użytkownika Crabbox Telegram Desktop na refach bazowym i
kandydującym, iteruje, aż natywne GIF-y będą użyteczne, zapisuje sparowany
manifest motionPreview i publikuje tę samą 2-kolumnową tabelę GIF przez
aplikację Mantis GitHub App, gdy ustawiono pr_number.
pnpm openclaw qa mantis telegram-desktop-builder- Dzierżawi lub ponownie używa desktopu Linux Crabbox, instaluje natywny Telegram Desktop, konfiguruje OpenClaw z dzierżawionym tokenem bota SUT Telegram, uruchamia Gateway i nagrywa dowody w postaci zrzutu ekranu/MP4 z widocznego desktopu VNC.
- Domyślnie używa
--credential-source convex, więc workflowy potrzebują tylko sekretu brokera Convex. Użyj--credential-source envz tymi samymi zmiennymiOPENCLAW_QA_TELEGRAM_*copnpm openclaw qa telegram. - Telegram Desktop nadal potrzebuje logowania/profilu użytkownika. Token bota konfiguruje tylko OpenClaw. Użyj
--telegram-profile-archive-env <name>dla archiwum profilu.tgzw base64 albo użyj--keep-leasei zaloguj się ręcznie przez VNC raz. - Zapisuje
mantis-telegram-desktop-builder-report.md,mantis-telegram-desktop-builder-summary.json,telegram-desktop-builder.pngitelegram-desktop-builder.mp4w katalogu wyjściowym.
Ścieżki transportu na żywo współdzielą jeden standardowy kontrakt, aby nowe transporty się nie rozjeżdżały; macierz pokrycia poszczególnych ścieżek znajduje się w przeglądzie QA → Pokrycie transportu na żywo. qa-channel to szeroki syntetyczny zestaw i nie jest częścią tej macierzy.
Współdzielone poświadczenia Telegram przez Convex (v1)
Gdy --credential-source convex (lub OPENCLAW_QA_CREDENTIAL_SOURCE=convex) jest włączone dla
QA transportu na żywo, QA lab uzyskuje wyłączną dzierżawę z puli opartej na Convex, wysyła Heartbeat dla tej
dzierżawy w trakcie działania ścieżki i zwalnia dzierżawę przy zamykaniu. Nazwa sekcji poprzedza
obsługę Discord, Slack i WhatsApp; kontrakt dzierżawy jest współdzielony między rodzajami.
Referencyjny szkielet projektu Convex:
qa/convex-credential-broker/
Wymagane zmienne środowiskowe:
OPENCLAW_QA_CONVEX_SITE_URL(na przykładhttps://your-deployment.convex.site)- Jeden sekret dla wybranej roli:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERdlamaintainerOPENCLAW_QA_CONVEX_SECRET_CIdlaci
- Wybór roli poświadczeń:
- CLI:
--credential-role maintainer|ci - Domyślnie ze środowiska:
OPENCLAW_QA_CREDENTIAL_ROLE(domyślnieciw CI, w przeciwnym raziemaintainer)
- CLI:
Opcjonalne zmienne środowiskowe:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(domyślnie1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(domyślnie30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(domyślnie90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(domyślnie15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(domyślnie/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(opcjonalny identyfikator śledzenia)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1pozwala na adresy URL Convexhttp://przez local loopback wyłącznie do lokalnego rozwoju.
OPENCLAW_QA_CONVEX_SITE_URL powinno używać https:// w normalnym działaniu.
Polecenia administracyjne maintainera (dodawanie/usuwanie/listowanie puli) wymagają
konkretnie OPENCLAW_QA_CONVEX_SECRET_MAINTAINER.
Pomocnicze polecenia CLI dla maintainerów:
pnpm openclaw qa credentials doctorpnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.jsonpnpm openclaw qa credentials list --kind telegrampnpm openclaw qa credentials remove --credential-id <credential-id>Użyj doctor przed uruchomieniami na żywo, aby sprawdzić adres URL witryny Convex, sekrety brokera,
prefiks punktu końcowego, limit czasu HTTP oraz osiągalność admin/list bez drukowania
wartości sekretów. Użyj --json, aby uzyskać wynik czytelny maszynowo w skryptach i narzędziach
CI.
Domyślny kontrakt punktu końcowego (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1):
POST /acquire- Żądanie:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Sukces:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Wyczerpane/ponawialne:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Żądanie:
POST /payload-chunk- Żądanie:
{ kind, ownerId, actorRole, credentialId, leaseToken, index } - Sukces:
{ status: "ok", index, data }
- Żądanie:
POST /heartbeat- Żądanie:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Sukces:
{ status: "ok" }(albo puste2xx)
- Żądanie:
POST /release- Żądanie:
{ kind, ownerId, actorRole, credentialId, leaseToken } - Sukces:
{ status: "ok" }(albo puste2xx)
- Żądanie:
POST /admin/add(tylko sekret maintainera)- Żądanie:
{ kind, actorId, payload, note?, status? } - Sukces:
{ status: "ok", credential }
- Żądanie:
POST /admin/remove(tylko sekret maintainera)- Żądanie:
{ credentialId, actorId } - Sukces:
{ status: "ok", changed, credential } - Ochrona aktywnej dzierżawy:
{ status: "error", code: "LEASE_ACTIVE", ... }
- Żądanie:
POST /admin/list(tylko sekret maintainera)- Żądanie:
{ kind?, status?, includePayload?, limit? } - Sukces:
{ status: "ok", credentials, count }
- Żądanie:
Kształt ładunku dla rodzaju Telegram:
{ groupId: string, driverToken: string, sutToken: string }groupIdmusi być numerycznym ciągiem identyfikatora czatu Telegram.admin/addwaliduje ten kształt dlakind: "telegram"i odrzuca nieprawidłowe ładunki.
Kształt ładunku dla rodzaju rzeczywistego użytkownika Telegram:
{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }groupId,testerUserIditelegramApiIdmuszą być ciągami numerycznymi.tdlibArchiveSha256idesktopTdataArchiveSha256muszą być ciągami szesnastkowymi SHA-256.kind: "telegram-user"jest zarezerwowane dla workflowu dowodowego Mantis Telegram Desktop. Ogólne ścieżki QA Lab nie mogą go pobierać.
Ładunki wielokanałowe walidowane przez brokera:
- Discord:
{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string, voiceChannelId?: string } - WhatsApp:
{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }
Ścieżki Slack mogą także dzierżawić z puli, ale walidacja ładunku Slack obecnie
znajduje się w runnerze QA Slack, a nie w brokerze. Użyj
{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }
dla wierszy Slack.
Dodawanie kanału do QA
Architektura i nazwy helperów scenariuszy dla nowych adapterów kanałów znajdują się w przeglądzie QA → Dodawanie kanału. Minimalny próg: zaimplementuj runner transportu na współdzielonej seam hosta qa-lab, zadeklaruj qaRunners w manifeście Plugin, zamontuj jako openclaw qa <runner> i utwórz scenariusze w qa/scenarios/.
Zestawy testów (co uruchamia się gdzie)
Myśl o zestawach jako o „rosnącym realizmie” (oraz rosnącej niestabilności/koszcie):
Unit / integracja (domyślnie)
- Polecenie:
pnpm test - Konfiguracja: nietargetowane uruchomienia używają zestawu shardów
vitest.full-*.config.tsi mogą rozwijać shardy wieloprojektowe do konfiguracji per projekt w celu równoległego harmonogramowania - Pliki: inwentarze unit rdzenia w
src/**/*.test.ts,packages/**/*.test.tsitest/**/*.test.ts; testy unit UI uruchamiają się w dedykowanym shardzieunit-ui - Zakres:
- Czyste testy unit
- Testy integracyjne w procesie (uwierzytelnianie Gateway, routing, narzędzia, parsowanie, konfiguracja)
- Deterministyczne regresje znanych błędów
- Oczekiwania:
- Uruchamia się w CI
- Nie wymaga rzeczywistych kluczy
- Powinno być szybkie i stabilne
- Testy resolvera i loadera powierzchni publicznej muszą dowodzić szerokiego zachowania fallback
api.jsiruntime-api.jsprzy użyciu wygenerowanych minimalnych fixture'ów Plugin, a nie rzeczywistych API źródłowych bundled Plugin. Rzeczywiste ładowania API Plugin należą do zestawów kontraktowych/integracyjnych utrzymywanych przez właściciela Plugin.
Zasady dotyczące zależności natywnych:
- Domyślne instalacje testowe pomijają opcjonalne natywne buildy Discord opus. Głos Discord używa bundled
libopus-wasm, a@discordjs/opuspozostaje wyłączone wallowBuilds, więc lokalne testy i ścieżki Testbox nie kompilują natywnego addonu. - Porównuj wydajność natywnego opus w repo benchmarku
libopus-wasm, a nie w domyślnych pętlach install/test OpenClaw. Nie ustawiaj@discordjs/opusnatruew domyślnymallowBuilds; to sprawia, że niepowiązane pętle install/test kompilują kod natywny.
Projekty, shardy i ścieżki zakresowe
- Nieukierunkowane
pnpm testuruchamia dwanaście mniejszych konfiguracji shardów (core-unit-fast,core-unit-src,core-unit-security,core-unit-ui,core-unit-support,core-support-boundary,core-contracts,core-bundled,core-runtime,agentic,auto-reply,extensions) zamiast jednego ogromnego natywnego procesu projektu głównego. Zmniejsza to szczytowe RSS na obciążonych maszynach i zapobiega zagłodzeniu niepowiązanych zestawów przez zadania auto-reply/rozszerzeń. pnpm test --watchnadal używa natywnego głównego grafu projektuvitest.config.ts, ponieważ pętla obserwacji z wieloma shardami nie jest praktyczna.pnpm test,pnpm test:watchipnpm test:perf:importsnajpierw kierują jawne cele plików/katalogów przez zakresowe ścieżki, więcpnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsunika płacenia pełnego kosztu startu projektu głównego.pnpm test:changeddomyślnie rozwija zmienione ścieżki git na tanie zakresowe ścieżki: bezpośrednie edycje testów, sąsiednie pliki*.test.ts, jawne mapowania źródeł i lokalne zależności grafu importów. Edycje konfiguracji/konfiguracji startowej/pakietów nie uruchamiają szerokiego zestawu testów, chyba że jawnie użyjeszOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed.pnpm check:changedto normalna inteligentna lokalna bramka sprawdzająca dla wąskich zmian. Klasyfikuje diff na rdzeń, testy rdzenia, rozszerzenia, testy rozszerzeń, aplikacje, dokumentację, metadane wydań, narzędzia Docker live i narzędzia, a następnie uruchamia pasujące polecenia sprawdzania typów, lintowania i strażników. Nie uruchamia testów Vitest; użyjpnpm test:changedalbo jawnegopnpm test <target>jako dowodu testowego. Podbicia wersji dotyczące wyłącznie metadanych wydania uruchamiają ukierunkowane kontrole wersji/konfiguracji/zależności głównego pakietu, ze strażnikiem odrzucającym zmiany pakietu poza polem wersji najwyższego poziomu.- Edycje harnessu Docker ACP live uruchamiają skupione kontrole: składnię powłoki dla skryptów uwierzytelniania Docker live i próbny przebieg harmonogramu Docker live. Zmiany
package.jsonsą uwzględniane tylko wtedy, gdy diff jest ograniczony doscripts["test:docker:live-*"]; edycje zależności, eksportów, wersji i innych powierzchni pakietu nadal używają szerszych strażników. - Lekkie pod względem importów testy jednostkowe z obszarów agentów, poleceń, Pluginów, pomocników auto-reply,
plugin-sdki podobnych czystych narzędzi trafiają do ścieżkiunit-fast, która pomijatest/setup-openclaw-runtime.ts; pliki stanowe/ciężkie runtime pozostają na istniejących ścieżkach. - Wybrane pliki źródłowe pomocników
plugin-sdkicommandstakże mapują uruchomienia w trybie zmian na jawne sąsiednie testy w tych lekkich ścieżkach, więc edycje pomocników unikają ponownego uruchamiania pełnego ciężkiego zestawu dla tego katalogu. auto-replyma dedykowane kubełki dla pomocników rdzenia najwyższego poziomu, testów integracyjnychreply.*najwyższego poziomu i poddrzewasrc/auto-reply/reply/**. CI dodatkowo dzieli poddrzewo odpowiedzi na shardy agent-runner, dispatch i commands/state-routing, aby jeden kubełek ciężki od importów nie posiadał całego ogona Node.- Normalne CI dla PR/main celowo pomija zbiorcze przemiatanie rozszerzeń i shard
agentic-pluginstylko dla wydań. Pełna walidacja wydania uruchamia osobny podrzędny workflowPlugin Prereleasedla tych zestawów mocno obciążających Pluginy/rozszerzenia na kandydatach do wydania.
Pokrycie osadzonego runnera
- Gdy zmieniasz wejścia wykrywania narzędzi wiadomości albo kontekst runtime Compaction, zachowaj oba poziomy pokrycia.
- Dodaj skupione regresje pomocników dla granic czystego routingu i normalizacji.
- Utrzymuj zestawy integracyjne osadzonego runnera w dobrym stanie:
src/agents/embedded-agent-runner/compact.hooks.test.ts,src/agents/embedded-agent-runner/run.overflow-compaction.test.tsisrc/agents/embedded-agent-runner/run.overflow-compaction.loop.test.ts. - Te zestawy weryfikują, że zakresowe identyfikatory i zachowanie Compaction nadal przechodzą
przez rzeczywiste ścieżki
run.ts/compact.ts; testy wyłącznie pomocników nie są wystarczającym zamiennikiem dla tych ścieżek integracyjnych.
Domyślne ustawienia puli i izolacji Vitest
- Podstawowa konfiguracja Vitest domyślnie używa
threads. - Wspólna konfiguracja Vitest ustawia
isolate: falsei używa nieizolowanego runnera w projektach głównych, e2e i konfiguracjach live. - Główna ścieżka UI zachowuje swoje ustawienie
jsdomi optymalizator, ale także działa na współdzielonym nieizolowanym runnerze. - Każdy shard
pnpm testdziedziczy te same domyślne ustawieniathreads+isolate: falseze współdzielonej konfiguracji Vitest. scripts/run-vitest.mjsdomyślnie dodaje--no-maglevdla procesów potomnych Vitest w Node, aby zmniejszyć narzut kompilacji V8 podczas dużych lokalnych uruchomień. UstawOPENCLAW_VITEST_ENABLE_MAGLEV=1, aby porównać z bazowym zachowaniem V8.scripts/run-vitest.mjskończy jawne uruchomienia Vitest bez trybu watch po 5 minutach bez wyjścia stdout ani stderr. UstawOPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=0, aby wyłączyć watchdog dla celowo cichego dochodzenia.
Szybka lokalna iteracja
pnpm changed:lanespokazuje, które ścieżki architektoniczne uruchamia diff.- Hook pre-commit dotyczy tylko formatowania. Ponownie dodaje sformatowane pliki do stagingu i nie uruchamia lintowania, sprawdzania typów ani testów.
- Uruchom
pnpm check:changedjawnie przed przekazaniem lub wypchnięciem, gdy potrzebujesz inteligentnej lokalnej bramki sprawdzającej. pnpm test:changeddomyślnie kieruje przez tanie zakresowe ścieżki. UżyjOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedtylko wtedy, gdy agent zdecyduje, że edycja harnessu, konfiguracji, pakietu albo kontraktu naprawdę wymaga szerszego pokrycia Vitest.pnpm test:maxipnpm test:changed:maxzachowują to samo zachowanie routingu, tylko z wyższym limitem workerów.- Automatyczne skalowanie lokalnych workerów jest celowo konserwatywne i wycofuje się, gdy średnie obciążenie hosta jest już wysokie, więc wiele równoległych uruchomień Vitest domyślnie wyrządza mniej szkód.
- Podstawowa konfiguracja Vitest oznacza projekty/pliki konfiguracyjne jako
forceRerunTriggers, aby ponowne uruchomienia w trybie zmian pozostawały poprawne, gdy zmienia się okablowanie testów. - Konfiguracja utrzymuje włączone
OPENCLAW_VITEST_FS_MODULE_CACHEna obsługiwanych hostach; ustawOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path, jeśli chcesz jedną jawną lokalizację cache dla bezpośredniego profilowania.
Debugowanie wydajności
pnpm test:perf:importswłącza raportowanie czasu trwania importów Vitest oraz wyjście rozbicia importów.pnpm test:perf:imports:changedzawęża ten sam widok profilowania do plików zmienionych odorigin/main.- Dane czasów shardów są zapisywane do
.artifacts/vitest-shard-timings.json. Uruchomienia całej konfiguracji używają ścieżki konfiguracji jako klucza; shardy CI z wzorcem include dopisują nazwę sharda, aby filtrowane shardy można było śledzić osobno. - Gdy jeden gorący test nadal spędza większość czasu w importach startowych,
trzymaj ciężkie zależności za wąską lokalną granicą
*.runtime.tsi mockuj tę granicę bezpośrednio zamiast importować głęboko pomocniki runtime tylko po to, aby przepuścić je przezvi.mock(...). pnpm test:perf:changed:bench -- --ref <git-ref>porównuje routowanetest:changedz natywną ścieżką projektu głównego dla tego zatwierdzonego diffu i wypisuje czas rzeczywisty oraz maksymalne RSS macOS.pnpm test:perf:changed:bench -- --worktreebenchmarkuje bieżące brudne drzewo, kierując listę zmienionych plików przezscripts/test-projects.mjsi główną konfigurację Vitest.pnpm test:perf:profile:mainzapisuje profil CPU głównego wątku dla narzutu startu i transformacji Vitest/Vite.pnpm test:perf:profile:runnerzapisuje profile CPU+heap runnera dla zestawu jednostkowego z wyłączoną równoległością plików.
Stabilność (gateway)
- Polecenie:
pnpm test:stability:gateway - Konfiguracja:
vitest.gateway.config.ts, wymuszona na jednego workera - Zakres:
- Uruchamia rzeczywisty loopback Gateway z diagnostyką domyślnie włączoną
- Przepuszcza syntetyczny ruch wiadomości gateway, pamięci i dużych payloadów przez ścieżkę zdarzeń diagnostycznych
- Odpytuje
diagnostics.stabilityprzez Gateway WS RPC - Obejmuje pomocniki utrwalania pakietu stabilności diagnostycznej
- Sprawdza, że rejestrator pozostaje ograniczony, syntetyczne próbki RSS mieszczą się w budżecie presji, a głębokości kolejek na sesję wracają do zera
- Oczekiwania:
- Bezpieczne dla CI i bez kluczy
- Wąska ścieżka dla działań następczych po regresji stabilności, nie zamiennik pełnego zestawu Gateway
E2E (agregat repozytorium)
- Polecenie:
pnpm test:e2e - Zakres:
- Uruchamia ścieżkę E2E smoke Gateway
- Uruchamia ścieżkę E2E przeglądarki mockowanego Control UI
- Oczekiwania:
- Bezpieczne dla CI i bez kluczy
- Wymaga zainstalowanego Playwright Chromium
E2E (smoke Gateway)
- Polecenie:
pnpm test:e2e:gateway - Konfiguracja:
vitest.e2e.config.ts - Pliki:
src/**/*.e2e.test.ts,test/**/*.e2e.test.tsoraz testy E2E dołączonych Pluginów podextensions/ - Domyślne ustawienia runtime:
- Używa Vitest
threadszisolate: false, zgodnie z resztą repozytorium. - Używa adaptacyjnych workerów (CI: do 2, lokalnie: domyślnie 1).
- Domyślnie działa w trybie cichym, aby ograniczyć narzut I/O konsoli.
- Używa Vitest
- Przydatne nadpisania:
OPENCLAW_E2E_WORKERS=<n>do wymuszenia liczby workerów (ograniczone do 16).OPENCLAW_E2E_VERBOSE=1do ponownego włączenia szczegółowego wyjścia konsoli.
- Zakres:
- Zachowanie gateway end-to-end dla wielu instancji
- Powierzchnie WebSocket/HTTP, parowanie węzłów i cięższa obsługa sieci
- Oczekiwania:
- Działa w CI (gdy jest włączone w pipeline)
- Nie wymaga prawdziwych kluczy
- Więcej ruchomych części niż w testach jednostkowych (może być wolniejsze)
E2E (mockowana przeglądarka Control UI)
- Polecenie:
pnpm test:ui:e2e - Konfiguracja:
test/vitest/vitest.ui-e2e.config.ts - Pliki:
ui/src/**/*.e2e.test.ts - Zakres:
- Uruchamia Vite Control UI
- Steruje rzeczywistą stroną Chromium przez Playwright
- Zastępuje WebSocket Gateway deterministycznymi mockami w przeglądarce
- Oczekiwania:
- Działa w CI jako część
pnpm test:e2e - Nie wymaga prawdziwego Gateway, agentów ani kluczy dostawców
- Zależność przeglądarki musi być obecna (
pnpm --dir ui exec playwright install chromium)
- Działa w CI jako część
E2E: smoke backendu OpenShell
- Polecenie:
pnpm test:e2e:openshell - Plik:
extensions/openshell/src/backend.e2e.test.ts - Zakres:
- Ponownie używa aktywnego lokalnego gateway OpenShell
- Tworzy sandbox z tymczasowego lokalnego Dockerfile
- Testuje backend OpenShell OpenClaw przez rzeczywiste
sandbox ssh-config+ wykonanie SSH - Weryfikuje kanoniczne zdalnie zachowanie systemu plików przez most sandbox fs
- Oczekiwania:
- Tylko opt-in; nie jest częścią domyślnego uruchomienia
pnpm test:e2e - Wymaga lokalnego CLI
openshelloraz działającego demona Docker - Wymaga aktywnego lokalnego gateway OpenShell i jego źródła konfiguracji
- Używa izolowanych
HOME/XDG_CONFIG_HOME, a następnie niszczy testowy sandbox
- Tylko opt-in; nie jest częścią domyślnego uruchomienia
- Przydatne nadpisania:
OPENCLAW_E2E_OPENSHELL=1do włączenia testu podczas ręcznego uruchamiania szerszego zestawu e2eOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshelldo wskazania niedomyślnego binarium CLI albo skryptu opakowującegoOPENCLAW_E2E_OPENSHELL_CONFIG_HOME=/path/to/configdo wystawienia zarejestrowanej konfiguracji gateway dla izolowanego testuOPENCLAW_E2E_OPENSHELL_HOST_IP=172.18.0.1do nadpisania IP gateway Docker używanego przez fixture polityki hosta
Live (prawdziwi dostawcy + prawdziwe modele)
- Polecenie:
pnpm test:live - Konfiguracja:
vitest.live.config.ts - Pliki:
src/**/*.live.test.ts,test/**/*.live.test.tsoraz testy live dołączonych Pluginów wextensions/ - Domyślnie: włączone przez
pnpm test:live(ustawiaOPENCLAW_LIVE_TEST=1) - Zakres:
- „Czy ten dostawca/model faktycznie działa dzisiaj z prawdziwymi danymi uwierzytelniającymi?”
- Wychwytywanie zmian formatu dostawców, osobliwości wywoływania narzędzi, problemów z uwierzytelnianiem i zachowania limitów szybkości
- Oczekiwania:
- Z założenia nie jest stabilne w CI (prawdziwe sieci, prawdziwe polityki dostawców, limity, awarie)
- Kosztuje pieniądze / wykorzystuje limity szybkości
- Preferuj uruchamianie zawężonych podzbiorów zamiast „wszystkiego”
- Uruchomienia live używają już wyeksportowanych kluczy API i przygotowanych profili uwierzytelniania.
- Domyślnie uruchomienia live nadal izolują
HOMEi kopiują materiały konfiguracji/uwierzytelniania do tymczasowego katalogu domowego testów, aby fixtures jednostkowe nie mogły zmodyfikować Twojego prawdziwego~/.openclaw. - Ustaw
OPENCLAW_LIVE_USE_REAL_HOME=1tylko wtedy, gdy celowo potrzebujesz, aby testy live używały Twojego prawdziwego katalogu domowego. pnpm test:livedomyślnie działa w cichszym trybie: zachowuje wyjście postępu[live] ...i wycisza logi uruchamiania gatewaya/szum Bonjour. UstawOPENCLAW_LIVE_TEST_QUIET=0, jeśli chcesz przywrócić pełne logi startowe.- Rotacja kluczy API (specyficzna dla dostawcy): ustaw
*_API_KEYSw formacie z przecinkami/średnikami albo*_API_KEY_1,*_API_KEY_2(na przykładOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) lub nadpisanie dla pojedynczego live przezOPENCLAW_LIVE_*_KEY; testy ponawiają próby po odpowiedziach z limitem szybkości. - Wyjście postępu/Heartbeat:
- Zestawy live emitują teraz wiersze postępu do stderr, aby długie wywołania dostawców były widocznie aktywne nawet wtedy, gdy przechwytywanie konsoli przez Vitest jest ciche.
vitest.live.config.tswyłącza przechwytywanie konsoli Vitest, dzięki czemu wiersze postępu dostawcy/gatewaya są strumieniowane natychmiast podczas uruchomień live.- Dostrój Heartbeat bezpośrednich modeli za pomocą
OPENCLAW_LIVE_HEARTBEAT_MS. - Dostrój Heartbeat gatewaya/probe za pomocą
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Który zestaw mam uruchomić?
Użyj tej tabeli decyzyjnej:
- Edycja logiki/testów: uruchom
pnpm test(orazpnpm test:coverage, jeśli zmieniłeś dużo) - Dotykanie sieci gatewaya / protokołu WS / parowania: dodaj
pnpm test:e2e - Debugowanie „mój bot nie działa” / awarii specyficznych dla dostawcy / wywoływania narzędzi: uruchom zawężone
pnpm test:live
Testy live (dotykające sieci)
Informacje o macierzy modeli live, smoke testach backendu CLI, smoke testach ACP, harnessie serwera aplikacji Codex oraz wszystkich testach live dostawców mediów (Deepgram, BytePlus, ComfyUI, obraz, muzyka, wideo, harness mediów) - plus obsługa danych uwierzytelniających dla uruchomień live - znajdziesz w Testowanie zestawów live. Dedykowaną listę kontrolną aktualizacji i walidacji Pluginów znajdziesz w Testowanie aktualizacji i Pluginów.
Runnery Docker (opcjonalne sprawdzenia „działa w Linuksie”)
Te runnery Docker dzielą się na dwie grupy:
- Runnery modeli live:
test:docker:live-modelsitest:docker:live-gatewayuruchamiają tylko odpowiadający im plik live z kluczami profili wewnątrz obrazu Docker repozytorium (src/agents/models.profiles.live.test.tsisrc/gateway/gateway-models.profiles.live.test.ts), montując lokalny katalog konfiguracji, workspace i opcjonalny plik env profilu. Odpowiadające lokalne punkty wejścia totest:live:models-profilesitest:live:gateway-profiles. - Runnery live Docker zachowują własne praktyczne limity tam, gdzie są potrzebne:
test:docker:live-modelsdomyślnie używa kuratorowanego obsługiwanego zestawu o wysokiej wartości sygnału, atest:docker:live-gatewaydomyślnie używaOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000orazOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. UstawOPENCLAW_LIVE_MAX_MODELSlub zmienne env gatewaya, gdy wyraźnie chcesz mniejszy limit albo większe skanowanie. test:docker:allbuduje obraz Docker live raz przeztest:docker:live-build, pakuje OpenClaw raz jako tarball npm przezscripts/package-openclaw-for-docker.mjs, a następnie buduje/ponownie używa dwóch obrazówscripts/e2e/Dockerfile. Obraz bare jest tylko runnerem Node/Git dla ścieżek install/update/plugin-dependency; te ścieżki montują wstępnie zbudowany tarball. Obraz funkcjonalny instaluje ten sam tarball w/appdla ścieżek funkcjonalności zbudowanej aplikacji. 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. Agregat używa ważonego lokalnego schedulera:OPENCLAW_DOCKER_ALL_PARALLELISMkontroluje sloty procesów, a limity zasobów powstrzymują ciężkie ścieżki live, npm-install i wielousługowe przed jednoczesnym startem. Jeśli pojedyncza ścieżka jest cięższa niż aktywne limity, scheduler nadal może ją uruchomić, gdy pula jest pusta, a potem utrzymuje ją jako jedyną działającą, dopóki pojemność nie będzie ponownie dostępna. Domyślne wartości to 10 slotów,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=5iOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; dostrajajOPENCLAW_DOCKER_ALL_WEIGHT_LIMITlubOPENCLAW_DOCKER_ALL_DOCKER_LIMITtylko wtedy, gdy host Docker ma większy zapas. Runner domyślnie wykonuje preflight Docker, usuwa przestarzałe kontenery OpenClaw E2E, drukuje status co 30 sekund, zapisuje czasy udanych ścieżek w.artifacts/docker-tests/lane-timings.jsoni używa tych czasów, aby w późniejszych uruchomieniach najpierw startować dłuższe ścieżki. UżyjOPENCLAW_DOCKER_ALL_DRY_RUN=1, aby wydrukować ważony manifest ścieżek bez budowania lub uruchamiania Docker, albonode scripts/test-docker-all.mjs --plan-json, aby wydrukować plan CI dla wybranych ścieżek, potrzeb pakietów/obrazów i danych uwierzytelniających.Package Acceptanceto natywna dla GitHuba bramka pakietu dla pytania „czy ten instalowalny tarball działa jako produkt?” Rozwiązuje jeden pakiet kandydujący zsource=npm,source=ref,source=urllubsource=artifact, przesyła go jakopackage-under-test, a następnie uruchamia wielokrotnego użytku ścieżki Docker E2E przeciwko dokładnie temu tarballowi zamiast ponownie pakować wybrany ref. Profile są uporządkowane według zakresu:smoke,package,productifull. Zobacz Testowanie aktualizacji i Pluginów, aby poznać kontrakt pakietu/aktualizacji/Pluginu, macierz przetrwania opublikowanych aktualizacji, domyślne ustawienia wydań i triage awarii.- Sprawdzenia budowania i wydań uruchamiają
scripts/check-cli-bootstrap-imports.mjspo tsdown. Guard przechodzi po statycznym zbudowanym grafie oddist/entry.jsidist/cli/run-main.jsi kończy się niepowodzeniem, jeśli uruchamianie przed dispatch importuje zależności pakietów, takie jak Commander, interfejs promptów, undici albo logowanie, przed dispatch polecenia; utrzymuje także dołączony chunk uruchomienia gatewaya w budżecie i odrzuca statyczne importy znanych zimnych ścieżek gatewaya. Smoke pakietowanego CLI obejmuje także root help, onboard help, doctor help, status, schemat konfiguracji i polecenie listy modeli. - Zgodność wsteczna Package Acceptance jest ograniczona do
2026.4.25(włącznie z2026.4.25-beta.*). Do tego punktu odcięcia harness toleruje tylko luki metadanych wysłanych pakietów: pominięte prywatne wpisy inwentarza QA, brakgateway install --wrapper, brak plików patch w fixture git pochodzącej z tarballa, brak utrwalonegoupdate.channel, starsze lokalizacje rekordów instalacji Pluginów, brak utrwalania rekordów instalacji marketplace oraz migrację metadanych konfiguracji podczasplugins update. Dla pakietów po2026.4.25te ścieżki są ścisłymi niepowodzeniami. - Runnery smoke kontenerów:
test:docker:openwebui,test:docker:onboard,test:docker:npm-onboard-channel-agent,test:docker:release-user-journey,test:docker:release-typed-onboarding,test:docker:release-media-memory,test:docker:release-upgrade-user-journey,test:docker:release-plugin-marketplace,test:docker:skill-install,test:docker:update-channel-switch,test:docker:upgrade-survivor,test:docker:published-upgrade-survivor,test:docker:session-runtime-context,test:docker:agents-delete-shared-workspace,test:docker:gateway-network,test:docker:browser-cdp-snapshot,test:docker:mcp-channels,test:docker:agent-bundle-mcp-tools,test:docker:cron-mcp-cleanup,test:docker:plugins,test:docker:plugin-update,test:docker:plugin-lifecycle-matrixitest:docker:config-reloaduruchamiają jeden lub więcej prawdziwych kontenerów i weryfikują ścieżki integracji wyższego poziomu. - Ścieżki Docker/Bash E2E, które instalują spakowany tarball OpenClaw przez
scripts/lib/openclaw-e2e-instance.sh, ograniczająnpm installdoOPENCLAW_E2E_NPM_INSTALL_TIMEOUT(domyślnie600s; ustaw0, aby wyłączyć wrapper do debugowania).
Runnery Docker modeli live montują przez bind także tylko potrzebne katalogi domowe uwierzytelniania CLI (albo wszystkie obsługiwane, gdy uruchomienie nie jest zawężone), a następnie kopiują je do katalogu domowego kontenera przed uruchomieniem, aby OAuth zewnętrznego CLI mógł odświeżać tokeny bez modyfikowania magazynu uwierzytelniania hosta:
-
Modele bezpośrednie:
pnpm test:docker:live-models(skrypt:scripts/test-live-models-docker.sh) -
Smoke bindowania ACP:
pnpm test:docker:live-acp-bind(skrypt:scripts/test-live-acp-bind-docker.sh; domyślnie obejmuje Claude, Codex i Gemini, ze ścisłym pokryciem Droid/OpenCode przezpnpm test:docker:live-acp-bind:droidipnpm test:docker:live-acp-bind:opencode) -
Smoke backendu CLI:
pnpm test:docker:live-cli-backend(skrypt:scripts/test-live-cli-backend-docker.sh) -
Smoke harnessa serwera aplikacji Codex:
pnpm test:docker:live-codex-harness(skrypt:scripts/test-live-codex-harness-docker.sh) -
Gateway + agent deweloperski:
pnpm test:docker:live-gateway(skrypt:scripts/test-live-gateway-models-docker.sh) -
Smoke testy obserwowalności:
pnpm qa:otel:smoke,pnpm qa:prometheus:smokeipnpm qa:observability:smoketo prywatne ścieżki QA checkoutu źródeł. Celowo nie są częścią pakietowych ścieżek wydań Docker, ponieważ tarball npm pomija QA Lab. -
Smoke live Open WebUI:
pnpm test:docker:openwebui(skrypt:scripts/e2e/openwebui-docker.sh) -
Kreator onboardingu (TTY, pełne scaffoldowanie):
pnpm test:docker:onboard(skrypt:scripts/e2e/onboard-docker.sh) -
Smoke onboardingu/kanału/agenta tarballa npm:
pnpm test:docker:npm-onboard-channel-agentinstaluje spakowany tarball OpenClaw globalnie w Docker, konfiguruje OpenAI przez onboarding env-ref oraz domyślnie Telegram, uruchamia doctor i uruchamia jedną mockowaną turę agenta OpenAI. Użyj ponownie wstępnie zbudowanego tarballa za pomocąOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz, pomiń przebudowę hosta za pomocąOPENCLAW_NPM_ONBOARD_HOST_BUILD=0albo przełącz kanał za pomocąOPENCLAW_NPM_ONBOARD_CHANNEL=discordlubOPENCLAW_NPM_ONBOARD_CHANNEL=slack. -
Smoke test ścieżki użytkownika wydania:
pnpm test:docker:release-user-journeyinstaluje spakowany tarball OpenClaw globalnie w czystym katalogu domowym Docker, uruchamia onboarding, konfiguruje mockowanego dostawcę OpenAI, wykonuje turę agenta, instaluje/odinstalowuje zewnętrzne pluginy, konfiguruje ClickClack względem lokalnego fixture, weryfikuje wiadomości wychodzące/przychodzące, restartuje Gateway i uruchamia doctor. -
Smoke test typowanego onboardingu wydania:
pnpm test:docker:release-typed-onboardinginstaluje spakowany tarball, prowadziopenclaw onboardprzez prawdziwe TTY, konfiguruje OpenAI jako dostawcę z referencją do zmiennej środowiskowej, weryfikuje brak utrwalania surowego klucza i uruchamia mockowaną turę agenta. -
Smoke test mediów/pamięci wydania:
pnpm test:docker:release-media-memoryinstaluje spakowany tarball, weryfikuje rozumienie obrazu z załącznika PNG, dane wyjściowe generowania obrazów zgodnego z OpenAI, przypominanie z wyszukiwania w pamięci oraz przetrwanie przypominania po restarcie Gateway. -
Smoke test ścieżki użytkownika aktualizacji wydania:
pnpm test:docker:release-upgrade-user-journeydomyślnie instaluje najnowszą opublikowaną wersję bazową starszą niż tarball kandydata, konfiguruje stan dostawcy/pluginu/ClickClack na opublikowanym pakiecie, aktualizuje do tarballa kandydata, a następnie ponownie uruchamia podstawową ścieżkę agenta/pluginu/kanału. Jeśli nie istnieje starsza opublikowana wersja bazowa, używa ponownie wersji kandydata. Nadpisz wersję bazową za pomocąOPENCLAW_RELEASE_UPGRADE_BASELINE_SPEC=openclaw@<version>. -
Smoke test marketplace pluginów wydania:
pnpm test:docker:release-plugin-marketplaceinstaluje z lokalnego fixture marketplace, aktualizuje zainstalowany plugin, odinstalowuje go i weryfikuje, że CLI pluginu znika wraz z przycięciem metadanych instalacji. -
Smoke test instalacji Skills:
pnpm test:docker:skill-installinstaluje spakowany tarball OpenClaw globalnie w Docker, wyłącza instalacje przesłanych archiwów w konfiguracji, rozwiązuje bieżący aktywny slug Skills z ClawHub z wyszukiwania, instaluje go za pomocąopenclaw skills installi weryfikuje zainstalowany Skills oraz metadane pochodzenia/blokady.clawhub. -
Smoke test przełączania kanału aktualizacji:
pnpm test:docker:update-channel-switchinstaluje spakowany tarball OpenClaw globalnie w Docker, przełącza z pakietustablena gitdev, weryfikuje utrwalony kanał i działanie pluginu po aktualizacji, następnie przełącza z powrotem na pakietstablei sprawdza status aktualizacji. -
Smoke test przetrwania aktualizacji:
pnpm test:docker:upgrade-survivorinstaluje spakowany tarball OpenClaw na zanieczyszczonym fixture starego użytkownika z agentami, konfiguracją kanału, listami dozwolonych pluginów, przestarzałym stanem zależności pluginów oraz istniejącymi plikami workspace/sesji. Uruchamia aktualizację pakietu oraz nieinteraktywny doctor bez aktywnego dostawcy ani kluczy kanału, następnie startuje Gateway w local loopback i sprawdza zachowanie konfiguracji/stanu oraz budżety uruchomienia/statusu. -
Smoke test przetrwania opublikowanej aktualizacji:
pnpm test:docker:published-upgrade-survivordomyślnie instalujeopenclaw@latest, zasila realistyczne pliki istniejącego użytkownika, konfiguruje tę wersję bazową wbudowaną receptą poleceń, waliduje wynikową konfigurację, aktualizuje tę opublikowaną instalację do tarballa kandydata, uruchamia nieinteraktywny doctor, zapisuje.artifacts/upgrade-survivor/summary.json, następnie startuje Gateway w local loopback i sprawdza skonfigurowane intencje, zachowanie stanu, uruchomienie,/healthz,/readyzoraz budżety statusu RPC. Nadpisz jedną wersję bazową za pomocąOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, poproś agregujący scheduler o rozszerzenie dokładnych lokalnych wersji bazowych za pomocąOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS, takich jakopenclaw@2026.5.2 openclaw@2026.4.23 openclaw@2026.4.15, oraz rozszerz fixture w kształcie zgłoszeń za pomocąOPENCLAW_UPGRADE_SURVIVOR_SCENARIOS, takich jakreported-issues; zestaw reported-issues zawieraconfigured-plugin-installsdo automatycznej naprawy instalacji zewnętrznych pluginów OpenClaw. Package Acceptance udostępnia je jakopublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesipublished_upgrade_survivor_scenarios, rozwiązuje meta tokeny wersji bazowej, takie jaklast-stable-4luball-since-2026.4.23, a Full Release Validation rozszerza bramkę pakietu release-soak dolast-stable-4 2026.4.23 2026.5.2 2026.4.15plusreported-issues. -
Smoke test kontekstu runtime sesji:
pnpm test:docker:session-runtime-contextweryfikuje utrwalanie ukrytego transkryptu kontekstu runtime oraz naprawę przez doctor dotkniętych zduplikowanych gałęzi przepisywania promptu. -
Smoke test globalnej instalacji Bun:
bash scripts/e2e/bun-global-install-smoke.shpakuje bieżące drzewo, instaluje je za pomocąbun install -gw izolowanym katalogu domowym i weryfikuje, żeopenclaw infer image providers --jsonzwraca wbudowanych dostawców obrazów zamiast zawieszać się. Użyj ponownie wstępnie zbudowanego tarballa za pomocąOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz, pomiń build hosta za pomocąOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0albo skopiujdist/ze zbudowanego obrazu Docker za pomocąOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local. -
Smoke test instalatora Docker:
bash scripts/test-install-sh-docker.shwspółdzieli jedną pamięć podręczną npm między kontenerami root, update i direct-npm. Smoke test aktualizacji domyślnie używa npmlatestjako stabilnej wersji bazowej przed aktualizacją do tarballa kandydata. Nadpisz lokalnie za pomocąOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22albo przez wejścieupdate_baseline_versionworkflow Install Smoke na GitHub. Kontrole instalatora bez roota zachowują izolowaną pamięć podręczną npm, aby wpisy pamięci podręcznej należące do roota nie maskowały lokalnego zachowania instalacji użytkownika. UstawOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache, aby ponownie używać pamięci podręcznej root/update/direct-npm między lokalnymi ponownymi uruchomieniami. -
Install Smoke CI pomija zduplikowaną globalną aktualizację direct-npm za pomocą
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1; uruchom skrypt lokalnie bez tej zmiennej środowiskowej, gdy potrzebne jest pokrycie bezpośredniegonpm install -g. -
Smoke test CLI usuwania współdzielonego workspace agentów:
pnpm test:docker:agents-delete-shared-workspace(skrypt:scripts/e2e/agents-delete-shared-workspace-docker.sh) domyślnie buduje obraz z głównego Dockerfile, zasila dwóch agentów z jednym workspace w izolowanym katalogu domowym kontenera, uruchamiaagents delete --jsoni weryfikuje poprawny JSON oraz zachowanie zatrzymanego workspace. Użyj ponownie obrazu install-smoke za pomocąOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1. -
Sieć Gateway (dwa kontenery, uwierzytelnianie WS + health):
pnpm test:docker:gateway-network(skrypt:scripts/e2e/gateway-network-docker.sh) -
Smoke test migawki CDP przeglądarki:
pnpm test:docker:browser-cdp-snapshot(skrypt:scripts/e2e/browser-cdp-snapshot-docker.sh) buduje źródłowy obraz E2E plus warstwę Chromium, startuje Chromium z surowym CDP, uruchamiabrowser doctor --deepi weryfikuje, że migawki ról CDP obejmują URL-e linków, elementy klikalne promowane przez kursor, referencje iframe i metadane ramek. -
Regresja minimalnego reasoning OpenAI Responses web_search:
pnpm test:docker:openai-web-search-minimal(skrypt:scripts/e2e/openai-web-search-minimal-docker.sh) uruchamia mockowany serwer OpenAI przez Gateway, weryfikuje, żeweb_searchpodnosireasoning.effortzminimaldolow, następnie wymusza odrzucenie schematu dostawcy i sprawdza, że surowe szczegóły pojawiają się w logach Gateway. -
Most kanału MCP (zasilony Gateway + most stdio + surowy smoke test ramki powiadomienia Claude):
pnpm test:docker:mcp-channels(skrypt:scripts/e2e/mcp-channels-docker.sh) -
Narzędzia MCP pakietu OpenClaw (prawdziwy serwer MCP stdio + osadzony smoke test allow/deny profilu OpenClaw):
pnpm test:docker:agent-bundle-mcp-tools(skrypt:scripts/e2e/agent-bundle-mcp-tools-docker.sh) -
Czyszczenie MCP Cron/subagenta (prawdziwy Gateway + sprzątanie procesu potomnego MCP stdio po izolowanym Cron i jednorazowych uruchomieniach subagenta):
pnpm test:docker:cron-mcp-cleanup(skrypt:scripts/e2e/cron-mcp-cleanup-docker.sh) -
Pluginy (smoke test instalacji/aktualizacji dla ścieżki lokalnej,
file:, rejestru npm z wyniesionymi zależnościami, nieprawidłowych metadanych pakietu npm, ruchomych referencji git, pełnego fixture ClawHub, aktualizacji marketplace oraz włączania/inspekcji pakietu Claude):pnpm test:docker:plugins(skrypt:scripts/e2e/plugins-docker.sh) UstawOPENCLAW_PLUGINS_E2E_CLAWHUB=0, aby pominąć blok ClawHub, albo nadpisz domyślną parę pakiet/runtime pełnego fixture za pomocąOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECiOPENCLAW_PLUGINS_E2E_CLAWHUB_ID. BezOPENCLAW_CLAWHUB_URL/CLAWHUB_URLtest używa hermetycznego lokalnego serwera fixture ClawHub. -
Smoke test niezmienionej aktualizacji pluginu:
pnpm test:docker:plugin-update(skrypt:scripts/e2e/plugin-update-unchanged-docker.sh) -
Smoke test macierzy cyklu życia pluginu:
pnpm test:docker:plugin-lifecycle-matrixinstaluje spakowany tarball OpenClaw w pustym kontenerze, instaluje plugin npm, przełącza włączenie/wyłączenie, aktualizuje go i cofa wersję przez lokalny rejestr npm, usuwa zainstalowany kod, a następnie weryfikuje, że odinstalowanie nadal usuwa przestarzały stan, jednocześnie logując metryki RSS/CPU dla każdej fazy cyklu życia. -
Smoke test metadanych przeładowania konfiguracji:
pnpm test:docker:config-reload(skrypt:scripts/e2e/config-reload-source-docker.sh) -
Pluginy:
pnpm test:docker:pluginsobejmuje smoke test instalacji/aktualizacji dla ścieżki lokalnej,file:, rejestru npm z wyniesionymi zależnościami, ruchomych referencji git, fixture ClawHub, aktualizacji marketplace oraz włączania/inspekcji pakietu Claude.pnpm test:docker:plugin-updateobejmuje niezmienione zachowanie aktualizacji zainstalowanych pluginów.pnpm test:docker:plugin-lifecycle-matrixobejmuje instalację pluginu npm ze śledzeniem zasobów, włączenie, wyłączenie, aktualizację, cofnięcie wersji oraz odinstalowanie przy brakującym kodzie.
Aby ręcznie wstępnie zbudować i ponownie użyć współdzielonego obrazu funkcjonalnego:
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-buildOPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channelsNadpisania obrazu specyficzne dla zestawu, takie jak OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE, nadal mają pierwszeństwo, gdy są ustawione. Gdy OPENCLAW_SKIP_DOCKER_BUILD=1 wskazuje na zdalny obraz współdzielony, skrypty pobierają go, jeśli nie jest jeszcze lokalny. Testy Docker QR i instalatora zachowują własne Dockerfile, ponieważ walidują zachowanie pakietu/instalacji, a nie współdzielony runtime zbudowanej aplikacji.
Bieżące runnery Dockera dla modeli live również montują bieżący checkout w trybie tylko do odczytu i
przygotowują go w tymczasowym katalogu roboczym wewnątrz kontenera. Dzięki temu obraz runtime
pozostaje smukły, a Vitest nadal działa na dokładnie Twoim lokalnym źródle/konfiguracji.
Krok przygotowania pomija duże, wyłącznie lokalne cache i wyniki budowania aplikacji, takie jak
.pnpm-store, .worktrees, __openclaw_vitest__ oraz lokalne dla aplikacji katalogi wyjściowe .build lub
Gradle, aby uruchomienia live w Dockerze nie traciły minut na kopiowanie
artefaktów specyficznych dla maszyny.
Ustawiają też OPENCLAW_SKIP_CHANNELS=1, aby sondy live gatewaya nie uruchamiały
rzeczywistych workerów kanałów Telegram/Discord/itp. wewnątrz kontenera.
test:docker:live-models nadal uruchamia pnpm test:live, więc przekaż także
OPENCLAW_LIVE_GATEWAY_*, gdy musisz zawęzić lub wykluczyć pokrycie live gatewaya
z tej ścieżki Dockera.
test:docker:openwebui to wyższego poziomu smoke test zgodności: uruchamia
kontener gatewaya OpenClaw z włączonymi endpointami HTTP zgodnymi z OpenAI,
uruchamia przypięty kontener Open WebUI względem tego gatewaya, loguje się przez
Open WebUI, sprawdza, czy /api/models udostępnia openclaw/default, a następnie wysyła
rzeczywiste żądanie czatu przez proxy /api/chat/completions Open WebUI.
Ustaw OPENWEBUI_SMOKE_MODE=models dla kontroli CI ścieżki wydania, które powinny zakończyć się
po zalogowaniu w Open WebUI i wykryciu modelu, bez czekania na ukończenie modelu live.
Pierwsze uruchomienie może być wyraźnie wolniejsze, ponieważ Docker może musieć pobrać
obraz Open WebUI, a Open WebUI może musieć dokończyć własną konfigurację zimnego startu.
Ta ścieżka oczekuje używalnego klucza modelu live. Podaj go przez środowisko procesu,
przygotowane profile uwierzytelniania lub jawny OPENCLAW_PROFILE_FILE.
Udane uruchomienia wypisują mały ładunek JSON, taki jak { "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels jest celowo deterministyczny i nie wymaga
rzeczywistego konta Telegram, Discord ani iMessage. Uruchamia zasilony danymi kontener Gateway,
startuje drugi kontener, który wywołuje openclaw mcp serve, a następnie
sprawdza routowane wykrywanie konwersacji, odczyty transkrypcji, metadane załączników,
zachowanie kolejki zdarzeń live, routing wysyłania wychodzącego oraz powiadomienia kanału w stylu Claude +
uprawnień przez rzeczywisty most MCP stdio. Kontrola powiadomień
bezpośrednio analizuje surowe ramki MCP stdio, więc smoke test weryfikuje to, co
most rzeczywiście emituje, a nie tylko to, co akurat ujawnia konkretny SDK klienta.
test:docker:agent-bundle-mcp-tools jest deterministyczny i nie wymaga klucza modelu live.
Buduje obraz Dockera repozytorium, uruchamia rzeczywisty serwer sondy MCP stdio
wewnątrz kontenera, materializuje ten serwer przez osadzony runtime pakietu OpenClaw
MCP, wykonuje narzędzie, a następnie sprawdza, że coding i messaging zachowują
narzędzia bundle-mcp, podczas gdy minimal i tools.deny: ["bundle-mcp"] je filtrują.
test:docker:cron-mcp-cleanup jest deterministyczny i nie wymaga klucza modelu live.
Uruchamia zasilony danymi Gateway z rzeczywistym serwerem sondy MCP stdio, wykonuje
izolowany przebieg cron i jednorazowy przebieg podrzędny sessions_spawn, a następnie sprawdza,
czy proces podrzędny MCP kończy się po każdym uruchomieniu.
Ręczny smoke test wątku ACP w języku naturalnym (nie CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Zachowaj ten skrypt dla przepływów regresji/debugowania. Może być ponownie potrzebny do walidacji routingu wątków ACP, więc go nie usuwaj.
Przydatne zmienne środowiskowe:
OPENCLAW_CONFIG_DIR=...(domyślnie:~/.openclaw) montowane do/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(domyślnie:~/.openclaw/workspace) montowane do/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...montowane i wczytywane przed uruchomieniem testówOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1, aby zweryfikować tylko zmienne środowiskowe wczytane zOPENCLAW_PROFILE_FILE, z użyciem tymczasowych katalogów konfiguracji/przestrzeni roboczej i bez zewnętrznych montowań uwierzytelniania CLIOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(domyślnie:~/.cache/openclaw/docker-cli-tools) montowane do/home/node/.npm-globaldla cache'owanych instalacji CLI wewnątrz Dockera- Zewnętrzne katalogi/pliki uwierzytelniania CLI pod
$HOMEsą montowane tylko do odczytu pod/host-auth..., a następnie kopiowane do/home/node/...przed startem testów- Domyślne katalogi:
.minimax - Domyślne pliki:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Zawężone uruchomienia dostawcy montują tylko potrzebne katalogi/pliki wywnioskowane z
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Nadpisz ręcznie za pomocą
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=nonealbo listy rozdzielanej przecinkami, takiej jakOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Domyślne katalogi:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=..., aby zawęzić uruchomienieOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=..., aby filtrować dostawców w kontenerzeOPENCLAW_SKIP_DOCKER_BUILD=1, aby ponownie użyć istniejącego obrazuopenclaw:local-livedla ponownych uruchomień, które nie wymagają przebudowaniaOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, aby upewnić się, że poświadczenia pochodzą z magazynu profili (nie ze środowiska)OPENCLAW_OPENWEBUI_MODEL=..., aby wybrać model udostępniany przez gateway dla smoke testu Open WebUIOPENCLAW_OPENWEBUI_PROMPT=..., aby nadpisać prompt sprawdzający nonce używany przez smoke test Open WebUIOPENWEBUI_IMAGE=..., aby nadpisać przypięty tag obrazu Open WebUI
Kontrola dokumentacji
Uruchom kontrole dokumentacji po edycjach dokumentów: pnpm check:docs.
Uruchom pełną walidację kotwic Mintlify, gdy potrzebujesz również kontroli nagłówków na stronie: pnpm docs:check-links:anchors.
Regresja offline (bezpieczna dla CI)
To są regresje „rzeczywistego potoku” bez rzeczywistych dostawców:
- Wywoływanie narzędzi Gateway (mock OpenAI, rzeczywisty gateway + pętla agenta):
src/gateway/gateway.test.ts(przypadek: "runs a mock OpenAI tool call end-to-end via gateway agent loop") - Kreator Gateway (WS
wizard.start/wizard.next, zapisuje konfigurację + wymuszone uwierzytelnianie):src/gateway/gateway.test.ts(przypadek: "runs wizard over ws and writes auth token config")
Ewaluacje niezawodności agenta (Skills)
Mamy już kilka testów bezpiecznych dla CI, które zachowują się jak „ewaluacje niezawodności agenta”:
- Mockowane wywoływanie narzędzi przez rzeczywisty gateway + pętlę agenta (
src/gateway/gateway.test.ts). - Przepływy kreatora end-to-end, które walidują połączenie sesji i efekty konfiguracji (
src/gateway/gateway.test.ts).
Czego nadal brakuje dla Skills (zobacz Skills):
- Decyzyjność: gdy Skills są wymienione w prompcie, czy agent wybiera właściwy skill (albo unika nieistotnych)?
- Zgodność: czy agent czyta
SKILL.mdprzed użyciem i wykonuje wymagane kroki/argumenty? - Kontrakty przepływu pracy: scenariusze wieloturowe, które sprawdzają kolejność narzędzi, przeniesienie historii sesji i granice sandboxa.
Przyszłe ewaluacje powinny najpierw pozostać deterministyczne:
- Runner scenariuszy używający mockowanych dostawców do sprawdzania wywołań narzędzi + kolejności, odczytów plików skill i połączenia sesji.
- Mały zestaw scenariuszy skupionych na skillach (użyj vs unikaj, bramkowanie, prompt injection).
- Opcjonalne ewaluacje live (opt-in, bramkowane env) dopiero po wdrożeniu zestawu bezpiecznego dla CI.
Testy kontraktowe (kształt pluginu i kanału)
Testy kontraktowe weryfikują, że każdy zarejestrowany plugin i kanał jest zgodny ze swoim
kontraktem interfejsu. Iterują po wszystkich wykrytych pluginach i uruchamiają zestaw
asercji kształtu oraz zachowania. Domyślna ścieżka jednostkowa pnpm test celowo
pomija te współdzielone pliki smoke i granic; uruchamiaj polecenia kontraktowe jawnie,
gdy dotykasz współdzielonych powierzchni kanału lub dostawcy.
Polecenia
- Wszystkie kontrakty:
pnpm test:contracts - Tylko kontrakty kanałów:
pnpm test:contracts:channels - Tylko kontrakty dostawców:
pnpm test:contracts:plugins
Kontrakty kanałów
Znajdują się w src/channels/plugins/contracts/*.contract.test.ts:
- plugin - Podstawowy kształt pluginu (id, nazwa, możliwości)
- setup - Kontrakt kreatora konfiguracji
- session-binding - Zachowanie wiązania sesji
- outbound-payload - Struktura ładunku wiadomości
- inbound - Obsługa wiadomości przychodzących
- actions - Handlery akcji kanału
- threading - Obsługa ID wątku
- directory - API katalogu/listy
- group-policy - Wymuszanie polityki grupy
Kontrakty statusu dostawcy
Znajdują się w src/plugins/contracts/*.contract.test.ts.
- status - Sondy statusu kanału
- registry - Kształt rejestru pluginów
Kontrakty dostawców
Znajdują się w src/plugins/contracts/*.contract.test.ts:
- auth - Kontrakt przepływu uwierzytelniania
- auth-choice - Wybór/selekcja uwierzytelniania
- catalog - API katalogu modeli
- discovery - Wykrywanie pluginów
- loader - Ładowanie pluginów
- runtime - Runtime dostawcy
- shape - Kształt/interfejs pluginu
- wizard - Kreator konfiguracji
Kiedy uruchamiać
- Po zmianie eksportów lub podścieżek plugin-sdk
- Po dodaniu albo zmodyfikowaniu pluginu kanału lub dostawcy
- Po refaktoryzacji rejestracji lub wykrywania pluginów
Testy kontraktowe działają w CI i nie wymagają rzeczywistych kluczy API.
Dodawanie regresji (wskazówki)
Gdy naprawiasz problem dostawcy/modelu wykryty live:
- Dodaj regresję bezpieczną dla CI, jeśli to możliwe (mock/stub dostawcy albo uchwycenie dokładnej transformacji kształtu żądania)
- Jeśli jest z natury wyłącznie live (limity szybkości, polityki uwierzytelniania), utrzymaj test live wąski i opt-in przez zmienne środowiskowe
- Preferuj celowanie w najmniejszą warstwę, która wykrywa błąd:
- błąd konwersji/odtworzenia żądania dostawcy → bezpośredni test modeli
- błąd potoku sesji/historii/narzędzi gatewaya → smoke test live gatewaya albo bezpieczny dla CI mockowy test gatewaya
- Bariera ochronna przechodzenia SecretRef:
src/secrets/exec-secret-ref-id-parity.test.tswyprowadza jeden próbkowany cel na klasę SecretRef z metadanych rejestru (listSecretTargetRegistryEntries()), a następnie sprawdza, że exec id z segmentami przejścia są odrzucane.- Jeśli dodasz nową rodzinę celów SecretRef
includeInPlanwsrc/secrets/target-registry-data.ts, zaktualizujclassifyTargetClassw tym teście. Test celowo zawodzi na niesklasyfikowanych identyfikatorach celów, aby nowe klasy nie mogły zostać po cichu pominięte.