68 KiB
| read_when | summary | title | x-i18n | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Test-Kit: Unit-/E2E-/Live-Test-Suites, Docker-Runner und was jeder Test abdeckt | Testen |
|
OpenClaw hat drei Vitest-Suites (Unit/Integration, e2e, Live) und eine kleine Gruppe von Docker-Runnern. Dieses Dokument ist ein Leitfaden dazu, wie wir testen:
- Was jede Suite abdeckt (und was sie bewusst nicht abdeckt).
- Welche Befehle Sie für gängige Workflows ausführen (lokal, vor dem Push, Debugging).
- Wie Live-Tests Anmeldedaten erkennen und Modelle/Provider auswählen.
- Wie Sie Regressionen für reale Modell-/Provider-Probleme hinzufügen.
- QA-Überblick — Architektur, Befehlsoberfläche, Szenarioerstellung.
- Matrix-QA — Referenz für
pnpm openclaw qa matrix. - QA-Kanal — das synthetische Transport-Plugin, das von repo-gestützten Szenarien verwendet wird.
Diese Seite behandelt das Ausführen der regulären Test-Suites und Docker-/Parallels-Runner. Der folgende Abschnitt zu QA-spezifischen Runnern (QA-spezifische Runner) listet die konkreten qa-Aufrufe auf und verweist zurück auf die obigen Referenzen.
Schnellstart
An den meisten Tagen:
- Vollständiges Gate (vor dem Push erwartet):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Schnellerer lokaler Lauf der vollständigen Suite auf einem leistungsstarken Rechner:
pnpm test:max - Direkter Vitest-Watch-Loop:
pnpm test:watch - Direktes Datei-Targeting routet jetzt auch Plugin-/Channel-Pfade:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Bevorzugen Sie zuerst gezielte Läufe, wenn Sie an einem einzelnen Fehler iterieren.
- Docker-gestützte QA-Site:
pnpm qa:lab:up - Linux-VM-gestützte QA-Lane:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
Wenn Sie Tests ändern oder zusätzliche Sicherheit möchten:
- Coverage-Gate:
pnpm test:coverage - E2E-Suite:
pnpm test:e2e
Beim Debuggen realer Provider/Modelle (erfordert echte Anmeldedaten):
- Live-Suite (Modelle + Gateway-Tool-/Bildprüfungen):
pnpm test:live - Eine Live-Datei unauffällig gezielt ausführen:
pnpm test:live -- src/agents/models.profiles.live.test.ts - Laufzeit-Performance-Berichte: dispatchen Sie
OpenClaw Performancemitlive_gpt54=truefür einen echtenopenai/gpt-5.4-Agent-Turn oderdeep_profile=truefür Kova-CPU-/Heap-/Trace-Artefakte. Tägliche geplante Läufe veröffentlichen Artefakte für Mock-Provider-, Deep-Profile- und GPT-5.4-Lanes inopenclaw/clawgrit-reports, wennCLAWGRIT_REPORTS_TOKENkonfiguriert ist. Der Mock-Provider-Bericht enthält außerdem Zahlen zu Gateway-Boot auf Source-Ebene, Speicher, Plugin-Druck, wiederholtem Fake-Model-Hello-Loop und CLI-Start. - Docker-Live-Modell-Sweep:
pnpm test:docker:live-models- Jedes ausgewählte Modell führt jetzt einen Text-Turn plus eine kleine dateileseartige Prüfung aus.
Modelle, deren Metadaten
image-Eingaben ausweisen, führen außerdem einen kleinen Bild-Turn aus. Deaktivieren Sie die zusätzlichen Prüfungen mitOPENCLAW_LIVE_MODEL_FILE_PROBE=0oderOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0, wenn Sie Provider-Fehler isolieren. - CI-Abdeckung: Tägliche
OpenClaw Scheduled Live And E2E Checksund manuelleOpenClaw Release Checksrufen beide den wiederverwendbaren Live-/E2E-Workflow mitinclude_live_suites: trueauf; dieser enthält separate Docker-Live-Modell- Matrix-Jobs, nach Provider geshardet. - Für fokussierte CI-Wiederholungen dispatchen Sie
OpenClaw Live And E2E Checks (Reusable)mitinclude_live_suites: trueundlive_models_only: true. - Fügen Sie neue besonders aussagekräftige Provider-Secrets zu
scripts/ci-hydrate-live-auth.shsowie zu.github/workflows/openclaw-live-and-e2e-checks-reusable.ymlund seinen geplanten/Release-Aufrufern hinzu.
- Jedes ausgewählte Modell führt jetzt einen Text-Turn plus eine kleine dateileseartige Prüfung aus.
Modelle, deren Metadaten
- Native Codex-Bound-Chat-Smoke:
pnpm test:docker:live-codex-bind- Führt eine Docker-Live-Lane gegen den Codex-App-Server-Pfad aus, bindet eine synthetische
Slack-DM mit
/codex bind, übt/codex fastund/codex permissionsaus und verifiziert dann, dass eine einfache Antwort und ein Bildanhang über die native Plugin-Bindung statt über ACP geroutet werden.
- Führt eine Docker-Live-Lane gegen den Codex-App-Server-Pfad aus, bindet eine synthetische
Slack-DM mit
- Codex-App-Server-Harness-Smoke:
pnpm test:docker:live-codex-harness- Führt Gateway-Agent-Turns durch das Plugin-eigene Codex-App-Server-Harness aus,
verifiziert
/codex statusund/codex modelsund übt standardmäßig Bild-, Cron-MCP-, Sub-Agent- und Guardian-Prüfungen aus. Deaktivieren Sie die Sub-Agent-Prüfung mitOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0, wenn Sie andere Codex- App-Server-Fehler isolieren. Für eine fokussierte Sub-Agent-Prüfung deaktivieren Sie die anderen Prüfungen: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. Dies beendet den Lauf nach der Sub-Agent-Prüfung, sofernOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0nicht gesetzt ist.
- Führt Gateway-Agent-Turns durch das Plugin-eigene Codex-App-Server-Harness aus,
verifiziert
- Crestodian-Rettungsbefehl-Smoke:
pnpm test:live:crestodian-rescue-channel- Optionale zusätzliche Sicherheitsprüfung für die Message-Channel-Oberfläche des Rettungsbefehls.
Sie übt
/crestodian statusaus, reiht eine persistente Modelländerung ein, antwortet mit/crestodian yesund verifiziert den Audit-/Config-Schreibpfad.
- Optionale zusätzliche Sicherheitsprüfung für die Message-Channel-Oberfläche des Rettungsbefehls.
Sie übt
- Crestodian-Planner-Docker-Smoke:
pnpm test:docker:crestodian-planner- Führt Crestodian in einem configlosen Container mit einer Fake-Claude-CLI auf
PATHaus und verifiziert, dass der Fuzzy-Planner-Fallback in einen auditierten typisierten Config-Schreibvorgang übersetzt wird.
- Führt Crestodian in einem configlosen Container mit einer Fake-Claude-CLI auf
- Crestodian-Erstlauf-Docker-Smoke:
pnpm test:docker:crestodian-first-run- Startet aus einem leeren OpenClaw-State-Verzeichnis, routet bloßes
openclawan Crestodian, wendet Setup-/Modell-/Agent-/Discord-Plugin- und SecretRef-Schreibvorgänge an, validiert die Config und verifiziert Audit-Einträge. Derselbe Ring-0-Setup-Pfad wird auch in QA Lab durchpnpm openclaw qa suite --scenario crestodian-ring-zero-setupabgedeckt.
- Startet aus einem leeren OpenClaw-State-Verzeichnis, routet bloßes
- Moonshot-/Kimi-Kosten-Smoke: Wenn
MOONSHOT_API_KEYgesetzt ist, führen Sieopenclaw models list --provider moonshot --jsonaus, und führen Sie dann einen isoliertenopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsongegenmoonshot/kimi-k2.6aus. Verifizieren Sie, dass das JSON Moonshot/K2.6 meldet und das Assistententranskript normalisierteusage.costspeichert.
QA-spezifische Runner
Diese Befehle stehen neben den Haupt-Test-Suites, wenn Sie QA-Lab-Realismus benötigen:
CI führt QA Lab in dedizierten Workflows aus. Agentic-Parität ist unter
QA-Lab - All Lanes und Release-Validierung verschachtelt, nicht in einem eigenständigen PR-Workflow.
Breite Validierung sollte Full Release Validation mit
rerun_group=qa-parity oder die QA-Gruppe der Release-Checks verwenden. Stabile/standardmäßige Release-
Checks halten erschöpfenden Live-/Docker-Soak hinter run_release_soak=true; das
full-Profil erzwingt Soak. QA-Lab - All Lanes
läuft nächtlich auf main und per manuellem Dispatch mit der Mock-Parity-Lane, der Live-
Matrix-Lane, der Convex-verwalteten Live-Telegram-Lane und der Convex-verwalteten Live-Discord-
Lane als parallele Jobs. Geplante QA- und Release-Checks übergeben Matrix
explizit --profile fast, während der Standardwert der Matrix-CLI und der manuellen Workflow-Eingabe
all bleibt; manueller Dispatch kann all in transport,
media, e2ee-smoke, e2ee-deep und e2ee-cli-Jobs sharden. OpenClaw Release Checks führt vor der Release-Freigabe Parität plus die schnellen Matrix- und Telegram-Lanes aus
und verwendet mock-openai/gpt-5.5 für Release-Transport-Checks, damit sie
deterministisch bleiben und den normalen Provider-Plugin-Start vermeiden. Diese Live-Transport-
Gateways deaktivieren die Speichersuche; Speicherverhalten bleibt durch die QA-Parity-
Suites abgedeckt.
Full-Release-Live-Media-Shards verwenden
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04, das bereits
ffmpeg und ffprobe enthält. Docker-Live-Modell-/Backend-Shards verwenden das gemeinsam genutzte
ghcr.io/openclaw/openclaw-live-test:<sha>-Image, das einmal pro ausgewähltem
Commit gebaut wird, und ziehen es dann mit OPENCLAW_SKIP_DOCKER_BUILD=1, statt es
in jedem Shard neu zu bauen.
pnpm openclaw qa suite- Führt repo-gestützte QA-Szenarien direkt auf dem Host aus.
- Führt mehrere ausgewählte Szenarien standardmäßig parallel mit isolierten
Gateway-Workern aus.
qa-channelverwendet standardmäßig Parallelität 4 (begrenzt durch die Anzahl der ausgewählten Szenarien). Verwenden Sie--concurrency <count>, um die Worker-Anzahl anzupassen, oder--concurrency 1für die ältere serielle Lane. - Beendet sich mit einem Exit-Code ungleich null, wenn ein Szenario fehlschlägt. Verwenden Sie
--allow-failures, wenn Sie Artefakte ohne fehlschlagenden Exit-Code wünschen. - Unterstützt die Provider-Modi
live-frontier,mock-openaiundaimock.aimockstartet einen lokalen AIMock-gestützten Provider-Server für experimentelle Fixture- und Protocol-Mock-Abdeckung, ohne die szenariobewusstemock-openai-Lane zu ersetzen.
pnpm test:plugins:kitchen-sink-live- Führt den Live-OpenAI-Kitchen-Sink-Plugin-Prüflauf über QA Lab aus. Er
installiert das externe Kitchen-Sink-Paket, verifiziert das Inventar der Plugin-SDK-Oberfläche,
prüft
/healthzund/readyz, zeichnet Gateway-CPU/RSS- Nachweise auf, führt einen Live-OpenAI-Turn aus und prüft adversariale Diagnosen. Erfordert Live-OpenAI-Authentifizierung wieOPENAI_API_KEY. In hydrierten Testbox- Sitzungen lädt er automatisch das Testbox-Live-Auth-Profil, wenn deropenclaw-testbox-env-Helper vorhanden ist.
- Führt den Live-OpenAI-Kitchen-Sink-Plugin-Prüflauf über QA Lab aus. Er
installiert das externe Kitchen-Sink-Paket, verifiziert das Inventar der Plugin-SDK-Oberfläche,
prüft
pnpm test:gateway:cpu-scenarios- Führt den Gateway-Startup-Benchmark plus ein kleines Mock-QA-Lab-Szenariopaket aus
(
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) und schreibt eine kombinierte CPU-Beobachtungs- Zusammenfassung unter.artifacts/gateway-cpu-scenarios/. - Markiert standardmäßig nur anhaltend heiße CPU-Beobachtungen (
--cpu-core-warnplus--hot-wall-warn-ms), sodass kurze Startup-Spitzen als Metriken aufgezeichnet werden, ohne wie die minutenlange Gateway-Peg-Regression zu wirken. - Verwendet gebaute
dist-Artefakte; führen Sie zuerst einen Build aus, wenn der Checkout noch keine frische Runtime-Ausgabe hat.
- Führt den Gateway-Startup-Benchmark plus ein kleines Mock-QA-Lab-Szenariopaket aus
(
pnpm openclaw qa suite --runner multipass- Führt dieselbe QA-Suite in einer wegwerfbaren Multipass-Linux-VM aus.
- Behält dasselbe Verhalten zur Szenarioauswahl wie
qa suiteauf dem Host bei. - Verwendet dieselben Flags für Provider-/Modellauswahl wie
qa suite. - Live-Durchläufe leiten die unterstützten QA-Auth-Eingaben weiter, die für den Gast praktikabel sind:
env-basierte Provider-Schlüssel, den Pfad zur QA-Live-Provider-Konfiguration und
CODEX_HOME, wenn vorhanden. - Ausgabeverzeichnisse müssen unter dem Repo-Root bleiben, damit der Gast über den gemounteten Workspace zurückschreiben kann.
- Schreibt den normalen QA-Bericht und die Zusammenfassung plus Multipass-Logs unter
.artifacts/qa-e2e/....
pnpm qa:lab:up- Startet die Docker-gestützte QA-Website für operatorartige QA-Arbeit.
pnpm test:docker:npm-onboard-channel-agent- Baut aus dem aktuellen Checkout einen npm-Tarball, installiert ihn global in Docker, führt nicht interaktives Onboarding mit OpenAI-API-Schlüssel aus, konfiguriert standardmäßig Telegram, verifiziert, dass die paketierte Plugin-Runtime ohne Startup- Dependency-Reparatur lädt, führt Doctor aus und führt einen lokalen Agent-Turn gegen einen gemockten OpenAI-Endpunkt aus.
- Verwenden Sie
OPENCLAW_NPM_ONBOARD_CHANNEL=discord, um dieselbe Packaged-Install- Lane mit Discord auszuführen.
pnpm test:docker:session-runtime-context- Führt einen deterministischen Built-App-Docker-Smoke für eingebettete Runtime-Kontext-
Transkripte aus. Er verifiziert, dass versteckter OpenClaw-Runtime-Kontext als
nicht angezeigte benutzerdefinierte Nachricht persistiert wird, statt in den sichtbaren User-Turn zu lecken,
seedet dann eine betroffene defekte Session-JSONL und verifiziert,
dass
openclaw doctor --fixsie mit einem Backup auf den aktiven Branch umschreibt.
- Führt einen deterministischen Built-App-Docker-Smoke für eingebettete Runtime-Kontext-
Transkripte aus. Er verifiziert, dass versteckter OpenClaw-Runtime-Kontext als
nicht angezeigte benutzerdefinierte Nachricht persistiert wird, statt in den sichtbaren User-Turn zu lecken,
seedet dann eine betroffene defekte Session-JSONL und verifiziert,
dass
pnpm test:docker:npm-telegram-live- Installiert einen OpenClaw-Paketkandidaten in Docker, führt Onboarding für installierte Pakete aus, konfiguriert Telegram über die installierte CLI und verwendet dann die Live-Telegram-QA-Lane mit diesem installierten Paket als SUT-Gateway erneut.
- Standardwert ist
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta; setzen SieOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzoderOPENCLAW_CURRENT_PACKAGE_TGZ, um stattdessen einen aufgelösten lokalen Tarball zu testen, anstatt aus der Registry zu installieren. - Verwendet dieselben Telegram-env-Anmeldedaten oder dieselbe Convex-Anmeldedatenquelle wie
pnpm openclaw qa telegram. Für CI-/Release-Automatisierung setzen SieOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexplusOPENCLAW_QA_CONVEX_SITE_URLund das Rollen-Secret. WennOPENCLAW_QA_CONVEX_SITE_URLund ein Convex-Rollen-Secret in CI vorhanden sind, wählt der Docker-Wrapper Convex automatisch aus. - Der Wrapper validiert die Env für Telegram- oder Convex-Anmeldedaten auf dem Host, bevor
Docker-Build-/Installationsarbeit beginnt. Setzen Sie
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1nur, wenn Sie die Einrichtung vor den Anmeldedaten bewusst debuggen. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainerüberschreibt die gemeinsameOPENCLAW_QA_CREDENTIAL_ROLEnur für diese Lane.- GitHub Actions stellt diese Lane als manuellen Maintainer-Workflow
NPM Telegram Beta E2Ebereit. Sie läuft nicht bei einem Merge. Der Workflow verwendet dieqa-live-shared-Umgebung und Convex-CI-Anmeldedaten-Leases.
- GitHub Actions stellt außerdem
Package Acceptancefür produktbezogene Side-Run-Nachweise gegen ein Kandidatenpaket bereit. Es akzeptiert einen vertrauenswürdigen Ref, eine veröffentlichte npm-Spezifikation, eine HTTPS-Tarball-URL plus SHA-256 oder ein Tarball-Artefakt aus einem anderen Lauf, lädt das normalisierteopenclaw-current.tgzalspackage-under-testhoch und führt dann den vorhandenen Docker-E2E-Scheduler mit Smoke-, Paket-, Produkt-, Full- oder benutzerdefinierten Lane-Profilen aus. Setzen Sietelegram_mode=mock-openaioderlive-frontier, um den Telegram-QA-Workflow gegen dasselbepackage-under-test-Artefakt auszuführen.- Aktueller Beta-Produktnachweis:
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
- Exakter Tarball-URL-Nachweis erfordert einen Digest:
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
- Artefaktnachweis lädt ein Tarball-Artefakt aus einem anderen Actions-Lauf herunter:
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- Packt und installiert den aktuellen OpenClaw-Build in Docker, startet den Gateway mit konfiguriertem OpenAI und aktiviert dann gebündelte Kanäle/Plugins über Konfigurationsänderungen.
- Verifiziert, dass Setup-Discovery unkonfigurierte herunterladbare Plugins auslässt, die erste konfigurierte Doctor-Reparatur jedes fehlende herunterladbare Plugin explizit installiert und ein zweiter Neustart keine versteckte Dependency- Reparatur ausführt.
- Installiert außerdem eine bekannte ältere npm-Baseline, aktiviert Telegram vor dem Ausführen von
openclaw update --tag <candidate>und verifiziert, dass der Post-Update-Doctor des Kandidaten Altlasten von Plugin-Dependencies ohne harnessseitige Postinstall-Reparatur bereinigt.
-
pnpm test:parallels:npm-update-
Führt den nativen Packaged-Install-Update-Smoke über Parallels-Gäste hinweg aus. Jede ausgewählte Plattform installiert zuerst das angeforderte Baseline-Paket und führt dann den installierten Befehl
openclaw updateim selben Gast aus und verifiziert die installierte Version, den Update-Status, die Gateway-Bereitschaft und einen lokalen Agent- Turn. -
Verwenden Sie
--platform macos,--platform windowsoder--platform linux, während Sie an einem Gast iterieren. Verwenden Sie--jsonfür den Pfad des Zusammenfassungsartefakts und den Status pro Lane. -
Die OpenAI-Lane verwendet standardmäßig
openai/gpt-5.5für den Live-Agent-Turn- Nachweis. Übergeben Sie--model <provider/model>oder setzen SieOPENCLAW_PARALLELS_OPENAI_MODEL, wenn Sie bewusst ein anderes OpenAI-Modell validieren. -
Umgeben Sie lange lokale Läufe mit einem Host-Timeout, damit Parallels-Transport-Hänger nicht den Rest des Testfensters verbrauchen können:
timeout --foreground 150m pnpm test:parallels:npm-update -- --json timeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json -
Das Skript schreibt verschachtelte Lane-Logs unter
/tmp/openclaw-parallels-npm-update.*. Prüfen Siewindows-update.log,macos-update.logoderlinux-update.log, bevor Sie annehmen, dass der äußere Wrapper hängt. -
Windows-Updates können auf einem kalten Gast 10 bis 15 Minuten in Post-Update-Doctor- und Paket- Update-Arbeit verbringen; das ist weiterhin gesund, wenn das verschachtelte npm- Debug-Log voranschreitet.
-
Führen Sie diesen aggregierten Wrapper nicht parallel zu einzelnen Parallels- macOS-, Windows- oder Linux-Smoke-Lanes aus. Sie teilen VM-Zustand und können bei Snapshot-Wiederherstellung, Paketbereitstellung oder Gast-Gateway-Zustand kollidieren.
-
Der Post-Update-Nachweis führt die normale gebündelte Plugin-Oberfläche aus, weil Capability-Fassaden wie Sprache, Bilderzeugung und Medien- Verständnis über gebündelte Runtime-APIs geladen werden, selbst wenn der Agent- Turn selbst nur eine einfache Textantwort prüft.
-
-
pnpm openclaw qa aimock- Startet nur den lokalen AIMock-Provider-Server für direkte Protocol-Smoke- Tests.
-
pnpm openclaw qa matrix- Führt die Matrix-Live-QA-Lane gegen einen wegwerfbaren Docker-gestützten Tuwunel-Homeserver aus. Nur Source-Checkout — paketierte Installationen liefern
qa-labnicht mit. - Vollständige CLI, Profil-/Szenariokatalog, Env-Vars und Artefaktlayout: Matrix-QA.
- Führt die Matrix-Live-QA-Lane gegen einen wegwerfbaren Docker-gestützten Tuwunel-Homeserver aus. Nur Source-Checkout — paketierte Installationen liefern
-
pnpm openclaw qa telegram- Führt die Telegram-Live-QA-Lane gegen eine echte private Gruppe aus, wobei Driver- und SUT-Bot-Token aus env verwendet werden.
- Erfordert
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENundOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. Die Gruppen-ID muss die numerische Telegram-Chat-ID sein. - Unterstützt
--credential-source convexfür gemeinsam gepoolte Anmeldedaten. Verwenden Sie standardmäßig den env-Modus oder setzen SieOPENCLAW_QA_CREDENTIAL_SOURCE=convex, um gepoolte Leases zu verwenden. - Beendet sich mit einem Exit-Code ungleich null, wenn ein Szenario fehlschlägt. Verwenden Sie
--allow-failures, wenn Sie Artefakte ohne fehlschlagenden Exit-Code wünschen. - Erfordert zwei unterschiedliche Bots in derselben privaten Gruppe, wobei der SUT-Bot einen Telegram-Benutzernamen bereitstellt.
- Für stabile Bot-zu-Bot-Beobachtung aktivieren Sie Bot-to-Bot Communication Mode in
@BotFatherfür beide Bots und stellen Sie sicher, dass der Driver-Bot Gruppen-Bot-Traffic beobachten kann. - Schreibt einen Telegram-QA-Bericht, eine Zusammenfassung und ein Artefakt mit beobachteten Nachrichten unter
.artifacts/qa-e2e/.... Antwortszenarien enthalten RTT von der Sendeanfrage des Drivers bis zur beobachteten SUT-Antwort.
Live-Transport-Lanes teilen einen Standardvertrag, damit neue Transports nicht auseinanderlaufen; die Abdeckungsmatrix pro Lane befindet sich in QA-Übersicht → Live-Transport-Abdeckung. qa-channel ist die breite synthetische Suite und ist nicht Teil dieser Matrix.
Gemeinsame Telegram-Anmeldedaten über Convex (v1)
Wenn --credential-source convex (oder OPENCLAW_QA_CREDENTIAL_SOURCE=convex) für
openclaw qa telegram aktiviert ist, erwirbt QA Lab eine exklusive Lease aus einem Convex-gestützten Pool, heartbeated
diese Lease, während die Lane läuft, und gibt die Lease beim Herunterfahren frei.
Referenz-Convex-Projektscaffold:
qa/convex-credential-broker/
Erforderliche Env-Vars:
OPENCLAW_QA_CONVEX_SITE_URL(zum Beispielhttps://your-deployment.convex.site)- Ein Secret für die ausgewählte Rolle:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERfürmaintainerOPENCLAW_QA_CONVEX_SECRET_CIfürci
- Auswahl der Anmeldedatenrolle:
- CLI:
--credential-role maintainer|ci - Env-Standard:
OPENCLAW_QA_CREDENTIAL_ROLE(Standard istciin CI, sonstmaintainer)
- CLI:
Optionale Env-Vars:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(Standard1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(Standard30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(Standard90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(Standard15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(Standard/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(optionale Trace-ID)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1erlaubt loopback-http://-Convex-URLs für rein lokale Entwicklung.
OPENCLAW_QA_CONVEX_SITE_URL sollte im normalen Betrieb https:// verwenden.
Maintainer-Admin-Befehle (Pool hinzufügen/entfernen/auflisten) erfordern ausdrücklich
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER.
CLI-Helfer für Maintainer:
pnpm openclaw qa credentials doctor
pnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.json
pnpm openclaw qa credentials list --kind telegram
pnpm openclaw qa credentials remove --credential-id <credential-id>
Verwenden Sie doctor vor Live-Läufen, um die Convex-Site-URL, Broker-Secrets,
Endpoint-Präfix, HTTP-Timeout und Admin-/Listen-Erreichbarkeit zu prüfen, ohne
Secret-Werte auszugeben. Verwenden Sie --json für maschinenlesbare Ausgabe in Skripten und CI-
Hilfsprogrammen.
Standard-Endpoint-Vertrag (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1):
POST /acquire- Anfrage:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Erfolg:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Erschöpft/wiederholbar:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Anfrage:
POST /heartbeat- Anfrage:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Erfolg:
{ status: "ok" }(oder leeres2xx)
- Anfrage:
POST /release- Anfrage:
{ kind, ownerId, actorRole, credentialId, leaseToken } - Erfolg:
{ status: "ok" }(oder leeres2xx)
- Anfrage:
POST /admin/add(nur Maintainer-Secret)- Anfrage:
{ kind, actorId, payload, note?, status? } - Erfolg:
{ status: "ok", credential }
- Anfrage:
POST /admin/remove(nur Maintainer-Secret)- Anfrage:
{ credentialId, actorId } - Erfolg:
{ status: "ok", changed, credential } - Schutz bei aktivem Lease:
{ status: "error", code: "LEASE_ACTIVE", ... }
- Anfrage:
POST /admin/list(nur Maintainer-Secret)- Anfrage:
{ kind?, status?, includePayload?, limit? } - Erfolg:
{ status: "ok", credentials, count }
- Anfrage:
Payload-Form für Telegram-Kind:
{ groupId: string, driverToken: string, sutToken: string }groupIdmuss eine numerische Telegram-Chat-ID-Zeichenfolge sein.admin/addvalidiert diese Form fürkind: "telegram"und weist fehlerhafte Payloads zurück.
Kanal zu QA hinzufügen
Die Architektur und Namen der Szenario-Helfer für neue Kanaladapter finden Sie in QA-Übersicht → Kanal hinzufügen. Mindestanforderung: den Transport-Runner auf der gemeinsamen qa-lab-Host-Schnittstelle implementieren, qaRunners im Plugin-Manifest deklarieren, als openclaw qa <runner> einbinden und Szenarien unter qa/scenarios/ erstellen.
Test-Suites (was wo ausgeführt wird)
Betrachten Sie die Suites als „zunehmenden Realismus“ (und zunehmende Instabilität/Kosten):
Unit / Integration (Standard)
- Befehl:
pnpm test - Konfiguration: Läufe ohne Zielangabe verwenden den
vitest.full-*.config.ts-Shard-Satz und können Mehrprojekt-Shards für parallele Planung in projektbezogene Konfigurationen aufteilen - Dateien: Core-/Unit-Inventare unter
src/**/*.test.ts,packages/**/*.test.tsundtest/**/*.test.ts; UI-Unit-Tests laufen im dediziertenunit-ui-Shard - Umfang:
- Reine Unit-Tests
- In-Process-Integrationstests (Gateway-Authentifizierung, Routing, Tooling, Parsing, Konfiguration)
- Deterministische Regressionen für bekannte Fehler
- Erwartungen:
- Läuft in CI
- Keine echten Schlüssel erforderlich
- Sollte schnell und stabil sein
- Resolver- und Public-Surface-Loader-Tests müssen breites Fallback-Verhalten von
api.jsundruntime-api.jsmit generierten kleinen Plugin-Fixtures nachweisen, nicht mit echten Quell-APIs gebündelter Plugins. Echte Plugin-API-Ladevorgänge gehören in Plugin-eigene Vertrags-/Integrations-Suites.
- `pnpm test` ohne Zielangabe führt zwölf kleinere Shard-Konfigurationen (`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`) statt eines einzigen riesigen nativen Root-Projekt-Prozesses aus. Das senkt die maximale RSS auf ausgelasteten Maschinen und verhindert, dass Auto-Reply-/Plugin-Arbeit andere Suites ausbremst.
- `pnpm test --watch` verwendet weiterhin den nativen Root-Projektgraphen `vitest.config.ts`, weil eine Multi-Shard-Watch-Schleife nicht praktikabel ist.
- `pnpm test`, `pnpm test:watch` und `pnpm test:perf:imports` leiten explizite Datei-/Verzeichnisziele zuerst durch bereichsbezogene Lanes, sodass `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` die vollen Startkosten des Root-Projekts vermeidet.
- `pnpm test:changed` erweitert geänderte Git-Pfade standardmäßig zu günstigen bereichsbezogenen Lanes: direkte Teständerungen, benachbarte `*.test.ts`-Dateien, explizite Quellzuordnungen und lokale Importgraph-Abhängige. Konfigurations-, Setup- und Paketänderungen führen keine breiten Testläufe aus, sofern Sie nicht ausdrücklich `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` verwenden.
- `pnpm check:changed` ist das normale intelligente lokale Check-Gate für eng umrissene Arbeit. Es klassifiziert den Diff in Core, Core-Tests, Plugins, Plugin-Tests, Apps, Docs, Release-Metadaten, Live-Docker-Tooling und Tooling und führt dann die passenden Typecheck-, Lint- und Guard-Befehle aus. Es führt keine Vitest-Tests aus; rufen Sie `pnpm test:changed` oder explizit `pnpm test <target>` für Testnachweise auf. Versionssprünge nur bei Release-Metadaten führen gezielte Versions-/Konfigurations-/Root-Abhängigkeitsprüfungen aus, mit einem Guard, der Paketänderungen außerhalb des obersten Versionsfelds ablehnt.
- Änderungen am Live-Docker-ACP-Harness führen fokussierte Prüfungen aus: Shell-Syntax für die Live-Docker-Auth-Skripte und einen Live-Docker-Scheduler-Trockenlauf. Änderungen an `package.json` werden nur einbezogen, wenn der Diff auf `scripts["test:docker:live-*"]` beschränkt ist; Abhängigkeits-, Export-, Versions- und andere Paketoberflächenänderungen verwenden weiterhin die breiteren Guards.
- Import-leichte Unit-Tests aus Agents, Befehlen, Plugins, Auto-Reply-Helfern, `plugin-sdk` und ähnlichen reinen Hilfsbereichen laufen über die `unit-fast`-Lane, die `test/setup-openclaw-runtime.ts` überspringt; zustandsbehaftete oder runtime-lastige Dateien bleiben auf den bestehenden Lanes.
- Ausgewählte `plugin-sdk`- und `commands`-Helferquelldateien ordnen Changed-Mode-Läufe außerdem expliziten benachbarten Tests in diesen leichten Lanes zu, sodass Helferänderungen nicht die komplette schwere Suite für dieses Verzeichnis erneut ausführen müssen.
- `auto-reply` hat dedizierte Buckets für Top-Level-Core-Helfer, Top-Level-`reply.*`-Integrationstests und den Teilbaum `src/auto-reply/reply/**`. CI teilt den Reply-Teilbaum zusätzlich in Shards für Agent-Runner, Dispatch und Befehls-/Zustandsrouting auf, damit ein importlastiger Bucket nicht den gesamten Node-Ausläufer dominiert.
- Normale PR-/Main-CI überspringt absichtlich den Plugin-Batch-Sweep und den release-only `agentic-plugins`-Shard. Full Release Validation dispatcht den separaten untergeordneten Workflow `Plugin Prerelease` für diese Plugin-lastigen Suites auf Release-Kandidaten.
- Wenn Sie Eingaben für die Message-Tool-Erkennung oder den Laufzeitkontext der Compaction ändern,
behalten Sie beide Abdeckungsebenen bei.
- Fügen Sie fokussierte Helfer-Regressionen für reine Routing- und Normalisierungsgrenzen hinzu.
- Halten Sie die Integrations-Suites des eingebetteten Runners intakt:
`src/agents/pi-embedded-runner/compact.hooks.test.ts`,
`src/agents/pi-embedded-runner/run.overflow-compaction.test.ts` und
`src/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts`.
- Diese Suites verifizieren, dass bereichsbezogene IDs und Compaction-Verhalten weiterhin
durch die echten `run.ts`- / `compact.ts`-Pfade fließen; reine Helfertests sind
kein ausreichender Ersatz für diese Integrationspfade.
- Die Basis-Vitest-Konfiguration verwendet standardmäßig `threads`.
- Die gemeinsame Vitest-Konfiguration setzt `isolate: false` fest und verwendet den
nicht isolierten Runner über Root-Projekte, E2E- und Live-Konfigurationen hinweg.
- Die Root-UI-Lane behält ihr `jsdom`-Setup und ihren Optimizer, läuft aber ebenfalls auf dem
gemeinsamen nicht isolierten Runner.
- Jeder `pnpm test`-Shard erbt dieselben Standardwerte `threads` + `isolate: false`
aus der gemeinsamen Vitest-Konfiguration.
- `scripts/run-vitest.mjs` fügt standardmäßig `--no-maglev` für Vitest-Child-Node-
Prozesse hinzu, um V8-Kompilieraufwand bei großen lokalen Läufen zu verringern.
Setzen Sie `OPENCLAW_VITEST_ENABLE_MAGLEV=1`, um gegen das Standardverhalten von V8
zu vergleichen.
- `pnpm changed:lanes` zeigt, welche architektonischen Lanes ein Diff auslöst.
- Der Pre-Commit-Hook dient nur der Formatierung. Er nimmt formatierte Dateien wieder in den Index auf und
führt weder Linting noch Typecheck oder Tests aus.
- Führen Sie `pnpm check:changed` ausdrücklich vor der Übergabe oder dem Push aus, wenn Sie
das intelligente lokale Check-Gate benötigen.
- `pnpm test:changed` läuft standardmäßig über günstige bereichsbezogene Lanes. Verwenden Sie
`OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` nur, wenn der Agent
entscheidet, dass eine Änderung an Harness, Konfiguration, Paket oder Vertrag wirklich breitere
Vitest-Abdeckung benötigt.
- `pnpm test:max` und `pnpm test:changed:max` behalten dasselbe Routing-
Verhalten bei, nur mit einer höheren Worker-Obergrenze.
- Lokale automatische Worker-Skalierung ist bewusst konservativ und fährt zurück,
wenn die Host-Load-Average bereits hoch ist, sodass mehrere gleichzeitige
Vitest-Läufe standardmäßig weniger Schaden anrichten.
- Die Basis-Vitest-Konfiguration markiert die Projekte/Konfigurationsdateien als
`forceRerunTriggers`, damit Changed-Mode-Neuläufe korrekt bleiben, wenn sich die Test-
Verkabelung ändert.
- Die Konfiguration lässt `OPENCLAW_VITEST_FS_MODULE_CACHE` auf unterstützten
Hosts aktiviert; setzen Sie `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path`, wenn Sie
einen expliziten Cache-Ort für direktes Profiling möchten.
- `pnpm test:perf:imports` aktiviert Vitest-Reporting für Import-Dauer plus
Import-Aufschlüsselung.
- `pnpm test:perf:imports:changed` beschränkt dieselbe Profiling-Ansicht auf
Dateien, die seit `origin/main` geändert wurden.
- Shard-Timing-Daten werden nach `.artifacts/vitest-shard-timings.json` geschrieben.
Läufe über die gesamte Konfiguration verwenden den Konfigurationspfad als Schlüssel; Include-Pattern-CI-
Shards hängen den Shard-Namen an, damit gefilterte Shards separat verfolgt
werden können.
- Wenn ein heißer Test weiterhin den Großteil seiner Zeit in Start-Imports verbringt,
halten Sie schwere Abhängigkeiten hinter einer engen lokalen `*.runtime.ts`-Schnittstelle und
mocken Sie diese Schnittstelle direkt, statt Runtime-Helfer nur deshalb tief zu importieren,
um sie durch `vi.mock(...)` zu reichen.
- `pnpm test:perf:changed:bench -- --ref <git-ref>` vergleicht geroutetes
`test:changed` mit dem nativen Root-Projektpfad für diesen committeten
Diff und gibt Wandzeit plus macOS-Max-RSS aus.
- `pnpm test:perf:changed:bench -- --worktree` benchmarked den aktuellen
Dirty Tree, indem die geänderte Dateiliste durch
`scripts/test-projects.mjs` und die Root-Vitest-Konfiguration geroutet wird.
- `pnpm test:perf:profile:main` schreibt ein Main-Thread-CPU-Profil für
Vitest-/Vite-Start und Transformations-Overhead.
- `pnpm test:perf:profile:runner` schreibt Runner-CPU- und Heap-Profile für die
Unit-Suite mit deaktivierter Dateiparallelität.
Stabilität (Gateway)
- Befehl:
pnpm test:stability:gateway - Konfiguration:
vitest.gateway.config.ts, auf einen Worker erzwungen - Umfang:
- Startet standardmäßig ein echtes loopback-Gateway mit aktivierter Diagnose
- Treibt synthetische Gateway-Nachrichten-, Memory- und Large-Payload-Last durch den Diagnoseereignispfad
- Fragt
diagnostics.stabilityüber den Gateway-WS-RPC ab - Deckt Persistenzhelfer für Diagnose-Stabilitätsbundles ab
- Stellt sicher, dass der Recorder begrenzt bleibt, synthetische RSS-Samples unter dem Druckbudget bleiben und Queue-Tiefen pro Sitzung wieder auf null ablaufen
- Erwartungen:
- CI-sicher und ohne Schlüssel
- Enge Lane für Nachverfolgung von Stabilitätsregressionen, kein Ersatz für die vollständige Gateway-Suite
E2E (Gateway-Smoke)
- Befehl:
pnpm test:e2e - Konfiguration:
vitest.e2e.config.ts - Dateien:
src/**/*.e2e.test.ts,test/**/*.e2e.test.tsund gebündelte Plugin-E2E-Tests unterextensions/ - Runtime-Standards:
- Verwendet Vitest-
threadsmitisolate: false, passend zum Rest des Repos. - Verwendet adaptive Worker (CI: bis zu 2, lokal: standardmäßig 1).
- Läuft standardmäßig im stillen Modus, um Console-I/O-Overhead zu reduzieren.
- Verwendet Vitest-
- Nützliche Overrides:
OPENCLAW_E2E_WORKERS=<n>, um die Worker-Anzahl zu erzwingen (auf 16 begrenzt).OPENCLAW_E2E_VERBOSE=1, um ausführliche Konsolenausgabe wieder zu aktivieren.
- Umfang:
- End-to-End-Verhalten für Multi-Instanz-Gateway
- WebSocket/HTTP-Oberflächen, Node-Pairing und aufwendigere Netzwerkfunktionen
- Erwartungen:
- Läuft in CI (wenn in der Pipeline aktiviert)
- Keine echten Schlüssel erforderlich
- Mehr bewegliche Teile als Unit-Tests (kann langsamer sein)
E2E: OpenShell-Backend-Smoke-Test
- Befehl:
pnpm test:e2e:openshell - Datei:
extensions/openshell/src/backend.e2e.test.ts - Umfang:
- Startet ein isoliertes OpenShell-Gateway auf dem Host über Docker
- Erstellt eine Sandbox aus einer temporären lokalen Dockerfile
- Übt OpenClaws OpenShell-Backend über echtes
sandbox ssh-config+ SSH-Ausführung aus - Verifiziert remote-kanonisches Dateisystemverhalten über die Sandbox-fs-Bridge
- Erwartungen:
- Nur Opt-in; nicht Teil des standardmäßigen
pnpm test:e2e-Laufs - Erfordert eine lokale
openshell-CLI sowie einen funktionierenden Docker-Daemon - Verwendet isolierte
HOME/XDG_CONFIG_HOME, zerstört anschließend das Test-Gateway und die Sandbox
- Nur Opt-in; nicht Teil des standardmäßigen
- Nützliche Overrides:
OPENCLAW_E2E_OPENSHELL=1, um den Test zu aktivieren, wenn die breitere E2E-Suite manuell ausgeführt wirdOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell, um auf ein nicht standardmäßiges CLI-Binary oder Wrapper-Skript zu zeigen
Live (echte Provider + echte Modelle)
- Befehl:
pnpm test:live - Konfiguration:
vitest.live.config.ts - Dateien:
src/**/*.live.test.ts,test/**/*.live.test.tsund gebündelte Plugin-Live-Tests unterextensions/ - Standard: durch
pnpm test:liveaktiviert (setztOPENCLAW_LIVE_TEST=1) - Umfang:
- „Funktioniert dieser Provider/dieses Modell heute tatsächlich mit echten Zugangsdaten?“
- Fängt Provider-Formatänderungen, Eigenheiten bei Tool-Calling, Auth-Probleme und Rate-Limit-Verhalten ab
- Erwartungen:
- Absichtlich nicht CI-stabil (echte Netzwerke, echte Provider-Richtlinien, Kontingente, Ausfälle)
- Kostet Geld / nutzt Rate Limits
- Eng eingegrenzte Teilmengen statt „alles“ bevorzugen
- Live-Läufe sourcen
~/.profile, um fehlende API-Schlüssel aufzunehmen. - Standardmäßig isolieren Live-Läufe weiterhin
HOMEund kopieren Konfigurations-/Auth-Material in ein temporäres Test-Home, damit Unit-Fixtures Ihr echtes~/.openclawnicht verändern können. - Setzen Sie
OPENCLAW_LIVE_USE_REAL_HOME=1nur, wenn Live-Tests absichtlich Ihr echtes Home-Verzeichnis verwenden sollen. pnpm test:liveverwendet jetzt standardmäßig einen ruhigeren Modus: Die[live] ...-Fortschrittsausgabe bleibt erhalten, aber der zusätzliche~/.profile-Hinweis wird unterdrückt und Gateway-Bootstrap-Logs/Bonjour-Meldungen werden stummgeschaltet. Setzen SieOPENCLAW_LIVE_TEST_QUIET=0, wenn Sie die vollständigen Start-Logs zurückhaben möchten.- API-Schlüsselrotation (Provider-spezifisch): Setzen Sie
*_API_KEYSim Komma-/Semikolonformat oder*_API_KEY_1,*_API_KEY_2(zum BeispielOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) oder einen Live-spezifischen Override überOPENCLAW_LIVE_*_KEY; Tests versuchen es bei Rate-Limit-Antworten erneut. - Fortschritts-/Heartbeat-Ausgabe:
- Live-Suites geben jetzt Fortschrittszeilen auf stderr aus, damit lange Provider-Aufrufe sichtbar aktiv sind, selbst wenn Vitests Console-Erfassung ruhig ist.
vitest.live.config.tsdeaktiviert Vitests Console-Interception, damit Provider-/Gateway-Fortschrittszeilen während Live-Läufen sofort gestreamt werden.- Passen Sie Direct-Model-Heartbeats mit
OPENCLAW_LIVE_HEARTBEAT_MSan. - Passen Sie Gateway-/Probe-Heartbeats mit
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MSan.
Welche Suite sollte ich ausführen?
Verwenden Sie diese Entscheidungstabelle:
- Logik/Tests bearbeiten:
pnpm testausführen (undpnpm test:coverage, wenn Sie viel geändert haben) - Gateway-Netzwerk / WS-Protokoll / Pairing anfassen:
pnpm test:e2ehinzufügen - „Mein Bot ist ausgefallen“ / Provider-spezifische Fehler / Tool-Calling debuggen: ein eingegrenztes
pnpm test:liveausführen
Live-Tests (mit Netzwerkzugriff)
Für die Live-Modellmatrix, CLI-Backend-Smoke-Tests, ACP-Smoke-Tests, das Codex-App-Server- Harness und alle Medien-Provider-Live-Tests (Deepgram, BytePlus, ComfyUI, Bild, Musik, Video, Medien-Harness) sowie die Anmeldeinformationsbehandlung für Live-Läufe siehe Live-Suites testen. Für die dedizierte Checkliste für Updates und Plugin-Validierung siehe Updates und Plugins testen.
Docker-Runner (optionale „funktioniert unter Linux“-Prüfungen)
Diese Docker-Runner sind in zwei Gruppen aufgeteilt:
- Live-Modell-Runner:
test:docker:live-modelsundtest:docker:live-gatewayführen nur ihre passende Profil-Schlüssel-Live-Datei im Repo-Docker-Image aus (src/agents/models.profiles.live.test.tsundsrc/gateway/gateway-models.profiles.live.test.ts), mounten Ihr lokales Konfigurationsverzeichnis und Ihren Workspace (und sourcen~/.profile, falls gemountet). Die passenden lokalen Einstiegspunkte sindtest:live:models-profilesundtest:live:gateway-profiles. - Docker-Live-Runner verwenden standardmäßig ein kleineres Smoke-Limit, damit ein vollständiger Docker-Sweep praktikabel bleibt:
test:docker:live-modelsverwendet standardmäßigOPENCLAW_LIVE_MAX_MODELS=12, undtest:docker:live-gatewayverwendet standardmäßigOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000undOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Überschreiben Sie diese Env-Vars, wenn Sie ausdrücklich den größeren vollständigen Scan wünschen. test:docker:allbaut das Live-Docker-Image einmal übertest:docker:live-build, paketiert OpenClaw einmal als npm-Tarball überscripts/package-openclaw-for-docker.mjsund baut/verwendet anschließend zweiscripts/e2e/Dockerfile-Images wieder. Das Bare-Image ist nur der Node/Git-Runner für Installations-/Update-/Plugin-Dependency-Lanes; diese Lanes mounten den vorgebauten Tarball. Das funktionale Image installiert denselben Tarball nach/appfür Built-App-Funktionalitäts-Lanes. Docker-Lane-Definitionen liegen inscripts/lib/docker-e2e-scenarios.mjs; Planner-Logik liegt inscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsführt den ausgewählten Plan aus. Das Aggregat verwendet einen gewichteten lokalen Scheduler:OPENCLAW_DOCKER_ALL_PARALLELISMsteuert Prozess-Slots, während Ressourcenlimits verhindern, dass schwere Live-, npm-Installations- und Multi-Service-Lanes alle gleichzeitig starten. Wenn eine einzelne Lane schwerer ist als die aktiven Limits, kann der Scheduler sie trotzdem starten, wenn der Pool leer ist, und lässt sie dann allein laufen, bis wieder Kapazität verfügbar ist. Standards sind 10 Slots,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=10undOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; passen SieOPENCLAW_DOCKER_ALL_WEIGHT_LIMIToderOPENCLAW_DOCKER_ALL_DOCKER_LIMITnur an, wenn der Docker-Host mehr Spielraum hat. Der Runner führt standardmäßig einen Docker-Preflight aus, entfernt veraltete OpenClaw-E2E-Container, gibt alle 30 Sekunden Status aus, speichert erfolgreiche Lane-Zeiten in.artifacts/docker-tests/lane-timings.jsonund verwendet diese Zeiten, um bei späteren Läufen längere Lanes zuerst zu starten. Verwenden SieOPENCLAW_DOCKER_ALL_DRY_RUN=1, um das gewichtete Lane-Manifest ohne Bauen oder Ausführen von Docker auszugeben, odernode scripts/test-docker-all.mjs --plan-json, um den CI-Plan für ausgewählte Lanes, Paket-/Image-Bedarfe und Anmeldeinformationen auszugeben.Package Acceptanceist das GitHub-native Paket-Gate für „funktioniert dieser installierbare Tarball als Produkt?“. Es löst ein Kandidatenpaket aussource=npm,source=ref,source=urlodersource=artifactauf, lädt es alspackage-under-testhoch und führt dann die wiederverwendbaren Docker-E2E-Lanes gegen genau diesen Tarball aus, anstatt die ausgewählte Ref neu zu paketieren. Profile sind nach Breite geordnet:smoke,package,productundfull. Siehe Updates und Plugins testen für den Paket-/Update-/Plugin-Vertrag, die Survivor-Matrix für veröffentlichte Upgrades, Release-Standards und Fehlertriage.- Build- und Release-Prüfungen führen
scripts/check-cli-bootstrap-imports.mjsnach tsdown aus. Der Guard durchläuft den statischen gebauten Graphen abdist/entry.jsunddist/cli/run-main.jsund schlägt fehl, wenn Startup-Importe vor dem Dispatch Paketabhängigkeiten wie Commander, Prompt-UI, undici oder Logging vor dem Befehlsdispatch importieren; außerdem hält er den gebündelten Gateway-Run-Chunk unter dem Budget und lehnt statische Importe bekannter kalter Gateway-Pfade ab. Der paketierte CLI-Smoke-Test deckt außerdem Root-Hilfe, Onboard-Hilfe, Doctor-Hilfe, Status, Konfigurationsschema und einen Model-List-Befehl ab. - Die Legacy-Kompatibilität von Package Acceptance ist auf
2026.4.25begrenzt (2026.4.25-beta.*eingeschlossen). Bis zu diesem Stichtag toleriert das Harness nur Metadatenlücken ausgelieferter Pakete: ausgelassene private QA-Inventareinträge, fehlendesgateway install --wrapper, fehlende Patch-Dateien im aus dem Tarball abgeleiteten Git-Fixture, fehlendes persistiertesupdate.channel, alte Speicherorte für Plugin-Installationsdatensätze, fehlende Persistenz von Marketplace-Installationsdatensätzen und Migration von Konfigurationsmetadaten währendplugins update. Für Pakete nach2026.4.25sind diese Pfade strikte Fehler. - Container-Smoke-Runner:
test:docker:openwebui,test:docker:onboard,test:docker:npm-onboard-channel-agent,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:pi-bundle-mcp-tools,test:docker:cron-mcp-cleanup,test:docker:plugins,test:docker:plugin-update,test:docker:plugin-lifecycle-matrixundtest:docker:config-reloadbooten einen oder mehrere echte Container und verifizieren Integrationspfade auf höherer Ebene.
Die Live-Modell-Docker-Runner binden außerdem nur die benötigten CLI-Auth-Homes ein (oder alle unterstützten, wenn der Lauf nicht eingegrenzt ist) und kopieren sie anschließend vor dem Lauf in das Container-Home, damit OAuth externer CLIs Tokens aktualisieren kann, ohne den Auth-Speicher des Hosts zu verändern:
- Direkte Modelle:
pnpm test:docker:live-models(Skript:scripts/test-live-models-docker.sh) - ACP-Bind-Smoke:
pnpm test:docker:live-acp-bind(Skript:scripts/test-live-acp-bind-docker.sh; deckt standardmäßig Claude, Codex und Gemini ab, mit strikter Droid-/OpenCode-Abdeckung überpnpm test:docker:live-acp-bind:droidundpnpm test:docker:live-acp-bind:opencode) - CLI-Backend-Smoke:
pnpm test:docker:live-cli-backend(Skript:scripts/test-live-cli-backend-docker.sh) - Codex-App-Server-Harness-Smoke:
pnpm test:docker:live-codex-harness(Skript:scripts/test-live-codex-harness-docker.sh) - Gateway + Entwicklungs-Agent:
pnpm test:docker:live-gateway(Skript:scripts/test-live-gateway-models-docker.sh) - Observability-Smoke:
pnpm qa:otel:smokeist eine private QA-Source-Checkout-Lane. Sie ist absichtlich nicht Teil der Docker-Release-Lanes für Pakete, weil der npm-Tarball QA Lab auslässt. - Open WebUI-Live-Smoke:
pnpm test:docker:openwebui(Skript:scripts/e2e/openwebui-docker.sh) - Onboarding-Assistent (TTY, vollständiges Scaffolding):
pnpm test:docker:onboard(Skript:scripts/e2e/onboard-docker.sh) - Npm-Tarball-Onboarding-/Channel-/Agent-Smoke:
pnpm test:docker:npm-onboard-channel-agentinstalliert den gepackten OpenClaw-Tarball global in Docker, konfiguriert OpenAI über env-ref-Onboarding sowie standardmäßig Telegram, führt doctor aus und führt einen gemockten OpenAI-Agent-Turn aus. Verwenden Sie einen vorab gebauten Tarball mitOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgzerneut, überspringen Sie den Host-Rebuild mitOPENCLAW_NPM_ONBOARD_HOST_BUILD=0, oder wechseln Sie den Channel mitOPENCLAW_NPM_ONBOARD_CHANNEL=discordoderOPENCLAW_NPM_ONBOARD_CHANNEL=slack. - Update-Channel-Wechsel-Smoke:
pnpm test:docker:update-channel-switchinstalliert den gepackten OpenClaw-Tarball global in Docker, wechselt von Paketstablezu Gitdev, verifiziert, dass der persistierte Channel und die Plugin-Post-Update-Funktion funktionieren, wechselt dann zurück zu Paketstableund prüft den Update-Status. - Upgrade-Survivor-Smoke:
pnpm test:docker:upgrade-survivorinstalliert den gepackten OpenClaw-Tarball über ein verschmutztes Altbenutzer-Fixture mit Agents, Channel-Konfiguration, Plugin-Allowlists, veraltetem Plugin-Abhängigkeitszustand und bestehenden Workspace-/Session-Dateien. Es führt Paket-Update plus nicht interaktiven doctor ohne Live-Provider- oder Channel-Schlüssel aus, startet dann ein loopback-Gateway und prüft Konfigurations-/Zustandserhaltung sowie Start-/Status-Budgets. - Veröffentlichter Upgrade-Survivor-Smoke:
pnpm test:docker:published-upgrade-survivorinstalliert standardmäßigopenclaw@latest, erzeugt realistische Bestandsbenutzerdateien, konfiguriert diese Baseline mit einem eingebauten Befehlsrezept, validiert die resultierende Konfiguration, aktualisiert diese veröffentlichte Installation auf den Kandidaten-Tarball, führt den nicht interaktiven doctor aus, schreibt.artifacts/upgrade-survivor/summary.json, startet dann ein loopback-Gateway und prüft konfigurierte Intents, Zustandserhaltung, Start,/healthz,/readyzund RPC-Status-Budgets. Überschreiben Sie eine Baseline mitOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, lassen Sie den aggregierten Scheduler exakte Baselines mitOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECSwieall-since-2026.4.23erweitern, und erweitern Sie issue-förmige Fixtures mitOPENCLAW_UPGRADE_SURVIVOR_SCENARIOSwiereported-issues; das reported-issues-Set enthältconfigured-plugin-installsfür die automatische Reparatur externer OpenClaw-Plugin-Installationen. Package Acceptance stellt diese alspublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesundpublished_upgrade_survivor_scenariosbereit; Full Release Validation verwendet die standardmäßige latest-Baseline im blockierenden Pfad und erweitert nur fürrun_release_soak=trueoderrelease_profile=fullauf all-since/reported-issues. - Session-Runtime-Kontext-Smoke:
pnpm test:docker:session-runtime-contextverifiziert die Persistenz versteckter Runtime-Kontext-Transkripte plus doctor-Reparatur betroffener duplizierter Prompt-Rewrite-Branches. - Bun-Global-Install-Smoke:
bash scripts/e2e/bun-global-install-smoke.shpackt den aktuellen Tree, installiert ihn mitbun install -gin einem isolierten Home und verifiziert, dassopenclaw infer image providers --jsongebündelte Image-Provider zurückgibt, statt zu hängen. Verwenden Sie einen vorab gebauten Tarball mitOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgzerneut, überspringen Sie den Host-Build mitOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0, oder kopieren Siedist/aus einem gebauten Docker-Image mitOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local. - Installer-Docker-Smoke:
bash scripts/test-install-sh-docker.shteilt einen npm-Cache zwischen seinen Root-, Update- und Direct-npm-Containern. Update-Smoke verwendet standardmäßig npmlatestals stabile Baseline, bevor auf den Kandidaten-Tarball aktualisiert wird. Überschreiben Sie lokal mitOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22oder mit der Eingabeupdate_baseline_versiondes Install-Smoke-Workflows auf GitHub. Nicht-Root-Installer-Prüfungen behalten einen isolierten npm-Cache, damit root-eigene Cache-Einträge das benutzerlokale Installationsverhalten nicht verdecken. Setzen SieOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache, um den Root-/Update-/Direct-npm-Cache über lokale Wiederholungen hinweg erneut zu verwenden. - Install-Smoke-CI überspringt das doppelte direkte globale npm-Update mit
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1; führen Sie das Skript lokal ohne diese Umgebung aus, wenn direktenpm install -g-Abdeckung benötigt wird. - Agents-delete-shared-workspace-CLI-Smoke:
pnpm test:docker:agents-delete-shared-workspace(Skript:scripts/e2e/agents-delete-shared-workspace-docker.sh) baut standardmäßig das Root-Dockerfile-Image, legt zwei Agents mit einem Workspace in einem isolierten Container-Home an, führtagents delete --jsonaus und verifiziert gültiges JSON plus Verhalten mit beibehaltenem Workspace. Verwenden Sie das install-smoke-Image mitOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1erneut. - Gateway-Netzwerk (zwei Container, WS-Auth + Health):
pnpm test:docker:gateway-network(Skript:scripts/e2e/gateway-network-docker.sh) - Browser-CDP-Snapshot-Smoke:
pnpm test:docker:browser-cdp-snapshot(Skript:scripts/e2e/browser-cdp-snapshot-docker.sh) baut das Source-E2E-Image plus eine Chromium-Schicht, startet Chromium mit rohem CDP, führtbrowser doctor --deepaus und verifiziert, dass CDP-Rollen-Snapshots Link-URLs, cursor-promoted Clickables, iframe-Refs und Frame-Metadaten abdecken. - OpenAI-Responses-
web_search-Regression für minimales Reasoning:pnpm test:docker:openai-web-search-minimal(Skript:scripts/e2e/openai-web-search-minimal-docker.sh) führt einen gemockten OpenAI-Server über Gateway aus, verifiziert, dassweb_searchreasoning.effortvonminimalauflowanhebt, erzwingt dann die Ablehnung durch das Provider-Schema und prüft, dass das rohe Detail in Gateway-Logs erscheint. - MCP-Channel-Bridge (geseedetes Gateway + stdio-Bridge + roher Claude-Notification-Frame-Smoke):
pnpm test:docker:mcp-channels(Skript:scripts/e2e/mcp-channels-docker.sh) - Pi-Bundle-MCP-Tools (echter stdio-MCP-Server + eingebetteter Pi-Profil-Allow-/Deny-Smoke):
pnpm test:docker:pi-bundle-mcp-tools(Skript:scripts/e2e/pi-bundle-mcp-tools-docker.sh) - Cron-/Subagent-MCP-Bereinigung (echtes Gateway + stdio-MCP-Child-Teardown nach isolierten cron- und One-shot-Subagent-Läufen):
pnpm test:docker:cron-mcp-cleanup(Skript:scripts/e2e/cron-mcp-cleanup-docker.sh) - Plugins (Install-/Update-Smoke für lokalen Pfad,
file:, npm-Registry mit hoisted Abhängigkeiten, bewegliche Git-Refs, ClawHub-Kitchen-Sink, Marketplace-Updates und Claude-Bundle-Aktivieren/Prüfen):pnpm test:docker:plugins(Skript:scripts/e2e/plugins-docker.sh) Setzen SieOPENCLAW_PLUGINS_E2E_CLAWHUB=0, um den ClawHub-Block zu überspringen, oder überschreiben Sie das standardmäßige Kitchen-Sink-Paket-/Runtime-Paar mitOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECundOPENCLAW_PLUGINS_E2E_CLAWHUB_ID. OhneOPENCLAW_CLAWHUB_URL/CLAWHUB_URLverwendet der Test einen hermetischen lokalen ClawHub-Fixture-Server. - Plugin-Update-Unchanged-Smoke:
pnpm test:docker:plugin-update(Skript:scripts/e2e/plugin-update-unchanged-docker.sh) - Plugin-Lifecycle-Matrix-Smoke:
pnpm test:docker:plugin-lifecycle-matrixinstalliert den gepackten OpenClaw-Tarball in einem leeren Container, installiert ein npm-Plugin, schaltet enable/disable um, aktualisiert es und führt ein Downgrade über eine lokale npm-Registry durch, löscht den installierten Code und verifiziert dann, dass uninstall weiterhin veralteten Zustand entfernt, während für jede Lifecycle-Phase RSS-/CPU-Metriken protokolliert werden. - Config-Reload-Metadata-Smoke:
pnpm test:docker:config-reload(Skript:scripts/e2e/config-reload-source-docker.sh) - Plugins:
pnpm test:docker:pluginsdeckt Install-/Update-Smoke für lokalen Pfad,file:, npm-Registry mit hoisted Abhängigkeiten, bewegliche Git-Refs, ClawHub-Fixtures, Marketplace-Updates und Claude-Bundle-Aktivieren/Prüfen ab.pnpm test:docker:plugin-updatedeckt unverändertes Update-Verhalten für installierte Plugins ab.pnpm test:docker:plugin-lifecycle-matrixdeckt ressourcenverfolgte npm-Plugin-Installation, enable, disable, Upgrade, Downgrade und missing-code-uninstall ab.
So bauen Sie das gemeinsam genutzte funktionale Image manuell vor und verwenden es erneut:
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-build
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channels
Suite-spezifische Image-Overrides wie OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE haben weiterhin Vorrang, wenn sie gesetzt sind. Wenn OPENCLAW_SKIP_DOCKER_BUILD=1 auf ein entferntes gemeinsam genutztes Image verweist, ziehen die Skripte es, falls es noch nicht lokal vorhanden ist. Die QR- und Installer-Docker-Tests behalten ihre eigenen Dockerfiles, weil sie Paket-/Installationsverhalten statt der gemeinsam genutzten Built-App-Runtime validieren.
Die Docker-Runner für Live-Modelle binden außerdem den aktuellen Checkout schreibgeschützt ein und
stagen ihn in ein temporäres Arbeitsverzeichnis im Container. Dadurch bleibt das Laufzeit-
Image schlank, während Vitest weiterhin gegen Ihre exakt lokale Source-/Config-Version läuft.
Der Staging-Schritt überspringt große, nur lokal relevante Caches und App-Build-Ausgaben wie
.pnpm-store, .worktrees, __openclaw_vitest__ sowie app-lokale .build- oder
Gradle-Ausgabeverzeichnisse, damit Docker-Live-Ausführungen nicht minutenlang
maschinenspezifische Artefakte kopieren.
Sie setzen außerdem OPENCLAW_SKIP_CHANNELS=1, damit Gateway-Live-Probes keine
echten Telegram-/Discord-/usw.-Kanal-Worker im Container starten.
test:docker:live-models führt weiterhin pnpm test:live aus. Reichen Sie daher auch
OPENCLAW_LIVE_GATEWAY_* durch, wenn Sie die Gateway-Live-Abdeckung in dieser Docker-Lane
eingrenzen oder ausschließen müssen.
test:docker:openwebui ist ein höherstufiger Kompatibilitäts-Smoke-Test: Er startet einen
OpenClaw-Gateway-Container mit aktivierten OpenAI-kompatiblen HTTP-Endpunkten,
startet einen gepinnten Open-WebUI-Container gegen dieses Gateway, meldet sich über
Open WebUI an, prüft, dass /api/models openclaw/default bereitstellt, und sendet dann eine
echte Chat-Anfrage über den /api/chat/completions-Proxy von Open WebUI.
Der erste Lauf kann spürbar langsamer sein, weil Docker möglicherweise das
Open-WebUI-Image abrufen muss und Open WebUI sein eigenes Cold-Start-Setup abschließen muss.
Diese Lane erwartet einen nutzbaren Schlüssel für ein Live-Modell, und OPENCLAW_PROFILE_FILE
(standardmäßig ~/.profile) ist der primäre Weg, ihn in Dockerisierten Läufen bereitzustellen.
Erfolgreiche Läufe geben eine kleine JSON-Nutzlast wie { "ok": true, "model": "openclaw/default", ... } aus.
test:docker:mcp-channels ist absichtlich deterministisch und benötigt kein
echtes Telegram-, Discord- oder iMessage-Konto. Es startet einen vorbefüllten Gateway-
Container, startet einen zweiten Container, der openclaw mcp serve startet, und
prüft dann geroutete Konversationserkennung, Lesen von Transkripten, Anhangsmetadaten,
Verhalten der Live-Event-Queue, Routing ausgehender Sendungen sowie Kanal- und
Berechtigungsbenachrichtigungen im Claude-Stil über die echte stdio-MCP-Bridge. Die Benachrichtigungsprüfung
inspiziert die rohen stdio-MCP-Frames direkt, damit der Smoke-Test validiert, was die
Bridge tatsächlich ausgibt, nicht nur, was ein bestimmtes Client-SDK zufällig sichtbar macht.
test:docker:pi-bundle-mcp-tools ist deterministisch und benötigt keinen Live-Modellschlüssel.
Es baut das Repo-Docker-Image, startet einen echten stdio-MCP-Probe-Server
im Container, materialisiert diesen Server über die eingebettete Pi-Bundle-
MCP-Laufzeit, führt das Tool aus und prüft dann, dass coding und messaging
bundle-mcp-Tools behalten, während minimal und tools.deny: ["bundle-mcp"] sie herausfiltern.
test:docker:cron-mcp-cleanup ist deterministisch und benötigt keinen Live-Modellschlüssel.
Es startet ein vorbefülltes Gateway mit einem echten stdio-MCP-Probe-Server, führt einen
isolierten Cron-Turn und einen /subagents spawn-One-Shot-Child-Turn aus und prüft dann,
dass der MCP-Kindprozess nach jedem Lauf beendet wird.
Manueller ACP-Smoke-Test für Threads in natürlicher Sprache (nicht CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Behalten Sie dieses Skript für Regressions-/Debug-Workflows. Es kann für die ACP-Thread-Routing-Validierung erneut benötigt werden, löschen Sie es daher nicht.
Nützliche Umgebungsvariablen:
OPENCLAW_CONFIG_DIR=...(Standard:~/.openclaw) wird nach/home/node/.openclawgemountetOPENCLAW_WORKSPACE_DIR=...(Standard:~/.openclaw/workspace) wird nach/home/node/.openclaw/workspacegemountetOPENCLAW_PROFILE_FILE=...(Standard:~/.profile) wird nach/home/node/.profilegemountet und vor dem Ausführen der Tests gesourctOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1, um nur ausOPENCLAW_PROFILE_FILEgesourcte Umgebungsvariablen zu prüfen, mit temporären Config-/Workspace-Verzeichnissen und ohne externe CLI-Auth-MountsOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(Standard:~/.cache/openclaw/docker-cli-tools) wird nach/home/node/.npm-globalfür gecachte CLI-Installationen innerhalb von Docker gemountet- Externe CLI-Auth-Verzeichnisse/-Dateien unter
$HOMEwerden schreibgeschützt unter/host-auth...gemountet und dann vor Testbeginn nach/home/node/...kopiert- Standardverzeichnisse:
.minimax - Standarddateien:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Eingegrenzte Provider-Läufe mounten nur die benötigten Verzeichnisse/Dateien, die aus
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERSabgeleitet werden - Manuelle Überschreibung mit
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=noneoder einer kommagetrennten Liste wieOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Standardverzeichnisse:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=..., um den Lauf einzugrenzenOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=..., um Provider im Container zu filternOPENCLAW_SKIP_DOCKER_BUILD=1, um ein vorhandenesopenclaw:local-live-Image für Wiederholungsläufe wiederzuverwenden, die keinen Neuaufbau benötigenOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, um sicherzustellen, dass Zugangsdaten aus dem Profil-Store stammen (nicht aus der Umgebung)OPENCLAW_OPENWEBUI_MODEL=..., um das Modell auszuwählen, das vom Gateway für den Open-WebUI-Smoke-Test bereitgestellt wirdOPENCLAW_OPENWEBUI_PROMPT=..., um den vom Open-WebUI-Smoke-Test verwendeten Nonce-Check-Prompt zu überschreibenOPENWEBUI_IMAGE=..., um den gepinnten Open-WebUI-Image-Tag zu überschreiben
Docs-Sanity
Führen Sie nach Dokumentationsänderungen Docs-Prüfungen aus: pnpm check:docs.
Führen Sie die vollständige Mintlify-Ankervalidierung aus, wenn Sie auch In-Page-Überschriftenprüfungen benötigen: pnpm docs:check-links:anchors.
Offline-Regression (CI-sicher)
Dies sind „echte Pipeline“-Regressionen ohne echte Provider:
- Gateway-Tool-Calling (Mock-OpenAI, echtes Gateway + Agent-Loop):
src/gateway/gateway.test.ts(Fall: "runs a mock OpenAI tool call end-to-end via gateway agent loop") - Gateway-Assistent (WS
wizard.start/wizard.next, schreibt Config + Auth erzwungen):src/gateway/gateway.test.ts(Fall: "runs wizard over ws and writes auth token config")
Agent-Zuverlässigkeits-Evals (Skills)
Wir haben bereits einige CI-sichere Tests, die sich wie „Agent-Zuverlässigkeits-Evals“ verhalten:
- Mock-Tool-Calling durch das echte Gateway + Agent-Loop (
src/gateway/gateway.test.ts). - End-to-End-Assistenten-Flows, die Session-Verkabelung und Config-Auswirkungen validieren (
src/gateway/gateway.test.ts).
Was für Skills noch fehlt (siehe Skills):
- Entscheidungslogik: Wenn Skills im Prompt aufgeführt sind, wählt der Agent den richtigen Skill (oder vermeidet irrelevante)?
- Compliance: Liest der Agent
SKILL.mdvor der Verwendung und folgt er den erforderlichen Schritten/Argumenten? - Workflow-Verträge: Mehrstufige Szenarien, die Tool-Reihenfolge, Übernahme der Session-Historie und Sandbox-Grenzen prüfen.
Künftige Evals sollten zuerst deterministisch bleiben:
- Ein Szenario-Runner mit Mock-Providern, um Tool-Aufrufe + Reihenfolge, Skill-Datei-Lesevorgänge und Session-Verkabelung zu prüfen.
- Eine kleine Suite Skill-fokussierter Szenarien (verwenden vs. vermeiden, Gating, Prompt-Injection).
- Optionale Live-Evals (Opt-in, per Umgebungsvariablen gesteuert) erst, nachdem die CI-sichere Suite vorhanden ist.
Vertragstests (Plugin- und Kanalform)
Vertragstests prüfen, dass jedes registrierte Plugin und jeder registrierte Kanal seinem
Interface-Vertrag entspricht. Sie iterieren über alle gefundenen Plugins und führen eine Suite von
Form- und Verhaltensassertions aus. Die standardmäßige pnpm test-Unit-Lane überspringt diese
gemeinsamen Seam- und Smoke-Dateien absichtlich; führen Sie die Vertragsbefehle explizit aus,
wenn Sie gemeinsame Kanal- oder Provider-Oberflächen berühren.
Befehle
- Alle Verträge:
pnpm test:contracts - Nur Kanalverträge:
pnpm test:contracts:channels - Nur Provider-Verträge:
pnpm test:contracts:plugins
Kanalverträge
Zu finden in src/channels/plugins/contracts/*.contract.test.ts:
- plugin - Grundlegende Plugin-Form (ID, Name, Fähigkeiten)
- setup - Setup-Assistentenvertrag
- session-binding - Session-Binding-Verhalten
- outbound-payload - Nachrichten-Nutzlaststruktur
- inbound - Verarbeitung eingehender Nachrichten
- actions - Kanal-Aktionshandler
- threading - Thread-ID-Verarbeitung
- directory - Directory/Roster-API
- group-policy - Durchsetzung von Gruppenrichtlinien
Provider-Statusverträge
Zu finden in src/plugins/contracts/*.contract.test.ts.
- status - Kanalstatus-Probes
- registry - Plugin-Registry-Form
Provider-Verträge
Zu finden in src/plugins/contracts/*.contract.test.ts:
- auth - Auth-Flow-Vertrag
- auth-choice - Auth-Auswahl/Selektion
- catalog - Modellkatalog-API
- discovery - Plugin-Erkennung
- loader - Plugin-Laden
- runtime - Provider-Laufzeit
- shape - Plugin-Form/Interface
- wizard - Setup-Assistent
Wann ausführen
- Nach Änderungen an plugin-sdk-Exports oder Subpfaden
- Nach dem Hinzufügen oder Ändern eines Kanal- oder Provider-Plugins
- Nach dem Refactoring von Plugin-Registrierung oder -Erkennung
Vertragstests laufen in CI und benötigen keine echten API-Schlüssel.
Regressionen hinzufügen (Leitlinien)
Wenn Sie ein Provider-/Modellproblem beheben, das live entdeckt wurde:
- Fügen Sie nach Möglichkeit eine CI-sichere Regression hinzu (Mock-/Stub-Provider oder Erfassung der exakten Request-Shape-Transformation)
- Wenn es inhärent nur live prüfbar ist (Rate-Limits, Auth-Richtlinien), halten Sie den Live-Test eng begrenzt und per Umgebungsvariablen opt-in
- Zielen Sie bevorzugt auf die kleinste Ebene, die den Fehler erkennt:
- Provider-Request-Konvertierungs-/Replay-Fehler → direkter Modelltest
- Gateway-Session-/History-/Tool-Pipeline-Fehler → Gateway-Live-Smoke-Test oder CI-sicherer Gateway-Mock-Test
- SecretRef-Traversal-Guardrail:
src/secrets/exec-secret-ref-id-parity.test.tsleitet aus Registry-Metadaten (listSecretTargetRegistryEntries()) ein gesampeltes Ziel pro SecretRef-Klasse ab und asserted dann, dass Exec-IDs mit Traversal-Segmenten abgelehnt werden.- Wenn Sie in
src/secrets/target-registry-data.tseine neueincludeInPlan-SecretRef-Zielfamilie hinzufügen, aktualisieren SieclassifyTargetClassin diesem Test. Der Test schlägt bei nicht klassifizierten Ziel-IDs absichtlich fehl, damit neue Klassen nicht stillschweigend übersprungen werden können.