OpenClaw heeft drie Vitest-suites (unit/integratie, e2e, live) en een kleine set Docker-runners. Dit document is een handleiding voor “hoe we testen”:Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
- Wat elke suite dekt (en wat deze bewust niet dekt).
- Welke opdrachten je uitvoert voor veelvoorkomende workflows (lokaal, vóór pushen, debugging).
- Hoe live tests inloggegevens vinden en modellen/providers selecteren.
- Hoe je regressies toevoegt voor model-/providerproblemen uit de praktijk.
QA-stack (qa-lab, qa-channel, live transport-lanes) wordt afzonderlijk gedocumenteerd:
- QA-overzicht — architectuur, commandosurface, scenario’s schrijven.
- Matrix-QA — referentie voor
pnpm openclaw qa matrix. - QA-kanaal — de synthetische transport-Plugin die wordt gebruikt door repo-ondersteunde scenario’s.
qa-aanroepen en verwijst terug naar de referenties hierboven.Snel starten
Meestal:- Volledige gate (verwacht vóór pushen):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Snellere lokale volledige suite-run op een ruime machine:
pnpm test:max - Directe Vitest-watch-loop:
pnpm test:watch - Directe bestandstargeting routeert nu ook extension-/kanaalpaden:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Geef de voorkeur aan gerichte runs wanneer je aan één failure werkt.
- Docker-ondersteunde QA-site:
pnpm qa:lab:up - Linux-VM-ondersteunde QA-lane:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
- Coverage-gate:
pnpm test:coverage - E2E-suite:
pnpm test:e2e
- Live suite (modellen + Gateway-tool-/image-probes):
pnpm test:live - Richt stil op één live bestand:
pnpm test:live -- src/agents/models.profiles.live.test.ts - Docker live model-sweep:
pnpm test:docker:live-models- Elk geselecteerd model voert nu een tekstbeurt plus een kleine file-read-achtige probe uit.
Modellen waarvan de metadata
image-input adverteert, voeren ook een kleine image-beurt uit. Schakel de extra probes uit metOPENCLAW_LIVE_MODEL_FILE_PROBE=0ofOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0wanneer je provider-failures isoleert. - CI-dekking: de dagelijkse
OpenClaw Scheduled Live And E2E Checksen handmatigeOpenClaw Release Checksroepen beide de herbruikbare live/E2E-workflow aan metinclude_live_suites: true, wat afzonderlijke Docker live model matrixjobs omvat, geshard per provider. - Voor gerichte CI-herhalingen dispatch je
OpenClaw Live And E2E Checks (Reusable)metinclude_live_suites: trueenlive_models_only: true. - Voeg nieuwe provider-secrets met hoge signaalwaarde toe aan
scripts/ci-hydrate-live-auth.shplus.github/workflows/openclaw-live-and-e2e-checks-reusable.ymlen de geplande/release-callers daarvan.
- Elk geselecteerd model voert nu een tekstbeurt plus een kleine file-read-achtige probe uit.
Modellen waarvan de metadata
- Native Codex bound-chat-smoke:
pnpm test:docker:live-codex-bind- Voert een Docker live lane uit tegen het Codex app-server-pad, bindt een synthetische
Slack-DM met
/codex bind, oefent/codex fasten/codex permissions, en verifieert daarna dat een gewone reactie en een image-bijlage via de native Plugin-binding lopen in plaats van ACP.
- Voert een Docker live lane uit tegen het Codex app-server-pad, bindt een synthetische
Slack-DM met
- Codex app-server-harness-smoke:
pnpm test:docker:live-codex-harness- Voert Gateway-agentbeurten uit via de Plugin-eigen Codex app-server-harness,
verifieert
/codex statusen/codex models, en oefent standaard image, cron MCP, sub-agent en Guardian-probes. Schakel de sub-agent-probe uit metOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0wanneer je andere Codex app-server-failures isoleert. Voor een gerichte sub-agent-check schakel je de andere probes uit: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. Dit stopt na de sub-agent-probe tenzijOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0is ingesteld.
- Voert Gateway-agentbeurten uit via de Plugin-eigen Codex app-server-harness,
verifieert
- Crestodian rescue command-smoke:
pnpm test:live:crestodian-rescue-channel- Opt-in extra controle voor de message-channel rescue command
surface. Deze oefent
/crestodian status, zet een persistente modelwijziging in de wachtrij, antwoordt/crestodian yesen verifieert het audit-/config-write-pad.
- Opt-in extra controle voor de message-channel rescue command
surface. Deze oefent
- Crestodian planner Docker-smoke:
pnpm test:docker:crestodian-planner- Voert Crestodian uit in een configloze container met een nep-Claude-CLI op
PATHen verifieert dat de fuzzy planner-fallback wordt vertaald naar een geaudite typed config write.
- Voert Crestodian uit in een configloze container met een nep-Claude-CLI op
- Crestodian first-run Docker-smoke:
pnpm test:docker:crestodian-first-run- Start vanuit een lege OpenClaw-state-dir, routeert kale
openclawnaar Crestodian, past setup/model/agent/Discord Plugin + SecretRef-writes toe, valideert config en verifieert auditvermeldingen. Hetzelfde Ring 0-setuppad wordt ook gedekt in QA Lab doorpnpm openclaw qa suite --scenario crestodian-ring-zero-setup.
- Start vanuit een lege OpenClaw-state-dir, routeert kale
- Moonshot/Kimi cost-smoke: met
MOONSHOT_API_KEYingesteld, voeropenclaw models list --provider moonshot --jsonuit en voer daarna een geïsoleerdeopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsonuit tegenmoonshot/kimi-k2.6. Verifieer dat de JSON Moonshot/K2.6 rapporteert en het assistenttranscript genormaliseerdeusage.costopslaat.
QA-specifieke runners
Deze opdrachten staan naast de hoofdtestsuites wanneer je QA-lab-realisme nodig hebt: CI voert QA Lab uit in dedicated workflows.Parity gate draait op matchende PR’s en
via handmatige dispatch met mockproviders. QA-Lab - All Lanes draait elke nacht op
main en via handmatige dispatch met de mock parity gate, live Matrix-lane,
Convex-beheerde live Telegram-lane en Convex-beheerde live Discord-lane als
parallelle jobs. Geplande QA- en releasechecks geven Matrix --profile fast
expliciet mee, terwijl de standaardwaarde van de Matrix-CLI en handmatige workflowinput
all blijft; handmatige dispatch kan all sharden naar transport, media, e2ee-smoke,
e2ee-deep en e2ee-cli-jobs. OpenClaw Release Checks draait parity plus
de snelle Matrix- en Telegram-lanes vóór releasegoedkeuring, met
mock-openai/gpt-5.5 voor release-transportchecks zodat ze deterministisch blijven
en normale provider-Plugin-startup vermijden. Deze live transport-Gateways schakelen
memory search uit; memory-gedrag blijft gedekt door de QA parity-suites.
Volledige release live media-shards gebruiken
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04, waarin
ffmpeg en ffprobe al aanwezig zijn. Docker live model/backend-shards gebruiken de gedeelde
ghcr.io/openclaw/openclaw-live-test:<sha>-image die één keer per geselecteerde
commit wordt gebouwd, en halen die daarna op met OPENCLAW_SKIP_DOCKER_BUILD=1 in plaats van opnieuw te bouwen
binnen elke shard.
pnpm openclaw qa suite- Voert repo-ondersteunde QA-scenario’s rechtstreeks op de host uit.
- Voert meerdere geselecteerde scenario’s standaard parallel uit met geïsoleerde
Gateway-workers.
qa-channelgebruikt standaard concurrency 4 (begrensd door het geselecteerde aantal scenario’s). Gebruik--concurrency <count>om het aantal workers af te stemmen, of--concurrency 1voor de oudere seriële lane. - Stopt met non-zero wanneer een scenario faalt. Gebruik
--allow-failureswanneer je artifacts wilt zonder falende exitcode. - Ondersteunt providermodi
live-frontier,mock-openaienaimock.aimockstart een lokale AIMock-ondersteunde providerserver voor experimentele fixture- en protocol-mockdekking zonder de scenario-bewustemock-openai-lane te vervangen.
pnpm test:gateway:cpu-scenarios- Voert de Gateway-startup-bench plus een klein mock QA Lab-scenariopakket uit
(
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) en schrijft een gecombineerde CPU-observatie- samenvatting onder.artifacts/gateway-cpu-scenarios/. - Markeert standaard alleen aanhoudende hot-CPU-observaties (
--cpu-core-warnplus--hot-wall-warn-ms), zodat korte startup-bursts als metrics worden vastgelegd zonder eruit te zien als de minutenlange gateway peg-regressie. - Gebruikt gebouwde
dist-artifacts; voer eerst een build uit wanneer de checkout nog geen verse runtime-output heeft.
- Voert de Gateway-startup-bench plus een klein mock QA Lab-scenariopakket uit
(
pnpm openclaw qa suite --runner multipass- Voert dezelfde QA-suite uit binnen een wegwerpbare Multipass Linux-VM.
- Houdt hetzelfde scenarioselectiegedrag als
qa suiteop de host. - Hergebruikt dezelfde provider-/modelselectieflags als
qa suite. - Live runs forwarden de ondersteunde QA-auth-inputs die praktisch zijn voor de guest:
env-gebaseerde providersleutels, het QA live provider-configpad en
CODEX_HOMEwanneer aanwezig. - Outputdirs moeten onder de repo-root blijven zodat de guest via de gemounte workspace terug kan schrijven.
- Schrijft het normale QA-rapport + samenvatting plus Multipass-logs onder
.artifacts/qa-e2e/....
pnpm qa:lab:up- Start de Docker-ondersteunde QA-site voor operator-achtige QA-werkzaamheden.
pnpm test:docker:npm-onboard-channel-agent- Bouwt een npm-tarball uit de huidige checkout, installeert die globaal in Docker, voert niet-interactieve OpenAI API-key-onboarding uit, configureert standaard Telegram, verifieert dat het inschakelen van de Plugin runtime-dependencies on demand installeert, voert doctor uit en voert één lokale agentbeurt uit tegen een gemockt OpenAI- endpoint.
- Gebruik
OPENCLAW_NPM_ONBOARD_CHANNEL=discordom dezelfde packaged-install lane met Discord te draaien.
pnpm test:docker:session-runtime-context- Voert een deterministische built-app Docker-smoke uit voor embedded runtime context-
transcripts. Deze verifieert dat verborgen OpenClaw-runtimecontext wordt bewaard als een
niet-weergegeven custom message in plaats van te lekken in de zichtbare gebruikersbeurt,
seedt daarna een affected broken session JSONL en verifieert dat
openclaw doctor --fixdeze herschrijft naar de actieve branch met een backup.
- Voert een deterministische built-app Docker-smoke uit voor embedded runtime context-
transcripts. Deze verifieert dat verborgen OpenClaw-runtimecontext wordt bewaard als een
niet-weergegeven custom message in plaats van te lekken in de zichtbare gebruikersbeurt,
seedt daarna een affected broken session JSONL en verifieert dat
pnpm test:docker:npm-telegram-live- Installeert een OpenClaw-packagecandidate in Docker, voert installed-package- onboarding uit, configureert Telegram via de geïnstalleerde CLI en hergebruikt daarna de live Telegram-QA-lane met dat geïnstalleerde package als de SUT Gateway.
- Standaard is
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta; stelOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzofOPENCLAW_CURRENT_PACKAGE_TGZin om in plaats van installeren uit de registry een opgeloste lokale tarball te testen. - Gebruikt dezelfde Telegram-env-inloggegevens of Convex-credentialbron als
pnpm openclaw qa telegram. Stel voor CI-/releaseautomatiseringOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexin plusOPENCLAW_QA_CONVEX_SITE_URLen de rol-secret. AlsOPENCLAW_QA_CONVEX_SITE_URLen een Convex role secret in CI aanwezig zijn, selecteert de Docker-wrapper automatisch Convex. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintaineroverschrijft de gedeeldeOPENCLAW_QA_CREDENTIAL_ROLEalleen voor deze lane.- GitHub Actions stelt deze lane beschikbaar als de handmatige maintainer-workflow
NPM Telegram Beta E2E. Deze draait niet bij merge. De workflow gebruikt deqa-live-shared-environment en Convex CI-credentialleases.
- GitHub Actions stelt ook
Package Acceptancebeschikbaar voor productproof als side-run tegen één candidate package. Deze accepteert een vertrouwde ref, gepubliceerde npm spec, HTTPS-tarball-URL plus SHA-256, of tarball-artifact uit een andere run, uploadt de genormaliseerdeopenclaw-current.tgzalspackage-under-testen voert daarna de bestaande Docker E2E-scheduler uit met smoke-, package-, product-, full- of custom lane-profielen. Steltelegram_mode=mock-openaioflive-frontierin om de Telegram-QA-workflow tegen hetzelfdepackage-under-test-artifact te draaien.- Nieuwste beta-productproof:
- Exacte tarball-URL-proof vereist een digest:
- Artifactbewijs downloadt een tarball-artifact uit een andere Actions-run:
-
pnpm test:docker:bundled-channel-deps- Pakt de huidige OpenClaw-build in en installeert deze in Docker, start de Gateway met OpenAI geconfigureerd en schakelt daarna gebundelde kanaal-/Plugins in via config- bewerkingen.
- Verifieert dat setupdetectie ongeconfigureerde runtime-afhankelijkheden van Plugins afwezig laat, dat de eerste geconfigureerde Gateway- of doctor-run de runtime- afhankelijkheden van elke gebundelde Plugin op aanvraag installeert, en dat een tweede herstart afhankelijkheden die al waren geactiveerd niet opnieuw installeert.
- Installeert ook een bekende oudere npm-baseline, schakelt Telegram in voordat
openclaw update --tag <candidate>wordt uitgevoerd, en verifieert dat de post-update doctor van de kandidaat gebundelde runtime-afhankelijkheden van kanalen repareert zonder postinstall-reparatie aan de harness-kant.
-
pnpm test:parallels:npm-update-
Voert de native update-smoke voor packaged install uit op Parallels-gasten. Elk
geselecteerd platform installeert eerst het gevraagde baselinepakket, voert daarna
de geïnstalleerde opdracht
openclaw updateuit in dezelfde gast en verifieert de geïnstalleerde versie, updatestatus, gereedheid van de Gateway en één lokale agent- beurt. -
Gebruik
--platform macos,--platform windowsof--platform linuxtijdens iteratie op één gast. Gebruik--jsonvoor het pad van het samenvattingsartifact en de status per lane. -
De OpenAI-lane gebruikt standaard
openai/gpt-5.5voor het bewijs met een live agentbeurt. Geef--model <provider/model>door of stelOPENCLAW_PARALLELS_OPENAI_MODELin wanneer je bewust een ander OpenAI-model valideert. -
Wikkel lange lokale runs in een host-timeout, zodat vastgelopen Parallels-transport
niet de rest van het testvenster kan verbruiken:
-
Het script schrijft geneste lane-logs onder
/tmp/openclaw-parallels-npm-update.*. Inspecteerwindows-update.log,macos-update.logoflinux-update.logvoordat je aanneemt dat de buitenste wrapper vastloopt. - Windows-update kan op een koude gast 10 tot 15 minuten besteden aan post-update doctor-/ runtime-afhankelijkheidsreparatie; dat is nog steeds gezond wanneer het geneste npm-debuglog vooruitgaat.
- Voer deze aggregate wrapper niet parallel uit met afzonderlijke Parallels- macOS-, Windows- of Linux-smoke-lanes. Ze delen VM-status en kunnen botsen op snapshotherstel, pakketservering of Gateway-status van de gast.
- Het post-updatebewijs voert het normale gebundelde Plugin-oppervlak uit omdat capability-facades zoals spraak, beeldgeneratie en media- begrip worden geladen via gebundelde runtime-API’s, zelfs wanneer de agentbeurt zelf alleen een eenvoudige tekstantwoordcontrole uitvoert.
-
Voert de native update-smoke voor packaged install uit op Parallels-gasten. Elk
geselecteerd platform installeert eerst het gevraagde baselinepakket, voert daarna
de geïnstalleerde opdracht
-
pnpm openclaw qa aimock- Start alleen de lokale AIMock-provider-server voor directe protocol-smoke- tests.
-
pnpm openclaw qa matrix- Voert de Matrix live QA-lane uit tegen een disposable Tuwunel-homeserver met Docker-backend. Alleen source-checkout — packaged installs leveren
qa-labniet mee. - Volledige CLI, profiel-/scenariocatalogus, env-vars en artifactindeling: Matrix QA.
- Voert de Matrix live QA-lane uit tegen een disposable Tuwunel-homeserver met Docker-backend. Alleen source-checkout — packaged installs leveren
-
pnpm openclaw qa telegram- Voert de Telegram live QA-lane uit tegen een echte privégroep met de driver- en SUT-bottokens uit env.
- Vereist
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENenOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. De groeps-id moet de numerieke Telegram-chat-id zijn. - Ondersteunt
--credential-source convexvoor gedeelde gepoolde referenties. Gebruik standaard env-modus, of stelOPENCLAW_QA_CREDENTIAL_SOURCE=convexin om gepoolde leases te gebruiken. - Sluit af met een niet-nulstatus wanneer een scenario faalt. Gebruik
--allow-failureswanneer je artifacts wilt zonder falende exitcode. - Vereist twee verschillende bots in dezelfde privégroep, waarbij de SUT-bot een Telegram-gebruikersnaam blootlegt.
- Schakel voor stabiele bot-naar-bot-observatie Bot-to-Bot Communication Mode in
@BotFatherin voor beide bots en zorg dat de driverbot groepsbotverkeer kan observeren. - Schrijft een Telegram QA-rapport, samenvatting en artifact met waargenomen berichten onder
.artifacts/qa-e2e/.... Antwoordscenario’s bevatten RTT vanaf het verzendverzoek van de driver tot het waargenomen SUT-antwoord.
qa-channel is de brede synthetische suite en maakt geen deel uit van die matrix.
Gedeelde Telegram-referenties via Convex (v1)
Wanneer--credential-source convex (of OPENCLAW_QA_CREDENTIAL_SOURCE=convex) is ingeschakeld voor
openclaw qa telegram, verkrijgt QA lab een exclusieve lease uit een pool met Convex-backend, verstuurt Heartbeats
voor die lease terwijl de lane draait, en geeft de lease vrij bij afsluiten.
Referentieprojectscaffold voor Convex:
qa/convex-credential-broker/
OPENCLAW_QA_CONVEX_SITE_URL(bijvoorbeeldhttps://your-deployment.convex.site)- Eén secret voor de geselecteerde rol:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERvoormaintainerOPENCLAW_QA_CONVEX_SECRET_CIvoorci
- Selectie van referentierol:
- CLI:
--credential-role maintainer|ci - Standaard env:
OPENCLAW_QA_CREDENTIAL_ROLE(standaardciin CI, andersmaintainer)
- CLI:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(standaard1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(standaard30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(standaard90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(standaard15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(standaard/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(optionele trace-id)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1staat loopback-http://-Convex-URL’s toe voor uitsluitend lokale ontwikkeling.
OPENCLAW_QA_CONVEX_SITE_URL hoort bij normaal gebruik https:// te gebruiken.
Beheeropdrachten voor maintainers (pool add/remove/list) vereisen specifiek
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER.
CLI-helpers voor maintainers:
doctor vóór live runs om de Convex-site-URL, broker-secrets,
endpointprefix, HTTP-timeout en admin/list-bereikbaarheid te controleren zonder
secretwaarden af te drukken. Gebruik --json voor machineleesbare uitvoer in scripts en CI-
hulpprogramma’s.
Standaard endpointcontract (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1):
POST /acquire- Verzoek:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Succes:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Uitgeput/opnieuw te proberen:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Verzoek:
POST /heartbeat- Verzoek:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Succes:
{ status: "ok" }(of lege2xx)
- Verzoek:
POST /release- Verzoek:
{ kind, ownerId, actorRole, credentialId, leaseToken } - Succes:
{ status: "ok" }(of lege2xx)
- Verzoek:
POST /admin/add(alleen maintainer-secret)- Verzoek:
{ kind, actorId, payload, note?, status? } - Succes:
{ status: "ok", credential }
- Verzoek:
POST /admin/remove(alleen maintainer-secret)- Verzoek:
{ credentialId, actorId } - Succes:
{ status: "ok", changed, credential } - Actieve lease-guard:
{ status: "error", code: "LEASE_ACTIVE", ... }
- Verzoek:
POST /admin/list(alleen maintainer-secret)- Verzoek:
{ kind?, status?, includePayload?, limit? } - Succes:
{ status: "ok", credentials, count }
- Verzoek:
{ groupId: string, driverToken: string, sutToken: string }groupIdmoet een numerieke Telegram-chat-id-string zijn.admin/addvalideert deze vorm voorkind: "telegram"en weigert verkeerd gevormde payloads.
Een kanaal toevoegen aan QA
De architectuur- en scenario-helpernamen voor nieuwe kanaaladapters staan in QA-overzicht → Een kanaal toevoegen. De minimumeis: implementeer de transportrunner op de gedeeldeqa-lab-host-seam, declareer qaRunners in het Plugin-manifest, mount als openclaw qa <runner> en schrijf scenario’s onder qa/scenarios/.
Testsuites (wat draait waar)
Zie de suites als “toenemende realiteitsgraad” (en toenemende flakiness/kosten):Unit / integration (standaard)
- Opdracht:
pnpm test - Config: niet-getargete runs gebruiken de
vitest.full-*.config.ts-shardset en kunnen multi-project-shards uitbreiden naar per-project-configs voor parallelle planning - Bestanden: core-/unit-inventarissen onder
src/**/*.test.ts,packages/**/*.test.tsentest/**/*.test.ts; UI-unittests draaien in de toegewezenunit-ui-shard - Scope:
- Pure unittests
- In-process integration-tests (Gateway-auth, routering, tooling, parsing, config)
- Deterministische regressies voor bekende bugs
- Verwachtingen:
- Draait in CI
- Geen echte keys vereist
- Moet snel en stabiel zijn
- Resolver- en public-surface-loadertests moeten breed
api.js- enruntime-api.js-fallbackgedrag bewijzen met gegenereerde kleine Plugin-fixtures, niet met echte gebundelde Plugin-bron-API’s. Echte Plugin-API-loads horen thuis in Plugin-eigen contract-/integratiesuites.
Projecten, shards en scoped lanes
Projecten, shards en scoped lanes
- Niet-gerichte
pnpm test-runs voeren twaalf kleinere shard-configuraties uit (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) in plaats van één gigantisch native root-projectproces. Dit verlaagt de piek-RSS op belaste machines en voorkomt dat auto-reply-/extensiewerk niet-gerelateerde suites verdringt. pnpm test --watchgebruikt nog steeds de native root-projectgrafiekvitest.config.ts, omdat een watch-loop met meerdere shards niet praktisch is.pnpm test,pnpm test:watchenpnpm test:perf:importsrouteren expliciete bestands-/directorydoelen eerst via gescopete lanes, zodatpnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsde volledige opstartkosten van het root-project vermijdt.pnpm test:changedbreidt gewijzigde git-paden standaard uit naar goedkope gescopete lanes: directe testbewerkingen, aangrenzende*.test.ts-bestanden, expliciete bronmappings en lokale afhankelijken in de importgrafiek. Config-/setup-/package-bewerkingen voeren tests niet breed uit, tenzij je explicietOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedgebruikt.pnpm check:changedis de normale slimme lokale check-gate voor smal werk. Deze classificeert de diff in core, core-tests, extensies, extensietests, apps, docs, releasemetadata, live Docker-tooling en tooling, en voert daarna de bijpassende typecheck-, lint- en guard-commando’s uit. Vitest-tests worden niet uitgevoerd; gebruikpnpm test:changedof explicietpnpm test <target>voor testbewijs. Versiebumpen met alleen releasemetadata voeren gerichte versie-/config-/root-afhankelijkheidschecks uit, met een guard die package-wijzigingen buiten het top-level versieveld afwijst.- Bewerkingen aan de live Docker ACP-harness voeren gerichte checks uit: shellsyntaxis voor de live Docker-authscripts en een dry-run van de live Docker-scheduler.
package.json-wijzigingen worden alleen meegenomen wanneer de diff beperkt is totscripts["test:docker:live-*"]; dependency-, export-, versie- en andere package-oppervlakbewerkingen gebruiken nog steeds de bredere guards. - Import-lichte unittests uit agents, commands, plugins, auto-reply-helpers,
plugin-sdken vergelijkbare pure utility-gebieden lopen via deunit-fast-lane, dietest/setup-openclaw-runtime.tsoverslaat; stateful/runtime-zware bestanden blijven op de bestaande lanes. - Geselecteerde helperbronbestanden voor
plugin-sdkencommandsmappen changed-mode-runs ook naar expliciete aangrenzende tests in die lichte lanes, zodat helperbewerkingen vermijden dat de volledige zware suite voor die directory opnieuw draait. auto-replyheeft aparte buckets voor top-level core-helpers, top-levelreply.*-integratietests en de subtreesrc/auto-reply/reply/**. CI splitst de reply-subtree verder in agent-runner-, dispatch- en commands/state-routing-shards, zodat één import-zware bucket niet de volledige Node-staart bezit.- Normale PR/main-CI slaat bewust de extensiebatch-sweep en de release-only
agentic-plugins-shard over. Volledige Release Validation dispatcht de aparte child-workflowPlugin Prereleasevoor die plugin-/extensie-zware suites op releasekandidaten.
Embedded runner coverage
Embedded runner coverage
- Wanneer je inputs voor message-tool discovery of Compaction-runtimecontext wijzigt, behoud beide dekkingsniveaus.
- Voeg gerichte helperregressies toe voor pure routing- en normalisatiegrenzen.
- Houd de embedded runner-integratiesuites gezond:
src/agents/pi-embedded-runner/compact.hooks.test.ts,src/agents/pi-embedded-runner/run.overflow-compaction.test.tsensrc/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts. - Die suites verifiëren dat gescopete ids en Compaction-gedrag nog steeds
via de echte
run.ts- /compact.ts-paden stromen; tests met alleen helpers zijn geen voldoende vervanging voor die integratiepaden.
Vitest pool and isolation defaults
Vitest pool and isolation defaults
- De basisconfiguratie van Vitest gebruikt standaard
threads. - De gedeelde Vitest-configuratie zet
isolate: falsevast en gebruikt de niet-geïsoleerde runner voor de root-projecten, e2e- en live-configuraties. - De root-UI-lane behoudt zijn
jsdom-setup en optimizer, maar draait ook op de gedeelde niet-geïsoleerde runner. - Elke
pnpm test-shard erft dezelfde standaardwaardenthreads+isolate: falsevan de gedeelde Vitest-configuratie. scripts/run-vitest.mjsvoegt standaard--no-maglevtoe voor Vitest-child-Node- processen om V8-compile-churn tijdens grote lokale runs te verminderen. StelOPENCLAW_VITEST_ENABLE_MAGLEV=1in om te vergelijken met standaard V8- gedrag.
Fast local iteration
Fast local iteration
pnpm changed:lanestoont welke architecturale lanes een diff activeert.- De pre-commit-hook doet alleen formattering. Deze staged geformatteerde bestanden opnieuw en voert geen lint, typecheck of tests uit.
- Voer
pnpm check:changedexpliciet uit vóór handoff of push wanneer je de slimme lokale check-gate nodig hebt. pnpm test:changedrouteert standaard via goedkope gescopete lanes. GebruikOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedalleen wanneer de agent beslist dat een harness-, config-, package- of contractbewerking echt bredere Vitest-dekking nodig heeft.pnpm test:maxenpnpm test:changed:maxbehouden hetzelfde routinggedrag, alleen met een hogere workerlimiet.- Automatisch schalen van lokale workers is bewust conservatief en schaalt terug wanneer de gemiddelde hostbelasting al hoog is, zodat meerdere gelijktijdige Vitest-runs standaard minder schade aanrichten.
- De basisconfiguratie van Vitest markeert de projecten/configbestanden als
forceRerunTriggers, zodat reruns in changed-mode correct blijven wanneer test- wiring wijzigt. - De configuratie houdt
OPENCLAW_VITEST_FS_MODULE_CACHEingeschakeld op ondersteunde hosts; stelOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/pathin als je één expliciete cachelocatie voor directe profiling wilt.
Perf debugging
Perf debugging
pnpm test:perf:importsschakelt Vitest-importduurrapportage plus import-breakdown-output in.pnpm test:perf:imports:changedbeperkt dezelfde profilingweergave tot bestanden die sindsorigin/mainzijn gewijzigd.- Shard-timingdata wordt geschreven naar
.artifacts/vitest-shard-timings.json. Runs voor de volledige configuratie gebruiken het configuratiepad als sleutel; CI-shards met include-pattern voegen de shardnaam toe, zodat gefilterde shards apart kunnen worden gevolgd. - Wanneer één hete test nog steeds het grootste deel van zijn tijd besteedt aan opstartimports,
houd zware dependencies achter een smalle lokale
*.runtime.ts-seam en mock die seam direct in plaats van runtime-helpers diep te importeren alleen om ze door te geven aanvi.mock(...). pnpm test:perf:changed:bench -- --ref <git-ref>vergelijkt gerouteerdetest:changedmet het native root-projectpad voor die gecommitte diff en print wall time plus maximale macOS-RSS.pnpm test:perf:changed:bench -- --worktreebenchmarkt de huidige dirty tree door de lijst met gewijzigde bestanden viascripts/test-projects.mjsen de root-Vitest-configuratie te routeren.pnpm test:perf:profile:mainschrijft een CPU-profiel van de main-thread voor Vitest-/Vite-opstart- en transform-overhead.pnpm test:perf:profile:runnerschrijft runner-CPU+heap-profielen voor de unitsuite met bestandsparallellisme uitgeschakeld.
Stabiliteit (Gateway)
- Commando:
pnpm test:stability:gateway - Configuratie:
vitest.gateway.config.ts, geforceerd naar één worker - Scope:
- Start standaard een echte loopback-Gateway met diagnostiek ingeschakeld
- Stuurt synthetische gateway-berichten, memory- en large-payload-churn door het diagnostische eventpad
- Queryt
diagnostics.stabilityvia de Gateway WS RPC - Dekt helpers voor persistentie van de diagnostische stabiliteitsbundel
- Bevestigt dat de recorder begrensd blijft, synthetische RSS-samples onder het drukbudget blijven en wachtrijdieptes per sessie teruglopen naar nul
- Verwachtingen:
- CI-veilig en zonder sleutels
- Smalle lane voor opvolging van stabiliteitsregressies, geen vervanging voor de volledige Gateway-suite
E2E (Gateway smoke)
- Commando:
pnpm test:e2e - Configuratie:
vitest.e2e.config.ts - Bestanden:
src/**/*.e2e.test.ts,test/**/*.e2e.test.tsen E2E-tests van gebundelde plugins onderextensions/ - Runtime-standaardwaarden:
- Gebruikt Vitest
threadsmetisolate: false, passend bij de rest van de repo. - Gebruikt adaptieve workers (CI: maximaal 2, lokaal: standaard 1).
- Draait standaard in stille modus om console-I/O-overhead te verminderen.
- Gebruikt Vitest
- Nuttige overrides:
OPENCLAW_E2E_WORKERS=<n>om het aantal workers te forceren (begrensd op 16).OPENCLAW_E2E_VERBOSE=1om uitgebreide console-output opnieuw in te schakelen.
- Scope:
- End-to-end-gedrag van de Gateway met meerdere instanties
- WebSocket-/HTTP-oppervlakken, node-pairing en zwaardere networking
- Verwachtingen:
- Draait in CI (wanneer ingeschakeld in de pipeline)
- Geen echte sleutels vereist
- Meer bewegende delen dan unittests (kan trager zijn)
E2E: OpenShell-backend smoke
- Commando:
pnpm test:e2e:openshell - Bestand:
extensions/openshell/src/backend.e2e.test.ts - Scope:
- Start een geïsoleerde OpenShell-Gateway op de host via Docker
- Maakt een sandbox vanuit een tijdelijk lokaal Dockerfile
- Oefent de OpenShell-backend van OpenClaw uit via echte
sandbox ssh-config+ SSH exec - Verifieert remote-canoniek bestandssysteemgedrag via de sandbox-fs-bridge
- Verwachtingen:
- Alleen opt-in; geen onderdeel van de standaard
pnpm test:e2e-run - Vereist een lokale
openshell-CLI plus een werkende Docker-daemon - Gebruikt geïsoleerde
HOME/XDG_CONFIG_HOMEen vernietigt daarna de test-Gateway en sandbox
- Alleen opt-in; geen onderdeel van de standaard
- Nuttige overrides:
OPENCLAW_E2E_OPENSHELL=1om de test in te schakelen wanneer je de bredere e2e-suite handmatig draaitOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshellom naar een niet-standaard CLI-binary of wrapperscript te wijzen
Live (echte providers + echte modellen)
- Commando:
pnpm test:live - Configuratie:
vitest.live.config.ts - Bestanden:
src/**/*.live.test.ts,test/**/*.live.test.tsen live-tests van gebundelde plugins onderextensions/ - Standaard: ingeschakeld door
pnpm test:live(zetOPENCLAW_LIVE_TEST=1) - Scope:
- “Werkt deze provider/dit model vandaag daadwerkelijk met echte credentials?”
- Vangt providerformatwijzigingen, eigenaardigheden bij tool-calling, auth-problemen en rate-limitgedrag
- Verwachtingen:
- Niet ontworpen om CI-stabiel te zijn (echte netwerken, echt providerbeleid, quota, storingen)
- Kost geld / gebruikt rate limits
- Draai liever afgebakende subsets in plaats van “alles”
- Live-runs sourcen
~/.profileom ontbrekende API-sleutels op te halen. - Standaard isoleren live-runs nog steeds
HOMEen kopiëren ze config-/auth-materiaal naar een tijdelijke test-home, zodat unit-fixtures je echte~/.openclawniet kunnen muteren. - Stel
OPENCLAW_LIVE_USE_REAL_HOME=1alleen in wanneer je bewust wilt dat live-tests je echte home-directory gebruiken. pnpm test:livegebruikt nu standaard een stillere modus: het behoudt[live] ...-voortgangsoutput, maar onderdrukt de extra~/.profile-melding en dempt Gateway-bootstraplogs/Bonjour-geklets. StelOPENCLAW_LIVE_TEST_QUIET=0in als je de volledige opstartlogs terug wilt.- API-sleutelrotatie (providerspecifiek): stel
*_API_KEYSin met komma-/puntkomma-indeling of*_API_KEY_1,*_API_KEY_2(bijvoorbeeldOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) of per-live override viaOPENCLAW_LIVE_*_KEY; tests proberen opnieuw bij rate-limit-responses. - Voortgangs-/Heartbeat-output:
- Live-suites sturen nu voortgangsregels naar stderr, zodat lange providercalls zichtbaar actief zijn, zelfs wanneer Vitest-consolecapture stil is.
vitest.live.config.tsschakelt Vitest-console-interceptie uit, zodat provider-/Gateway-voortgangsregels onmiddellijk streamen tijdens live-runs.- Stem direct-model-Heartbeats af met
OPENCLAW_LIVE_HEARTBEAT_MS. - Stem Gateway-/probe-Heartbeats af met
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Welke suite moet ik draaien?
Gebruik deze beslissingstabel:- Logica/tests bewerken: voer
pnpm testuit (enpnpm test:coverageals je veel hebt gewijzigd) - Gateway-netwerken / WS-protocol / koppelen aanraken: voeg
pnpm test:e2etoe - “my bot is down” debuggen / provider-specifieke fouten / toolaanroepen: voer een ingeperkte
pnpm test:liveuit
Live-tests (met netwerktoegang)
Voor de live modelmatrix, CLI-backend-smoketests, ACP-smoketests, de Codex app-server harness en alle live tests voor mediaproviders (Deepgram, BytePlus, ComfyUI, image, music, video, media harness) — plus credentialafhandeling voor live runs — zie Testen — live-suites.Docker-runners (optionele controles voor “werkt in Linux”)
Deze Docker-runners zijn verdeeld in twee groepen:- Live-model-runners:
test:docker:live-modelsentest:docker:live-gatewayvoeren alleen hun overeenkomende live bestand met profielsleutel uit binnen de Docker-image van de repo (src/agents/models.profiles.live.test.tsensrc/gateway/gateway-models.profiles.live.test.ts), waarbij je lokale configuratiemap en werkruimte worden gemount (en~/.profilewordt gesourced als die is gemount). De overeenkomende lokale entrypoints zijntest:live:models-profilesentest:live:gateway-profiles. - Docker-live-runners gebruiken standaard een kleinere smokelimiet zodat een volledige Docker-sweep praktisch blijft:
test:docker:live-modelsgebruikt standaardOPENCLAW_LIVE_MAX_MODELS=12, entest:docker:live-gatewaygebruikt standaardOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000enOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Overschrijf die env-vars wanneer je expliciet de grotere uitputtende scan wilt. test:docker:allbouwt de live Docker-image eenmalig viatest:docker:live-build, verpakt OpenClaw eenmalig als npm-tarball viascripts/package-openclaw-for-docker.mjs, en bouwt/hergebruikt daarna tweescripts/e2e/Dockerfile-images. De kale image is alleen de Node/Git-runner voor install/update/plugin-dependency-lanes; die lanes mounten de vooraf gebouwde tarball. De functionele image installeert dezelfde tarball in/appvoor lanes met functionaliteit van de gebouwde app. Docker-lanedefinities staan inscripts/lib/docker-e2e-scenarios.mjs; plannerlogica staat inscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsvoert het geselecteerde plan uit. De aggregaatrunner gebruikt een gewogen lokale scheduler:OPENCLAW_DOCKER_ALL_PARALLELISMbepaalt processlots, terwijl resourcecaps voorkomen dat zware live-, npm-install- en multi-service-lanes allemaal tegelijk starten. Als een enkele lane zwaarder is dan de actieve caps, kan de scheduler die nog steeds starten wanneer de pool leeg is en die daarna alleen laten draaien totdat er weer capaciteit beschikbaar is. Standaarden zijn 10 slots,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=10enOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; pasOPENCLAW_DOCKER_ALL_WEIGHT_LIMITofOPENCLAW_DOCKER_ALL_DOCKER_LIMITalleen aan wanneer de Docker-host meer speelruimte heeft. De runner voert standaard een Docker-preflight uit, verwijdert verouderde OpenClaw E2E-containers, drukt elke 30 seconden status af, slaat timings van succesvolle lanes op in.artifacts/docker-tests/lane-timings.jsonen gebruikt die timings om langere lanes bij latere runs eerst te starten. GebruikOPENCLAW_DOCKER_ALL_DRY_RUN=1om het gewogen lanemanifest af te drukken zonder Docker te bouwen of uit te voeren, ofnode scripts/test-docker-all.mjs --plan-jsonom het CI-plan af te drukken voor geselecteerde lanes, package-/imagebehoeften en credentials.Package Acceptanceis de GitHub-native package-gate voor “werkt deze installeerbare tarball als product?” Deze resolveert een kandidaatpackage uitsource=npm,source=ref,source=urlofsource=artifact, uploadt deze alspackage-under-testen voert daarna de herbruikbare Docker E2E-lanes uit tegen exact die tarball in plaats van de geselecteerde ref opnieuw te verpakken.workflow_refselecteert de vertrouwde workflow-/harness-scripts, terwijlpackage_refde source-commit/branch/tag selecteert die moet worden verpakt wanneersource=ref; hierdoor kan huidige acceptatielogica oudere vertrouwde commits valideren. Profielen zijn geordend op breedte:smokeis snelle installatie/channel/agent plus Gateway/config,packageis het package/update/plugin-contract en de standaard native vervanging voor de meeste Parallels-package/update-dekking,productvoegt MCP-channels, Cron/subagent-opschoning, OpenAI-webzoekfunctie en OpenWebUI toe, enfullvoert de Docker-chunks van het releasepad uit met OpenWebUI. Releasevalidatie voert een aangepaste packagedelta (bundled-channel-deps-compat plugins-offline) plus Telegram-package-QA uit, omdat de Docker-chunks van het releasepad de overlappende package/update/plugin-lanes al dekken. Gerichte GitHub-Docker-heruitvoercommando’s die uit artifacts worden gegenereerd bevatten eerdere package-artifact- en voorbereide image-inputs wanneer beschikbaar, zodat mislukte lanes kunnen vermijden dat het package en de images opnieuw worden gebouwd.- Build- en releasecontroles voeren
scripts/check-cli-bootstrap-imports.mjsuit na tsdown. De guard doorloopt de statische gebouwde graph vanafdist/entry.jsendist/cli/run-main.jsen faalt als pre-dispatch startup packagedependencies zoals Commander, prompt-UI, undici of logging importeert vóór commandodispatch; hij houdt ook de gebundelde Gateway-run-chunk binnen budget en weigert statische imports van bekende koude Gateway-paden. Packaged CLI-smoke dekt ook root-help, onboard-help, doctor-help, status, config schema en een model-list-commando. - Legacy compatibiliteit van Package Acceptance is begrensd op
2026.4.25(2026.4.25-beta.*inbegrepen). Tot en met die cutoff tolereert de harness alleen metadatahiaten van geleverde packages: weggelaten private QA-inventarisitems, ontbrekendegateway install --wrapper, ontbrekende patchbestanden in de uit tarball afgeleide git-fixture, ontbrekende gepersisteerdeupdate.channel, legacy plugin-install-record-locaties, ontbrekende marketplace-install-record-persistentie en configmetadatamigratie tijdensplugins update. Voor packages na2026.4.25zijn die paden strikte fouten. - Container-smoke-runners:
test:docker:openwebui,test:docker:onboard,test:docker:npm-onboard-channel-agent,test:docker:update-channel-switch,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:pi-bundle-mcp-tools,test:docker:cron-mcp-cleanup,test:docker:plugins,test:docker:plugin-updateentest:docker:config-reloadstarten een of meer echte containers op en verifiëren integratiepaden op hoger niveau.
- Directe modellen:
pnpm test:docker:live-models(script:scripts/test-live-models-docker.sh) - ACP-bind-smoketest:
pnpm test:docker:live-acp-bind(script:scripts/test-live-acp-bind-docker.sh; dekt standaard Claude, Codex en Gemini, met strikte Droid/OpenCode-dekking viapnpm test:docker:live-acp-bind:droidenpnpm test:docker:live-acp-bind:opencode) - CLI-backend-smoketest:
pnpm test:docker:live-cli-backend(script:scripts/test-live-cli-backend-docker.sh) - Smoketest voor het Codex app-server-testharnas:
pnpm test:docker:live-codex-harness(script:scripts/test-live-codex-harness-docker.sh) - Gateway + ontwikkelagent:
pnpm test:docker:live-gateway(script:scripts/test-live-gateway-models-docker.sh) - Observability-smoketest:
pnpm qa:otel:smokeis een private QA-source-checkout-lane. Deze maakt bewust geen deel uit van Docker-release-lanes voor pakketten omdat de npm-tarball QA Lab weglaat. - Open WebUI live-smoketest:
pnpm test:docker:openwebui(script:scripts/e2e/openwebui-docker.sh) - Onboardingwizard (TTY, volledige scaffolding):
pnpm test:docker:onboard(script:scripts/e2e/onboard-docker.sh) - Npm-tarball-smoketest voor onboarding/kanaal/agent:
pnpm test:docker:npm-onboard-channel-agentinstalleert de ingepakte OpenClaw-tarball globaal in Docker, configureert OpenAI via env-ref-onboarding plus standaard Telegram, verifieert dat doctor geactiveerde runtime-afhankelijkheden van plugins heeft gerepareerd, en voert één gemockte OpenAI-agentbeurt uit. Hergebruik een vooraf gebouwde tarball metOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz, sla de host-rebuild over metOPENCLAW_NPM_ONBOARD_HOST_BUILD=0, of wissel van kanaal metOPENCLAW_NPM_ONBOARD_CHANNEL=discord. - Smoketest voor wisselen van updatekanaal:
pnpm test:docker:update-channel-switchinstalleert de ingepakte OpenClaw-tarball globaal in Docker, wisselt van pakketstablenaar gitdev, verifieert het opgeslagen kanaal en de werking van plugins na de update, wisselt daarna terug naar pakketstableen controleert de updatestatus. - Smoketest voor sessie-runtimecontext:
pnpm test:docker:session-runtime-contextverifieert persistente transcriptopslag van verborgen runtimecontext plus doctor-reparatie van getroffen gedupliceerde prompt-herschrijftakken. - Bun-smoketest voor globale installatie:
bash scripts/e2e/bun-global-install-smoke.shpakt de huidige tree in, installeert deze metbun install -gin een geïsoleerde home, en verifieert datopenclaw infer image providers --jsongebundelde imageproviders retourneert in plaats van te blijven hangen. Hergebruik een vooraf gebouwde tarball metOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz, sla de host-build over metOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0, of kopieerdist/uit een gebouwde Docker-image metOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local. - Docker-smoketest voor installer:
bash scripts/test-install-sh-docker.shdeelt één npm-cache over de root-, update- en direct-npm-containers. De update-smoketest gebruikt standaard npmlatestals stabiele baseline voordat wordt geüpgraded naar de kandidaat-tarball. Overschrijf dit lokaal metOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22, of op GitHub met deupdate_baseline_version-invoer van de Install Smoke-workflow. Niet-root installercontroles houden een geïsoleerde npm-cache aan, zodat cachevermeldingen van root geen lokaal installatiegedrag van de gebruiker verhullen. StelOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cachein om de root/update/direct-npm-cache bij lokale herhalingen te hergebruiken. - Install Smoke CI slaat de gedupliceerde directe npm-globale update over met
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1; voer het script lokaal zonder die env uit wanneer dekking voor directenpm install -gnodig is. - Smoketest voor agents die gedeelde werkruimte verwijderen via CLI:
pnpm test:docker:agents-delete-shared-workspace(script:scripts/e2e/agents-delete-shared-workspace-docker.sh) bouwt standaard de root-Dockerfile-image, seedt twee agents met één werkruimte in een geïsoleerde container-home, voertagents delete --jsonuit, en verifieert geldige JSON plus behoud van werkruimtegedrag. Hergebruik de install-smoke-image metOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1. - Gateway-netwerken (twee containers, WS-auth + health):
pnpm test:docker:gateway-network(script:scripts/e2e/gateway-network-docker.sh) - Browser-CDP-snapshot-smoketest:
pnpm test:docker:browser-cdp-snapshot(script:scripts/e2e/browser-cdp-snapshot-docker.sh) bouwt de source-E2E-image plus een Chromium-laag, start Chromium met ruwe CDP, voertbrowser doctor --deepuit, en verifieert dat CDP-rolsnapshots link-URL’s, cursor-gepromoveerde klikbare elementen, iframe-referenties en framemetadata dekken. - Regressie voor minimale reasoning van OpenAI Responses
web_search:pnpm test:docker:openai-web-search-minimal(script:scripts/e2e/openai-web-search-minimal-docker.sh) voert een gemockte OpenAI-server uit via Gateway, verifieert datweb_searchreasoning.effortverhoogt vanminimalnaarlow, forceert daarna de provider-schema-afwijzing en controleert dat de ruwe details in Gateway-logboeken verschijnen. - MCP-kanaalbrug (geseed Gateway + stdio-brug + ruwe smoketest voor Claude-notificatieframes):
pnpm test:docker:mcp-channels(script:scripts/e2e/mcp-channels-docker.sh) - Pi-bundel-MCP-tools (echte stdio-MCP-server + ingesloten Pi-profiel-smoketest voor toestaan/weigeren):
pnpm test:docker:pi-bundle-mcp-tools(script:scripts/e2e/pi-bundle-mcp-tools-docker.sh) - Cron/subagent-MCP-opruiming (echte Gateway + teardown van stdio-MCP-child na geïsoleerde cron- en eenmalige subagent-runs):
pnpm test:docker:cron-mcp-cleanup(script:scripts/e2e/cron-mcp-cleanup-docker.sh) - Plugins (installatiesmoketest, ClawHub kitchen-sink-installatie/de-installatie, marketplace-updates, en Claude-bundel inschakelen/inspecteren):
pnpm test:docker:plugins(script:scripts/e2e/plugins-docker.sh) StelOPENCLAW_PLUGINS_E2E_CLAWHUB=0in om het ClawHub-blok over te slaan, of overschrijf het standaard kitchen-sink-pakket/runtime-paar metOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECenOPENCLAW_PLUGINS_E2E_CLAWHUB_ID. ZonderOPENCLAW_CLAWHUB_URL/CLAWHUB_URLgebruikt de test een hermetische lokale ClawHub-fixtureserver. - Smoketest voor ongewijzigde plugin-update:
pnpm test:docker:plugin-update(script:scripts/e2e/plugin-update-unchanged-docker.sh) - Smoketest voor metadata bij config-herladen:
pnpm test:docker:config-reload(script:scripts/e2e/config-reload-source-docker.sh) - Runtime-afhankelijkheden van gebundelde plugins:
pnpm test:docker:bundled-channel-depsbouwt standaard een kleine Docker-runner-image, bouwt en pakt OpenClaw één keer in op de host, en mount die tarball daarna in elk Linux-installatiescenario. Hergebruik de image metOPENCLAW_SKIP_DOCKER_BUILD=1, sla de host-rebuild over na een verse lokale build metOPENCLAW_BUNDLED_CHANNEL_HOST_BUILD=0, of verwijs naar een bestaande tarball metOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz. De volledige Docker-aggregate en bundled-channel-chunks van het releasepad pakken deze tarball één keer vooraf in, en sharden daarna gebundelde kanaalcontroles naar onafhankelijke lanes, inclusief aparte update-lanes voor Telegram, Discord, Slack, Feishu, memory-lancedb en ACPX. Releasechunks splitsen kanaalsmoketests, updatedoelen en setup/runtime-contracten op inbundled-channels-core,bundled-channels-update-a,bundled-channels-update-benbundled-channels-contracts; de aggregate chunkbundled-channelsblijft beschikbaar voor handmatige herhalingen. De releaseworkflow splitst ook provider-installerchunks en installatie-/de-installatiechunks voor gebundelde plugins; legacy chunkspackage-update,plugins-runtimeenplugins-integrationsblijven aggregate aliassen voor handmatige herhalingen. GebruikOPENCLAW_BUNDLED_CHANNELS=telegram,slackom de kanaalmatrix te versmallen wanneer de gebundelde lane direct wordt uitgevoerd, ofOPENCLAW_BUNDLED_CHANNEL_UPDATE_TARGETS=telegram,acpxom het updatescenario te versmallen. Docker-runs per scenario gebruiken standaardOPENCLAW_BUNDLED_CHANNEL_DOCKER_RUN_TIMEOUT=900s; het updatescenario met meerdere doelen gebruikt standaardOPENCLAW_BUNDLED_CHANNEL_UPDATE_DOCKER_RUN_TIMEOUT=2400s. De lane verifieert ook datchannels.<id>.enabled=falseenplugins.entries.<id>.enabled=falsedoctor-/runtime-afhankelijkheidsreparatie onderdrukken. - Versmal runtime-afhankelijkheden van gebundelde plugins tijdens iteratie door niet-gerelateerde scenario’s uit te schakelen, bijvoorbeeld:
OPENCLAW_BUNDLED_CHANNEL_SCENARIOS=0 OPENCLAW_BUNDLED_CHANNEL_UPDATE_SCENARIO=0 OPENCLAW_BUNDLED_CHANNEL_ROOT_OWNED_SCENARIO=0 OPENCLAW_BUNDLED_CHANNEL_SETUP_ENTRY_SCENARIO=0 pnpm test:docker:bundled-channel-deps.
OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE winnen nog steeds wanneer ze zijn ingesteld. Wanneer OPENCLAW_SKIP_DOCKER_BUILD=1 naar een externe gedeelde image verwijst, trekken de scripts deze binnen als deze nog niet lokaal aanwezig is. De QR- en installer-Docker-tests houden hun eigen Dockerfiles omdat ze pakket-/installatiegedrag valideren in plaats van de gedeelde runtime van de gebouwde app.
De Docker-runners voor live modellen binden ook de huidige checkout read-only en
stagen deze in een tijdelijke werkdir binnen de container. Dit houdt de runtime-
image slank terwijl Vitest nog steeds tegen je exacte lokale source/config wordt
uitgevoerd. De stagingstap slaat grote lokale-only caches en app-buildoutputs over,
zoals .pnpm-store, .worktrees, __openclaw_vitest__ en app-lokale .build-
of Gradle-outputdirectories, zodat Docker-live-runs geen minuten besteden aan het
kopiëren van machinespecifieke artefacten.
Ze stellen ook OPENCLAW_SKIP_CHANNELS=1 in, zodat Gateway-liveprobes geen echte
Telegram/Discord/etc.-kanaalworkers binnen de container starten.
test:docker:live-models voert nog steeds pnpm test:live uit, dus geef ook
OPENCLAW_LIVE_GATEWAY_* door wanneer je Gateway-live-dekking vanuit die
Docker-lane moet versmallen of uitsluiten.
test:docker:openwebui is een compatibiliteitssmoketest op hoger niveau: deze start
een OpenClaw Gateway-container met de OpenAI-compatibele HTTP-endpoints ingeschakeld,
start een gepinde Open WebUI-container tegen die Gateway, meldt zich aan via
Open WebUI, verifieert dat /api/models openclaw/default aanbiedt, en verzendt
daarna een echt chatverzoek via de /api/chat/completions-proxy van Open WebUI.
De eerste run kan merkbaar langzamer zijn omdat Docker mogelijk de Open WebUI-image
moet ophalen en Open WebUI mogelijk zijn eigen cold-start-setup moet afronden.
Deze lane verwacht een bruikbare sleutel voor een live model, en OPENCLAW_PROFILE_FILE
(~/.profile standaard) is de primaire manier om deze in Docker-runs aan te leveren.
Succesvolle runs printen een kleine JSON-payload zoals { "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels is bewust deterministisch en heeft geen echt
Telegram-, Discord- of iMessage-account nodig. Deze start een geseede Gateway-
container, start een tweede container die openclaw mcp serve spawnt, en verifieert
daarna routed gesprekdetectie, transcriptlezingen, attachmentmetadata,
live-eventqueuegedrag, routering van uitgaande verzendingen, en kanaal- +
machtigingsnotificaties in Claude-stijl over de echte stdio-MCP-brug. De
notificatiecontrole inspecteert de ruwe stdio-MCP-frames direct, zodat de smoketest
valideert wat de brug daadwerkelijk emitteert, niet alleen wat een specifieke
client-SDK toevallig zichtbaar maakt.
test:docker:pi-bundle-mcp-tools is deterministisch en heeft geen live-modelsleutel
nodig. Deze bouwt de repo-Docker-image, start een echte stdio-MCP-probeserver binnen
de container, materialiseert die server via de ingesloten Pi-bundel-MCP-runtime,
voert de tool uit, en verifieert daarna dat coding en messaging bundle-mcp-
tools behouden terwijl minimal en tools.deny: ["bundle-mcp"] ze filteren.
test:docker:cron-mcp-cleanup is deterministisch en heeft geen live-modelsleutel
nodig. Deze start een geseede Gateway met een echte stdio-MCP-probeserver, voert
een geïsoleerde cron-beurt en een eenmalige /subagents spawn-childbeurt uit, en
verifieert daarna dat het MCP-childproces na elke run afsluit.
Handmatige ACP-smoketest voor thread in gewone taal (geen CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Bewaar dit script voor regressie-/debugworkflows. Het kan opnieuw nodig zijn voor validatie van ACP-threadroutering, dus verwijder het niet.
OPENCLAW_CONFIG_DIR=...(standaard:~/.openclaw) gekoppeld aan/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(standaard:~/.openclaw/workspace) gekoppeld aan/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...(standaard:~/.profile) gekoppeld aan/home/node/.profileen ingelezen voordat tests worden uitgevoerdOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1om alleen env-vars te verifiëren die uitOPENCLAW_PROFILE_FILEworden ingelezen, met tijdelijke config-/workspace-mappen en zonder externe CLI-auth-koppelingenOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(standaard:~/.cache/openclaw/docker-cli-tools) gekoppeld aan/home/node/.npm-globalvoor gecachete CLI-installaties binnen Docker- Externe CLI-auth-mappen/-bestanden onder
$HOMEworden alleen-lezen gekoppeld onder/host-auth...en daarna naar/home/node/...gekopieerd voordat tests starten- Standaardmappen:
.minimax - Standaardbestanden:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Versmalde provider-runs koppelen alleen de benodigde mappen/bestanden die worden afgeleid uit
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Overschrijf handmatig met
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=noneof een kommagescheiden lijst zoalsOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Standaardmappen:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...om de run te versmallenOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...om providers in de container te filterenOPENCLAW_SKIP_DOCKER_BUILD=1om een bestaandeopenclaw:local-live-image opnieuw te gebruiken voor herhalingen die geen rebuild nodig hebbenOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1om te garanderen dat credentials uit de profielopslag komen (niet uit env)OPENCLAW_OPENWEBUI_MODEL=...om het model te kiezen dat door de Gateway voor de Open WebUI-smoke beschikbaar wordt gesteldOPENCLAW_OPENWEBUI_PROMPT=...om de nonce-check-prompt te overschrijven die door de Open WebUI-smoke wordt gebruiktOPENWEBUI_IMAGE=...om de gepinde Open WebUI-image-tag te overschrijven
Docs-sanity
Voer docs-controles uit na docs-bewerkingen:pnpm check:docs.
Voer volledige Mintlify-ankervalidatie uit wanneer je ook controles van koppen binnen pagina’s nodig hebt: pnpm docs:check-links:anchors.
Offline regressie (CI-veilig)
Dit zijn regressies van de “echte pipeline” zonder echte providers:- Gateway-toolaanroepen (mock OpenAI, echte Gateway + agent-loop):
src/gateway/gateway.test.ts(case: “runs a mock OpenAI tool call end-to-end via gateway agent loop”) - Gateway-wizard (WS
wizard.start/wizard.next, schrijft config + auth afgedwongen):src/gateway/gateway.test.ts(case: “runs wizard over ws and writes auth token config”)
Betrouwbaarheidsevaluaties voor agenten (Skills)
We hebben al enkele CI-veilige tests die zich gedragen als “betrouwbaarheidsevaluaties voor agenten”:- Mock-toolaanroepen via de echte Gateway + agent-loop (
src/gateway/gateway.test.ts). - End-to-end wizardflows die sessiebedrading en config-effecten valideren (
src/gateway/gateway.test.ts).
- Besluitvorming: als skills in de prompt worden vermeld, kiest de agent dan de juiste skill (of vermijdt hij irrelevante)?
- Naleving: leest de agent
SKILL.mdvóór gebruik en volgt hij vereiste stappen/args? - Workflowcontracten: scenario’s met meerdere beurten die toolvolgorde, overdracht van sessiegeschiedenis en sandboxgrenzen bevestigen.
- Een scenariorunner met mockproviders om toolaanroepen + volgorde, skill-bestandslezingen en sessiebedrading te bevestigen.
- Een kleine suite met skillgerichte scenario’s (gebruiken vs. vermijden, gating, promptinjectie).
- Optionele live-evaluaties (opt-in, env-gated) pas nadat de CI-veilige suite er is.
Contracttests (Plugin- en kanaalvorm)
Contracttests verifiëren dat elke geregistreerde Plugin en elk geregistreerd kanaal voldoet aan zijn interfacecontract. Ze itereren over alle ontdekte Plugins en voeren een suite met vorm- en gedragsasserties uit. De standaardpnpm test-unitlane slaat deze gedeelde seam- en smoke-bestanden bewust over; voer de contractcommando’s expliciet uit wanneer je gedeelde kanaal- of provideroppervlakken aanraakt.
Commando’s
- Alle contracten:
pnpm test:contracts - Alleen kanaalcontracten:
pnpm test:contracts:channels - Alleen providercontracten:
pnpm test:contracts:plugins
Kanaalcontracten
Bevinden zich insrc/channels/plugins/contracts/*.contract.test.ts:
- plugin - Basisvorm van de Plugin (id, naam, capabilities)
- setup - Setup-wizardcontract
- session-binding - Gedrag van sessiebinding
- outbound-payload - Structuur van berichtpayload
- inbound - Afhandeling van inkomende berichten
- actions - Kanaalactiehandlers
- threading - Afhandeling van thread-ID’s
- directory - Directory-/roster-API
- group-policy - Handhaving van groepsbeleid
Providerstatuscontracten
Bevinden zich insrc/plugins/contracts/*.contract.test.ts.
- status - Kanaalstatusprobes
- registry - Vorm van Plugin-register
Providercontracten
Bevinden zich insrc/plugins/contracts/*.contract.test.ts:
- auth - Auth-flowcontract
- auth-choice - Auth-keuze/selectie
- catalog - Modelcatalogus-API
- discovery - Plugin-detectie
- loader - Plugin laden
- runtime - Provider-runtime
- shape - Plugin-vorm/interface
- wizard - Setup-wizard
Wanneer uitvoeren
- Na het wijzigen van plugin-sdk-exports of subpaden
- Na het toevoegen of wijzigen van een kanaal- of provider-Plugin
- Na het refactoren van Plugin-registratie of -detectie
Regressies toevoegen (richtlijnen)
Wanneer je een provider-/modelprobleem oplost dat live is ontdekt:- Voeg indien mogelijk een CI-veilige regressie toe (mock-/stubprovider, of leg de exacte request-shape-transformatie vast)
- Als het inherent alleen live is (rate limits, auth-beleid), houd de live-test smal en opt-in via env-vars
- Richt je bij voorkeur op de kleinste laag die de bug opvangt:
- provider-requestconversie-/replaybug → directe modelltest
- gateway-sessie-/geschiedenis-/toolpipelinebug → gateway-live-smoke of CI-veilige gateway-mocktest
- SecretRef-traversal-guardrail:
src/secrets/exec-secret-ref-id-parity.test.tsleidt één gesampled doel per SecretRef-klasse af uit registermetadata (listSecretTargetRegistryEntries()) en bevestigt daarna dat exec-id’s met traversal-segmenten worden geweigerd.- Als je een nieuwe
includeInPlanSecretRef-doelfamilie toevoegt insrc/secrets/target-registry-data.ts, werk danclassifyTargetClassin die test bij. De test faalt bewust op ongeclassificeerde doel-id’s zodat nieuwe klassen niet stilzwijgend kunnen worden overgeslagen.