Release and CI
Tests
-
Kit complet de tests (suites, en direct, Docker) : Tests
-
Validation des mises à jour et des packages de Plugin : Tests des mises à jour et des Plugins
-
pnpm test:force: tue tout processus Gateway persistant qui détient le port de contrôle par défaut, puis exécute la suite Vitest complète avec un port Gateway isolé afin que les tests serveur n’entrent pas en conflit avec une instance en cours d’exécution. Utilisez ceci lorsqu’une exécution précédente du Gateway a laissé le port 18789 occupé. -
pnpm test:coverage: exécute la suite unitaire avec la couverture V8 (viavitest.unit.config.ts). Il s’agit d’une porte de couverture pour la voie unitaire par défaut, pas d’une couverture de tous les fichiers de tout le dépôt. Les seuils sont de 70 % pour les lignes/fonctions/instructions et de 55 % pour les branches. Commecoverage.allvaut false et que la voie par défaut limite les inclusions de couverture aux tests unitaires non rapides avec des fichiers source voisins, la porte mesure le source détenu par cette voie au lieu de chaque import transitif qu’elle charge par hasard. -
pnpm test:coverage:changed: exécute la couverture unitaire uniquement pour les fichiers modifiés depuisorigin/main. -
pnpm test:changed: exécution de tests modifiés intelligente et peu coûteuse. Elle exécute des cibles précises à partir des modifications directes de tests, des fichiers*.test.tsvoisins, des correspondances explicites de sources et du graphe d’import local. Les changements larges de config/package sont ignorés sauf s’ils correspondent à des tests précis. -
OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed: exécution explicite large des tests modifiés. Utilisez-la lorsqu’une modification du harnais de test/de la config/du package doit revenir au comportement plus large de tests modifiés de Vitest. -
pnpm changed:lanes: affiche les voies architecturales déclenchées par le diff avecorigin/main. -
pnpm check:changed: exécute la porte de vérification intelligente des changements pour le diff avecorigin/main. Elle exécute typecheck, lint et les commandes de garde pour les voies architecturales affectées, mais n’exécute pas les tests Vitest. Utilisezpnpm test:changedou unpnpm test <target>explicite comme preuve de test. -
pnpm test: route les cibles explicites de fichiers/répertoires via des voies Vitest limitées. Les exécutions sans cible utilisent des groupes de shards fixes et s’étendent aux configs feuilles pour l’exécution parallèle locale ; le groupe d’extensions s’étend toujours aux configs de shard par extension au lieu d’un seul énorme processus de projet racine. -
Les exécutions via le wrapper de test se terminent par un court résumé
[test] passed|failed|skipped ... in .... La propre ligne de durée de Vitest reste le détail par shard. -
État de test OpenClaw partagé : utilisez
src/test-utils/openclaw-test-state.tsdepuis Vitest lorsqu’un test a besoin d’unHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH, d’un fixture de config, d’un workspace, d’un répertoire d’agent ou d’un magasin d’auth-profile isolé. -
Assistants E2E de processus : utilisez
test/helpers/openclaw-test-instance.tslorsqu’un test E2E au niveau processus Vitest a besoin d’un Gateway en cours d’exécution, d’un environnement CLI, d’une capture de logs et d’un nettoyage au même endroit. -
Assistants E2E Docker/Bash : les voies qui sourcent
scripts/lib/docker-e2e-image.shpeuvent passerdocker_e2e_test_state_shell_b64 <label> <scenario>dans le conteneur et le décoder avecscripts/lib/openclaw-e2e-instance.sh; les scripts multi-home peuvent passerdocker_e2e_test_state_function_b64et appeleropenclaw_test_state_create <label> <scenario>dans chaque flux. Les appelants de niveau inférieur peuvent utiliserscripts/lib/openclaw-test-state.mjs shell --label <name> --scenario <name>pour un extrait shell dans le conteneur, ounode scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --jsonpour un fichier d’environnement hôte sourçable. Le--avantcreateempêche les runtimes Node récents de traiter--env-filecomme un flag Node. Les voies Docker/Bash qui lancent un Gateway peuvent sourcerscripts/lib/openclaw-e2e-instance.shdans le conteneur pour la résolution d’entrypoint, le démarrage OpenAI simulé, le lancement du Gateway en avant-plan/arrière-plan, les sondes de disponibilité, l’export de l’environnement d’état, les dumps de logs et le nettoyage des processus. -
Les exécutions de shards complètes, d’extension et avec motif d’inclusion mettent à jour les données de timing locales dans
.artifacts/vitest-shard-timings.json; les exécutions ultérieures de configs complètes utilisent ces timings pour équilibrer les shards lents et rapides. Les shards CI avec motif d’inclusion ajoutent le nom du shard à la clé de timing, ce qui garde les timings des shards filtrés visibles sans remplacer les données de timing de config complète. DéfinissezOPENCLAW_TEST_PROJECTS_TIMINGS=0pour ignorer l’artefact de timing local. -
Les fichiers de test
plugin-sdketcommandssélectionnés sont désormais routés via des voies légères dédiées qui ne gardent quetest/setup.ts, en laissant les cas lourds en runtime sur leurs voies existantes. -
Les fichiers source avec tests voisins correspondent à ce voisin avant de revenir à des globs de répertoire plus larges. Les modifications d’assistants sous
src/channels/plugins/contracts/test-helpers,src/plugin-sdk/test-helpersetsrc/plugins/contractsutilisent un graphe d’import local pour exécuter les tests importeurs au lieu d’exécuter largement chaque shard lorsque le chemin de dépendance est précis. -
auto-replyse divise maintenant aussi en trois configs dédiées (core,top-level,reply) afin que le harnais de réponse ne domine pas les tests plus légers de statut/token/assistants de premier niveau. -
La config Vitest de base utilise maintenant par défaut
pool: "threads"etisolate: false, avec le runner non isolé partagé activé dans les configs du dépôt. -
pnpm test:channelsexécutevitest.channels.config.ts. -
pnpm test:extensionsetpnpm test extensionsexécutent tous les shards d’extensions/plugins. Les plugins de canaux lourds, le plugin navigateur et OpenAI s’exécutent comme shards dédiés ; les autres groupes de plugins restent regroupés. Utilisezpnpm test extensions/<id>pour une voie de plugin groupé. -
pnpm test:perf:imports: active le reporting de durée d’import Vitest et de détail des imports, tout en continuant d’utiliser le routage par voie limitée pour les cibles explicites de fichiers/répertoires. -
pnpm test:perf:imports:changed: même profilage des imports, mais uniquement pour les fichiers modifiés depuisorigin/main. -
pnpm test:perf:changed:bench -- --ref <git-ref>compare les performances du chemin routé en mode changé avec l’exécution native du projet racine pour le même diff git validé. -
pnpm test:perf:changed:bench -- --worktreemesure l’ensemble de changements du worktree courant sans commit préalable. -
pnpm test:perf:profile:main: écrit un profil CPU pour le thread principal Vitest (.artifacts/vitest-main-profile). -
pnpm test:perf:profile:runner: écrit des profils CPU + heap pour le runner unitaire (.artifacts/vitest-runner-profile). -
pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json: exécute en série chaque config feuille Vitest de la suite complète et écrit des données de durée groupées ainsi que des artefacts JSON/log par config. Le Test Performance Agent l’utilise comme baseline avant de tenter des corrections de tests lents. -
pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json: compare les rapports groupés après un changement axé sur les performances. -
Intégration Gateway : activation explicite via
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm testoupnpm test:gateway. -
pnpm test:e2e: exécute les tests smoke de bout en bout du Gateway (appariement multi-instance WS/HTTP/node). Par défaut, utilisethreads+isolate: falseavec des workers adaptatifs dansvitest.e2e.config.ts; ajustez avecOPENCLAW_E2E_WORKERS=<n>et définissezOPENCLAW_E2E_VERBOSE=1pour des logs détaillés. -
pnpm test:live: exécute les tests live des providers (minimax/zai). Nécessite des clés API etLIVE=1(ou*_LIVE_TEST=1spécifique au provider) pour ne pas être ignoré. -
pnpm test:docker:all: construit l’image de test live partagée, empaquette OpenClaw une fois comme tarball npm, construit/réutilise une image de runner Node/Git nue plus une image fonctionnelle qui installe ce tarball dans/app, puis exécute les voies smoke Docker avecOPENCLAW_SKIP_DOCKER_BUILD=1via un ordonnanceur pondéré. L’image nue (OPENCLAW_DOCKER_E2E_BARE_IMAGE) est utilisée pour les voies d’installation/mise à jour/dépendance de plugin ; ces voies montent le tarball préconstruit au lieu d’utiliser des sources copiées du dépôt. L’image fonctionnelle (OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE) est utilisée pour les voies de fonctionnalité normale de l’application construite.scripts/package-openclaw-for-docker.mjsest l’unique empaqueteur local/CI et valide le tarball ainsi quedist/postinstall-inventory.jsonavant que Docker ne le consomme. Les définitions de voies Docker résident dansscripts/lib/docker-e2e-scenarios.mjs; la logique de planification réside dansscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsexécute le plan sélectionné.node scripts/test-docker-all.mjs --plan-jsonémet le plan CI détenu par l’ordonnanceur pour les voies sélectionnées, les types d’images, les besoins package/image live, les scénarios d’état et les vérifications d’identifiants sans construire ni exécuter Docker.OPENCLAW_DOCKER_ALL_PARALLELISM=<n>contrôle les slots de processus et vaut 10 par défaut ;OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>contrôle le pool final sensible aux providers et vaut 10 par défaut. Les plafonds de voies lourdes valent par défautOPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=10etOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; les plafonds de providers valent par défaut une voie lourde par provider viaOPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT=4,OPENCLAW_DOCKER_ALL_LIVE_CODEX_LIMIT=4etOPENCLAW_DOCKER_ALL_LIVE_GEMINI_LIMIT=4. UtilisezOPENCLAW_DOCKER_ALL_WEIGHT_LIMITouOPENCLAW_DOCKER_ALL_DOCKER_LIMITpour les hôtes plus grands. Si une voie dépasse le poids effectif ou le plafond de ressources sur un hôte à faible parallélisme, elle peut tout de même démarrer depuis un pool vide et s’exécutera seule jusqu’à libérer de la capacité. Les démarrages de voies sont espacés de 2 secondes par défaut afin d’éviter des tempêtes de création du démon Docker local ; remplacez avecOPENCLAW_DOCKER_ALL_START_STAGGER_MS=<ms>. Le runner pré-vérifie Docker par défaut, nettoie les conteneurs E2E OpenClaw périmés, émet l’état des voies actives toutes les 30 secondes, partage les caches d’outils CLI de providers entre voies compatibles, réessaie une fois par défaut les échecs transitoires de providers live (OPENCLAW_DOCKER_ALL_LIVE_RETRIES=<n>) et stocke les timings des voies dans.artifacts/docker-tests/lane-timings.jsonpour un ordre du plus long au plus court lors des exécutions ultérieures. UtilisezOPENCLAW_DOCKER_ALL_DRY_RUN=1pour afficher le manifeste des voies sans exécuter Docker,OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS=<ms>pour ajuster la sortie d’état, ouOPENCLAW_DOCKER_ALL_TIMINGS=0pour désactiver la réutilisation des timings. UtilisezOPENCLAW_DOCKER_ALL_LIVE_MODE=skippour les voies déterministes/locales uniquement ouOPENCLAW_DOCKER_ALL_LIVE_MODE=onlypour les voies de providers live uniquement ; les alias de package sontpnpm test:docker:local:alletpnpm test:docker:live:all. Le mode live uniquement fusionne les voies live principales et finales dans un seul pool du plus long au plus court afin que les compartiments de providers puissent regrouper le travail Claude, Codex et Gemini. Le runner cesse de planifier de nouvelles voies en pool après le premier échec sauf siOPENCLAW_DOCKER_ALL_FAIL_FAST=0est défini, et chaque voie a un timeout de secours de 120 minutes remplaçable avecOPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS; certaines voies live/finales sélectionnées utilisent des plafonds par voie plus serrés. Les commandes de configuration Docker du backend CLI ont leur propre timeout viaOPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS(180 par défaut). Les logs par voie,summary.json,failures.jsonet les timings de phases sont écrits sous.artifacts/docker-tests/<run-id>/; utilisezpnpm test:docker:timings <summary.json>pour inspecter les voies lentes etpnpm test:docker:rerun <run-id|summary.json|failures.json>pour afficher des commandes de relance ciblées peu coûteuses. -
pnpm test:docker:browser-cdp-snapshot: construit un conteneur E2E source appuyé par Chromium, démarre CDP brut plus un Gateway isolé, exécutebrowser doctor --deepet vérifie que les snapshots de rôles CDP incluent les URL de liens, les éléments cliquables promus par le curseur, les références d’iframe et les métadonnées de frame. -
Les sondes Docker live du backend CLI peuvent être exécutées comme voies ciblées, par exemple
pnpm test:docker:live-cli-backend:codex,pnpm test:docker:live-cli-backend:codex:resumeoupnpm test:docker:live-cli-backend:codex:mcp. Claude et Gemini ont des alias:resumeet:mcpcorrespondants. -
pnpm test:docker:openwebui: démarre OpenClaw + Open WebUI dans Docker, se connecte via Open WebUI, vérifie/api/models, puis exécute un vrai chat proxifié via/api/chat/completions. Nécessite une clé de modèle live utilisable (par exemple OpenAI dans~/.profile), tire une image Open WebUI externe et n’est pas censé être stable en CI comme les suites unitaires/e2e normales. -
pnpm test:docker:mcp-channels: démarre un conteneur Gateway préconfiguré et un second conteneur client qui lanceopenclaw mcp serve, puis vérifie la découverte des conversations routées, la lecture des transcriptions, les métadonnées des pièces jointes, le comportement de la file d’événements en direct, le routage des envois sortants, ainsi que les notifications de canal et d’autorisation de style Claude via le vrai pont stdio. L’assertion de notification Claude lit directement les trames MCP stdio brutes afin que le smoke reflète ce que le pont émet réellement. -
pnpm test:docker:upgrade-survivor: installe l’archive tarball OpenClaw empaquetée par-dessus une fixture d’ancien utilisateur en état modifié, exécute la mise à jour du package ainsi quedoctornon interactif sans clés de fournisseur ou de canal live, puis démarre un Gateway en local loopback et vérifie que les agents, la configuration des canaux, les listes d’autorisation de plugins, les fichiers d’espace de travail/session, l’ancien état obsolète des dépendances de plugins, le démarrage et le statut RPC survivent. -
pnpm test:docker:published-upgrade-survivor: installeopenclaw@latestpar défaut, initialise des fichiers réalistes d’utilisateur existant sans clés de fournisseur ou de canal live, configure cette référence avec une recette intégrée de commandeopenclaw config set, met à jour cette installation publiée vers l’archive tarball OpenClaw empaquetée, exécutedoctornon interactif, écrit.artifacts/upgrade-survivor/summary.json, puis démarre un Gateway en local loopback et vérifie que les intentions configurées, les fichiers d’espace de travail/session, la configuration de plugins obsolète et l’ancien état des dépendances, le démarrage,/healthz,/readyzet le statut RPC survivent ou sont réparés proprement. Remplacez une référence avecOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, développez une matrice locale exacte avecOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS, par exemple[email protected] [email protected] [email protected], ou ajoutez des fixtures de scénario avecOPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues; l’ensemblereported-issuesinclutconfigured-plugin-installspour vérifier que les plugins OpenClaw externes configurés s’installent automatiquement pendant la mise à niveau, etstale-source-plugin-shadowpour empêcher les ombres de plugins uniquement source de casser le démarrage. Package Acceptance expose ces éléments souspublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesetpublished_upgrade_survivor_scenarios, et résout les jetons de référence méta tels quelast-stable-4ouall-since-2026.4.23avant de transmettre les spécifications exactes des packages aux lanes Docker. -
pnpm test:docker:update-migration: exécute le harness published-upgrade survivor dans le scénarioplugin-deps-cleanup, fortement axé sur le nettoyage, en démarrant à[email protected]par défaut. Le workflow séparéUpdate Migrationdéveloppe cette lane avecbaselines=all-since-2026.4.23, afin que chaque package stable publié depuis.23inclus soit mis à jour vers le candidat et prouve le nettoyage des dépendances de plugins configurés en dehors de la Full Release CI. -
pnpm test:docker:plugins: exécute le smoke d’installation/mise à jour pour le chemin local,file:, les packages du registre npm avec dépendances remontées, les refs git mobiles, les fixtures ClawHub, les mises à jour du marketplace et l’activation/inspection du bundle Claude.
Garde de PR locale
Pour les contrôles locaux d’intégration/de garde de PR, exécutez :
pnpm check:changedpnpm checkpnpm check:test-typespnpm buildpnpm testpnpm check:docs
Si pnpm test échoue de façon intermittente sur un hôte chargé, relancez-le une fois avant de considérer cela comme une régression, puis isolez avec pnpm test <path/to/test>. Pour les hôtes à mémoire limitée, utilisez :
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed
Banc de latence des modèles (clés locales)
Script : scripts/bench-model.ts
Utilisation :
source ~/.profile && pnpm tsx scripts/bench-model.ts --runs 10- Env facultatives :
MINIMAX_API_KEY,MINIMAX_BASE_URL,MINIMAX_MODEL,ANTHROPIC_API_KEY - Invite par défaut : "Répondez avec un seul mot : ok. Pas de ponctuation ni de texte supplémentaire."
Dernière exécution (2025-12-31, 20 exécutions) :
- médiane minimax 1279 ms (min 1114, max 2431)
- médiane opus 2454 ms (min 1224, max 3170)
Banc de démarrage CLI
Script : scripts/bench-cli-startup.ts
Utilisation :
pnpm test:startup:benchpnpm test:startup:bench:smokepnpm test:startup:bench:savepnpm test:startup:bench:updatepnpm test:startup:bench:checkpnpm tsx scripts/bench-cli-startup.tspnpm tsx scripts/bench-cli-startup.ts --runs 12pnpm tsx scripts/bench-cli-startup.ts --preset realpnpm tsx scripts/bench-cli-startup.ts --preset real --case status --case gatewayStatus --runs 3pnpm tsx scripts/bench-cli-startup.ts --preset real --case tasksJson --case tasksListJson --case tasksAuditJson --runs 3pnpm tsx scripts/bench-cli-startup.ts --entry openclaw.mjs --entry-secondary dist/entry.js --preset allpnpm tsx scripts/bench-cli-startup.ts --preset all --output .artifacts/cli-startup-bench-all.jsonpnpm tsx scripts/bench-cli-startup.ts --preset real --case gatewayStatusJson --output .artifacts/cli-startup-bench-smoke.jsonpnpm tsx scripts/bench-cli-startup.ts --preset real --cpu-prof-dir .artifacts/cli-cpupnpm tsx scripts/bench-cli-startup.ts --json
Préréglages :
startup:--version,--help,health,health --json,status --json,statusreal:health,status,status --json,sessions,sessions --json,tasks --json,tasks list --json,tasks audit --json,agents list --json,gateway status,gateway status --json,gateway health --json,config get gateway.portall: les deux préréglages
La sortie inclut sampleCount, la moyenne, p50, p95, min/max, la distribution des codes de sortie/signaux, ainsi que les résumés du RSS maximal pour chaque commande. Les options facultatives --cpu-prof-dir / --heap-prof-dir écrivent les profils V8 par exécution afin que le minutage et la capture de profils utilisent le même harnais.
Conventions de sortie enregistrée :
pnpm test:startup:bench:smokeécrit l’artéfact de smoke ciblé dans.artifacts/cli-startup-bench-smoke.jsonpnpm test:startup:bench:saveécrit l’artéfact de suite complète dans.artifacts/cli-startup-bench-all.jsonavecruns=5etwarmup=1pnpm test:startup:bench:updateactualise le fixture de référence versionné danstest/fixtures/cli-startup-bench.jsonavecruns=5etwarmup=1
Fixture versionné :
test/fixtures/cli-startup-bench.json- Actualisez avec
pnpm test:startup:bench:update - Comparez les résultats actuels au fixture avec
pnpm test:startup:bench:check
E2E d’onboarding (Docker)
Docker est facultatif ; cela n’est nécessaire que pour les tests smoke d’onboarding conteneurisés.
Flux complet de démarrage à froid dans un conteneur Linux propre :
scripts/e2e/onboard-docker.sh
Ce script pilote l’assistant interactif via un pseudo-tty, vérifie les fichiers de configuration/d’espace de travail/de session, puis démarre le gateway et exécute openclaw health.
Smoke d’import QR (Docker)
Vérifie que l’assistant d’exécution QR maintenu se charge sous les runtimes Docker Node pris en charge (Node 24 par défaut, Node 22 compatible) :
pnpm test:docker:qr