Testing
Tests
OpenClaw dispose de trois suites Vitest (unitaire/intégration, e2e, live), ainsi que d’exécuteurs Docker. Cette page explique la couverture de chaque suite, la commande à exécuter selon le flux de travail, la manière dont les tests live détectent les identifiants et la façon d’ajouter des tests de régression pour les bogues réels liés aux fournisseurs et aux modèles.
Démarrage rapide
La plupart du temps :
- Validation complète (attendue avant un envoi) :
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Exécution locale plus rapide de la suite complète sur une machine disposant de suffisamment de ressources :
pnpm test:max - Boucle de surveillance Vitest directe :
pnpm test:watch - Le ciblage direct d’un fichier prend également en charge les chemins des Plugins et des canaux :
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Lors de l’itération sur un échec unique, privilégiez d’abord les exécutions ciblées.
- Site d’assurance qualité adossé à Docker :
pnpm qa:lab:up - Voie d’assurance qualité adossée à une machine virtuelle Linux :
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
Lorsque vous modifiez des tests ou souhaitez renforcer le niveau de confiance :
- Rapport informatif de couverture V8 :
pnpm test:coverage - Suite E2E :
pnpm test:e2e
Répertoires temporaires des tests
Utilisez les utilitaires partagés de test/helpers/temp-dir.ts pour les répertoires temporaires appartenant aux tests, afin que leur propriété soit explicite et que leur nettoyage reste intégré au cycle de vie des tests :
const tempDirs = useAutoCleanupTempDirTracker(afterEach); it("uses a temp workspace", () => { const workspace = tempDirs.make("openclaw-example-"); // use workspace});useAutoCleanupTempDirTracker(afterEach) n’expose intentionnellement aucune méthode de nettoyage manuel : Vitest prend en charge le nettoyage après chaque test. Les anciens utilitaires de plus bas niveau (makeTempDir, cleanupTempDirs, createTempDirTracker) existent toujours pour les tests qui n’ont pas encore été migrés ; évitez de les utiliser dans du nouveau code ainsi que d’ajouter de nouveaux appels directs à fs.mkdtemp*, sauf si un test vérifie explicitement le comportement brut des répertoires temporaires. Lorsqu’un répertoire temporaire brut est réellement nécessaire, ajoutez un commentaire d’autorisation vérifiable avec une justification :
// openclaw-temp-dir: allow verifies raw fs cleanup behaviorconst workspace = fs.mkdtempSync(prefix);node scripts/report-test-temp-creations.mjs signale les nouvelles créations directes de répertoires temporaires et les nouvelles utilisations manuelles de l’utilitaire partagé dans les lignes ajoutées au diff, sans bloquer les styles de nettoyage existants. Il utilise la même classification des chemins de tests que scripts/changed-lanes.mjs et ignore l’implémentation de l’utilitaire partagé elle-même. check:changed exécute ce rapport pour les chemins de tests modifiés sous la forme d’un signal CI limité à un avertissement (annotations d’avertissement GitHub, sans échec).
Flux de travail live et Docker/Parallels
Lors du débogage de fournisseurs ou de modèles réels (nécessite de vrais identifiants) :
- Suite live (modèles et sondes d’outils/d’images du Gateway) :
pnpm test:live - Cibler silencieusement un fichier live :
pnpm test:live -- src/agents/models.profiles.live.test.ts - Rapports de performances d’exécution : lancez
OpenClaw Performanceaveclive_openai_candidate=truepour un tour d’agent réel avecopenai/gpt-5.6-lunaoudeep_profile=truepour les artefacts de processeur, de tas et de trace de Kova. Les exécutions quotidiennes planifiées publient les rapports des voies du fournisseur simulé, du profilage approfondi et de GPT-5.6 Luna dansopenclaw/clawgrit-reportsdepuis une tâche de publication distincte qui consomme les artefacts ; une authentification de publication manquante ou non valide fait échouer les exécutions planifiées et celles avecprofile=release. Les lancements manuels hors version conservent les artefacts GitHub et considèrent la publication des rapports comme facultative. Le rapport du fournisseur simulé inclut également les mesures du démarrage du Gateway au niveau du code source, de la mémoire, de la charge des Plugins, de la boucle répétée de salutations du faux modèle et du démarrage de la CLI. - Balayage des modèles live dans Docker :
pnpm test:docker:live-models- Chaque modèle sélectionné exécute un tour textuel ainsi qu’une petite sonde comparable à une lecture de fichier.
Les modèles dont les métadonnées annoncent une entrée
imageexécutent également un petit tour avec image. Désactivez les sondes supplémentaires avecOPENCLAW_LIVE_MODEL_FILE_PROBE=0ouOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0lors de l’isolation des échecs de fournisseurs. - Couverture CI : les tâches quotidiennes
OpenClaw Scheduled Live And E2E Checkset les tâches manuellesOpenClaw Release Checksappellent toutes deux le flux de travail live/E2E réutilisable avecinclude_live_suites: true, ce qui inclut les tâches de matrice de modèles live Docker réparties par fournisseur. - Pour les réexécutions CI ciblées, lancez
OpenClaw Live And E2E Checks (Reusable)avecinclude_live_suites: trueetlive_models_only: true. - Ajoutez les nouveaux secrets de fournisseur à forte valeur de signal dans
scripts/ci-hydrate-live-auth.sh, ainsi que dans.github/workflows/openclaw-live-and-e2e-checks-reusable.ymlet ses appelants planifiés/de version.
- Chaque modèle sélectionné exécute un tour textuel ainsi qu’une petite sonde comparable à une lecture de fichier.
Les modèles dont les métadonnées annoncent une entrée
- Test de bon fonctionnement natif de la conversation liée à Codex :
pnpm test:docker:live-codex-bind- Exécute une voie live Docker via le chemin du serveur d’application Codex, lie un
message privé Slack synthétique avec
/codex bind, exerce/codex fastet/codex permissions, puis vérifie qu’une réponse simple et une pièce jointe image passent par la liaison native du Plugin plutôt que par ACP.
- Exécute une voie live Docker via le chemin du serveur d’application Codex, lie un
message privé Slack synthétique avec
- Test de bon fonctionnement du banc d’essai du serveur d’application Codex :
pnpm test:docker:live-codex-harness- Exécute des tours d’agent du Gateway au moyen du banc d’essai du serveur d’application Codex
appartenant au Plugin, vérifie
/codex statuset/codex modelset, par défaut, exerce les sondes d’image, de MCP Cron, de sous-agent et de Guardian. Désactivez la sonde de sous-agent avecOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0lors de l’isolation d’autres échecs. Pour une vérification ciblée du sous-agent, désactivez les autres sondes :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. Cette commande se termine après la sonde de sous-agent, sauf siOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0est défini.
- Exécute des tours d’agent du Gateway au moyen du banc d’essai du serveur d’application Codex
appartenant au Plugin, vérifie
- Test de bon fonctionnement de l’installation à la demande de Codex :
pnpm test:docker:codex-on-demand- Installe l’archive tar empaquetée d’OpenClaw dans Docker, exécute la configuration initiale avec une clé d’API OpenAI
et vérifie que le Plugin Codex ainsi que la dépendance
@openai/codexont été téléchargés à la demande dans la racine du projet npm géré.
- Installe l’archive tar empaquetée d’OpenClaw dans Docker, exécute la configuration initiale avec une clé d’API OpenAI
et vérifie que le Plugin Codex ainsi que la dépendance
- Test de bon fonctionnement live de la dépendance d’un outil de Plugin :
pnpm test:docker:live-plugin-tool- Empaquette un Plugin de test avec une véritable dépendance
slugify, l’installe au moyen denpm-pack:, vérifie la dépendance sous la racine du projet npm géré, puis demande à un modèle OpenAI live d’appeler l’outil du Plugin et de renvoyer le slug masqué.
- Empaquette un Plugin de test avec une véritable dépendance
- Test de bon fonctionnement de la commande de secours Crestodian :
pnpm test:live:crestodian-rescue-channel- Vérification facultative redondante de l’interface de commande de secours du canal de messages.
Exerce
/crestodian status, met en file d’attente un changement persistant de modèle, répond/crestodian yeset vérifie le chemin d’écriture de l’audit et de la configuration.
- Vérification facultative redondante de l’interface de commande de secours du canal de messages.
Exerce
- Test de bon fonctionnement Docker de la première exécution de Crestodian :
pnpm test:docker:crestodian-first-run- Démarre avec un répertoire d’état OpenClaw vide et démontre d’abord que la CLI
openclaw crestodianempaquetée échoue de manière sûre sans inférence. Il teste et active ensuite un faux Claude au moyen du module d’activation empaqueté. Ce n’est qu’après cela qu’une requête approximative adressée à la CLI empaquetée atteint le planificateur et aboutit à une configuration typée, suivie d’opérations ponctuelles sur le modèle, l’agent, le Plugin Discord et SecretRef. Le test valide les entrées de configuration et d’audit. Il s’agit d’éléments de preuve complémentaires pour la validation et les opérations, et non d’une preuve de configuration initiale interactive ni d’une preuve d’agent, d’outil ou d’approbation Crestodian. La même voie est disponible dans le laboratoire d’assurance qualité avecpnpm openclaw qa suite --scenario crestodian-ring-zero-setup.
- Démarre avec un répertoire d’état OpenClaw vide et démontre d’abord que la CLI
- Test de bon fonctionnement des coûts Moonshot/Kimi : avec
MOONSHOT_API_KEYdéfini, exécutezopenclaw models list --provider moonshot --json, puis lancez une commande isoléeopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsonavecmoonshot/kimi-k2.6. Vérifiez que le JSON indique Moonshot/K2.6 et que la transcription de l’assistant stocke une valeurusage.costnormalisée.
Exécuteurs propres à l’assurance qualité
Ces commandes complètent les suites de tests principales lorsque vous avez besoin du réalisme du laboratoire d’assurance qualité.
La CI exécute le laboratoire d’assurance qualité dans des flux de travail dédiés. La parité agentique est intégrée à
QA-Lab - All Lanes et à la validation de version, et non à un flux de travail de PR autonome.
Pour une validation étendue, utilisez Full Release Validation avec
rerun_group=qa-parity ou le groupe d’assurance qualité des vérifications de version. Les vérifications de version
stables/par défaut conservent les tests prolongés exhaustifs live/Docker derrière run_release_soak=true ; le
profil full les active obligatoirement. QA-Lab - All Lanes s’exécute chaque nuit sur main et
lors d’un lancement manuel, avec la voie de parité simulée, la voie Matrix live,
la voie Telegram live gérée par Convex et la voie Discord live gérée par Convex comme
tâches parallèles. Les tâches d’assurance qualité planifiées et les vérifications de version transmettent explicitement
--profile fast à Matrix, tandis que la CLI Matrix et l’entrée du flux de travail manuel conservent
all comme valeur par défaut ; un lancement manuel peut répartir all en tâches transport, media,
e2ee-smoke, e2ee-deep et e2ee-cli. OpenClaw Release Checks exécute
la parité ainsi que les voies rapides Matrix et Telegram avant l’approbation de la version, en utilisant
mock-openai/gpt-5.6-luna pour les vérifications de transport de la version afin qu’elles restent déterministes
et évitent le démarrage normal du Plugin du fournisseur. Ces Gateways de transport live
désactivent la recherche en mémoire ; le comportement de la mémoire reste couvert par les suites de parité d’assurance qualité.
Les segments de médias live de la validation complète de version utilisent
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04, qui inclut déjà
ffmpeg et ffprobe. Les segments de modèles et d’infrastructures live Docker utilisent l’image partagée
ghcr.io/openclaw/openclaw-live-test:<sha>, construite une seule fois par commit
sélectionné, puis la récupèrent avec OPENCLAW_SKIP_DOCKER_BUILD=1 au lieu de la reconstruire
dans chaque segment.
pnpm openclaw qa suite- Exécute directement sur l’hôte les scénarios d’assurance qualité fournis par le dépôt.
- Écrit les artefacts de premier niveau
qa-evidence.json,qa-suite-summary.jsonetqa-suite-report.mdpour l’ensemble de scénarios sélectionné, y compris les sélections de scénarios de flux mixtes, Vitest et Playwright. - Lorsqu’elle est lancée par
pnpm openclaw qa run --qa-profile <profile>, intègre la fiche d’évaluation du profil taxonomique sélectionné dans le même fichierqa-evidence.json.smoke-ciécrit des preuves allégées (evidenceMode: "slim", sansexecutionpar entrée).releasecouvre la sélection organisée pour la préparation à la publication ;allsélectionne chaque catégorie de maturité active et cible les déclenchements explicites du workflow QA Profile Evidence lorsqu’un artefact de fiche d’évaluation complète est nécessaire. - Exécute par défaut plusieurs scénarios sélectionnés en parallèle avec des
workers Gateway isolés.
qa-channelutilise par défaut une concurrence de 4 (limitée par le nombre de scénarios sélectionnés). Utilisez--concurrency <count>pour ajuster le nombre de workers, ou--concurrency 1pour l’ancienne voie séquentielle. - Se termine avec un code différent de zéro si un scénario échoue. Utilisez
--allow-failurespour produire les artefacts sans code de sortie d’échec. - Prend en charge les modes de fournisseur
live-frontier,mock-openaietaimock.aimockdémarre un serveur de fournisseur local reposant sur AIMock pour une couverture expérimentale des fixtures et des simulations de protocole, sans remplacer la voiemock-openaitenant compte des scénarios.
pnpm openclaw qa coverage --match <query>- Recherche dans les identifiants et titres des scénarios, les surfaces, les identifiants de couverture, les références de documentation, les références de code, les plugins et les exigences relatives aux fournisseurs, puis affiche les cibles de suite correspondantes.
- Utilisez cette commande avant une exécution de QA Lab lorsque vous connaissez le comportement ou le chemin de fichier modifié, mais pas le scénario minimal. Elle est uniquement indicative : choisissez tout de même les preuves simulées, en direct, Multipass, Matrix ou de transport en fonction du comportement modifié.
pnpm test:plugins:kitchen-sink-live- Exécute la batterie de tests en direct du plugin OpenAI Kitchen Sink via QA Lab.
Installe le paquet externe Kitchen Sink, vérifie l’inventaire des surfaces du SDK du plugin,
sonde
/healthzet/readyz, enregistre les preuves d’utilisation CPU/RSS du Gateway, exécute une interaction OpenAI en direct et vérifie les diagnostics contradictoires. Nécessite une authentification OpenAI en direct telle queOPENAI_API_KEY. Dans les sessions Testbox hydratées, elle charge automatiquement le profil d’authentification en direct de Testbox lorsque l’utilitaireopenclaw-testbox-envest présent.
- Exécute la batterie de tests en direct du plugin OpenAI Kitchen Sink via QA Lab.
Installe le paquet externe Kitchen Sink, vérifie l’inventaire des surfaces du SDK du plugin,
sonde
pnpm test:gateway:cpu-scenarios- Exécute le banc de démarrage du Gateway ainsi qu’un petit ensemble de scénarios QA Lab simulés
(
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) et écrit un récapitulatif combiné des observations du processeur sous.artifacts/gateway-cpu-scenarios/. - Ne signale par défaut que les observations prolongées de forte utilisation du processeur (
--cpu-core-warn, valeur par défaut0.9;--hot-wall-warn-ms, valeur par défaut30000), afin que les brèves pointes au démarrage soient enregistrées comme métriques sans ressembler à la régression de saturation du Gateway qui dure plusieurs minutes. - S’exécute avec les artefacts
distcompilés ; lancez d’abord une compilation lorsque l’arborescence de travail ne contient pas déjà de sortie d’exécution récente.
- Exécute le banc de démarrage du Gateway ainsi qu’un petit ensemble de scénarios QA Lab simulés
(
pnpm openclaw qa suite --runner multipass- Exécute la même suite d’assurance qualité dans une machine virtuelle Linux Multipass jetable, en conservant
les mêmes indicateurs de sélection de scénarios, de fournisseur et de modèle que
qa suite. - Les exécutions en direct transmettent les données d’authentification QA utilisables par le système invité :
les clés de fournisseur définies par des variables d’environnement, le chemin de configuration du fournisseur QA en direct et
CODEX_HOMElorsqu’il est présent. - Les répertoires de sortie doivent rester sous la racine du dépôt afin que le système invité puisse y écrire par l’intermédiaire de l’espace de travail monté.
- Écrit le rapport et le récapitulatif QA habituels, ainsi que les journaux Multipass sous
.artifacts/qa-e2e/....
- Exécute la même suite d’assurance qualité dans une machine virtuelle Linux Multipass jetable, en conservant
les mêmes indicateurs de sélection de scénarios, de fournisseur et de modèle que
pnpm qa:lab:up- Démarre le site QA reposant sur Docker pour les tâches d’assurance qualité de type opérateur.
pnpm test:docker:npm-onboard-channel-agent- Crée une archive npm à partir de l’arborescence de travail actuelle, l’installe globalement dans Docker, exécute l’intégration non interactive avec une clé d’API OpenAI, configure Telegram par défaut, vérifie que l’environnement d’exécution du plugin empaqueté se charge sans réparation des dépendances au démarrage, exécute le diagnostic, puis une interaction locale de l’agent avec un point de terminaison OpenAI simulé.
- Utilisez
OPENCLAW_NPM_ONBOARD_CHANNEL=discordpour exécuter la même voie d’installation du paquet avec Discord.
pnpm test:docker:session-runtime-context- Exécute un test de fumée Docker déterministe de l’application compilée pour les transcriptions du contexte d’exécution
intégré. Vérifie que le contexte d’exécution OpenClaw masqué persiste sous forme de
message personnalisé non affiché au lieu de se retrouver dans l’interaction utilisateur visible,
puis initialise un fichier JSONL de session défectueux concerné et vérifie que
openclaw doctor --fixle réécrit vers la branche active avec une sauvegarde.
- Exécute un test de fumée Docker déterministe de l’application compilée pour les transcriptions du contexte d’exécution
intégré. Vérifie que le contexte d’exécution OpenClaw masqué persiste sous forme de
message personnalisé non affiché au lieu de se retrouver dans l’interaction utilisateur visible,
puis initialise un fichier JSONL de session défectueux concerné et vérifie que
pnpm test:docker:npm-telegram-live- Installe un paquet OpenClaw candidat dans Docker, exécute l’intégration du paquet installé, configure Telegram par l’intermédiaire de la CLI installée, puis réutilise la voie QA Telegram en direct avec ce paquet installé comme Gateway du système testé.
- Le wrapper ne monte depuis l’arborescence de travail que la source du banc de test
qa-lab; le paquet installé possèdedist,openclaw/plugin-sdket l’environnement d’exécution du plugin intégré, de sorte que la voie ne mélange pas les plugins de l’arborescence de travail actuelle avec le paquet testé. - Utilise par défaut
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta; définissezOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzouOPENCLAW_CURRENT_PACKAGE_TGZpour tester une archive locale résolue au lieu d’effectuer l’installation depuis le registre. - Émet par défaut des mesures répétées du temps aller-retour dans
qa-evidence.jsonavecOPENCLAW_NPM_TELEGRAM_RTT_SAMPLES=20. RemplacezOPENCLAW_NPM_TELEGRAM_RTT_SAMPLES,OPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MSouOPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURESpour ajuster l’exécution.OPENCLAW_NPM_TELEGRAM_RTT_CHECKSaccepte une liste d’identifiants de contrôles QA Telegram séparés par des virgules à échantillonner ; lorsqu’elle n’est pas définie, le contrôle par défaut compatible avec le temps aller-retour esttelegram-mentioned-message-reply. - Utilise les mêmes identifiants Telegram définis dans l’environnement ou la même source d’identifiants Convex que
pnpm openclaw qa telegram. Pour l’automatisation de l’intégration continue ou de la publication, définissezOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexainsi queOPENCLAW_QA_CONVEX_SITE_URLet un secret de rôle. SiOPENCLAW_QA_CONVEX_SITE_URLet un secret de rôle Convex sont présents dans l’intégration continue, le wrapper Docker sélectionne automatiquement Convex. - Le wrapper valide les variables d’environnement des identifiants Telegram ou Convex sur l’hôte
avant les opérations de compilation et d’installation Docker. Définissez
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1uniquement lors du débogage délibéré de la configuration préalable aux identifiants. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainerremplace la valeur partagéeOPENCLAW_QA_CREDENTIAL_ROLEpour cette voie uniquement. Lorsque les identifiants Convex sont sélectionnés et qu’aucun rôle n’est défini, le wrapper utilisecidans l’intégration continue etmaintainerhors de celle-ci.- GitHub Actions expose cette voie sous la forme du workflow manuel de maintenance
NPM Telegram Beta E2E. Il ne s’exécute pas lors d’une fusion. Le workflow utilise l’environnementqa-live-sharedet les baux d’identifiants Convex de l’intégration continue.
- GitHub Actions expose également
Package Acceptancepour fournir une preuve produit exécutée séparément sur un paquet candidat. Il accepte une référence Git, une spécification npm publiée, une URL HTTPS d’archive avec son SHA-256, une politique d’URL de confiance ou un artefact d’archive provenant d’une autre exécution (source=ref|npm|url|trusted-url|artifact), téléverse le fichier normaliséopenclaw-current.tgzsous le nompackage-under-test, puis exécute l’ordonnanceur E2E Docker existant avec les profils de voiesmoke,package,product,fulloucustom. Définisseztelegram_mode=mock-openaioulive-frontierpour exécuter le workflow QA Telegram avec le même artefactpackage-under-test.- Dernière preuve produit de la version bêta :
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- La preuve par URL exacte d’archive nécessite une empreinte et utilise la politique de sécurité des URL publiques :
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- Les miroirs d’archives d’entreprise ou privés utilisent une politique explicite de source de confiance :
gh workflow run package-acceptance.yml --ref main \ -f source=trusted-url \ -f trusted_source_id=enterprise-artifactory \ -f package_url=https://packages.example.internal:8443/artifactory/openclaw/openclaw-VERSION.tgz \ -f package_sha256=<sha256> \ -f suite_profile=packagesource=trusted-url lit .github/package-trusted-sources.json depuis la référence de workflow de confiance et n’accepte ni identifiants dans l’URL ni contournement du réseau privé fourni par une entrée du workflow. Si la politique nommée déclare une authentification par jeton porteur, configurez le secret fixe OPENCLAW_TRUSTED_PACKAGE_TOKEN.
- La preuve par artefact télécharge un artefact d’archive depuis une autre exécution Actions :
gh workflow run package-acceptance.yml --ref main \ -f source=artifact \ -f artifact_run_id=<run-id> \ -f artifact_name=<artifact-name> \ -f suite_profile=smoke-
pnpm test:docker:plugins- Empaquette et installe la compilation OpenClaw actuelle dans Docker, démarre le Gateway avec OpenAI configuré, puis active les canaux et plugins intégrés au moyen de modifications de configuration.
- Vérifie que la découverte de configuration laisse absents les plugins téléchargeables non configurés, que la première réparation configurée par le diagnostic installe explicitement chaque plugin téléchargeable manquant et qu’un second redémarrage n’exécute aucune réparation masquée des dépendances.
- Installe également une ancienne version de référence npm connue, active Telegram avant
d’exécuter
openclaw update --tag <candidate>, puis vérifie que le diagnostic post-mise à jour du candidat nettoie les résidus de dépendances héritées des plugins sans réparation post-installation effectuée par le banc de test.
-
pnpm test:parallels:npm-update-
Exécute le test de fumée natif de mise à jour d’une installation empaquetée sur les systèmes invités Parallels. Chaque plateforme sélectionnée installe d’abord le paquet de référence demandé, puis exécute la commande
openclaw updateinstallée dans le même système invité et vérifie la version installée, l’état de la mise à jour, la disponibilité du Gateway et une interaction locale de l’agent. -
Utilisez
--platform macos,--platform windowsou--platform linuxlors des itérations sur un seul système invité. Utilisez--jsonpour obtenir le chemin de l’artefact récapitulatif et l’état de chaque voie. -
La voie OpenAI utilise par défaut
openai/gpt-5.6-lunapour la preuve d’interaction en direct de l’agent. Transmettez--model <provider/model>ou définissezOPENCLAW_PARALLELS_OPENAI_MODELpour valider un autre modèle OpenAI. -
Encadrez les longues exécutions locales par un délai d’expiration sur l’hôte afin que les blocages du transport Parallels ne puissent pas consommer le reste de la fenêtre de test :
bash timeout --foreground 150m pnpm test:parallels:npm-update -- --jsontimeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json -
Le script écrit les journaux imbriqués des voies sous
/tmp/openclaw-parallels-npm-update.*. Inspectezwindows-update.log,macos-update.logoulinux-update.logavant de conclure que le wrapper externe est bloqué. -
Sous Windows, la mise à jour peut prendre entre 10 et 15 minutes pour le diagnostic post-mise à jour et les opérations de mise à jour du paquet sur un système invité froid ; le fonctionnement reste normal tant que le journal de débogage npm imbriqué progresse.
-
N’exécutez pas ce wrapper agrégé en parallèle avec les voies individuelles de test de fumée Parallels pour macOS, Windows ou Linux. Elles partagent l’état des machines virtuelles et peuvent entrer en conflit lors de la restauration d’instantanés, de la mise à disposition des paquets ou au niveau de l’état du Gateway du système invité.
-
La preuve post-mise à jour exécute la surface normale des plugins intégrés, car les façades de capacités telles que la synthèse vocale, la génération d’images et la compréhension des médias sont chargées au moyen des API d’exécution intégrées, même lorsque l’interaction de l’agent ne vérifie elle-même qu’une simple réponse textuelle.
-
-
pnpm openclaw qa aimock- Démarre uniquement le serveur local du fournisseur AIMock pour des tests de fumée directs du protocole.
-
pnpm openclaw qa matrix- Exécute le parcours d’assurance qualité en conditions réelles de Matrix
sur un serveur domestique Tuwunel temporaire reposant sur Docker.
Disponible uniquement depuis les sources : les installations empaquetées
n’incluent pas
qa-lab. - CLI complète, catalogue des profils/scénarios, variables d’environnement et organisation des artefacts : Assurance qualité Matrix.
- Exécute le parcours d’assurance qualité en conditions réelles de Matrix
sur un serveur domestique Tuwunel temporaire reposant sur Docker.
Disponible uniquement depuis les sources : les installations empaquetées
n’incluent pas
-
pnpm openclaw qa telegram- Exécute le parcours d’assurance qualité en conditions réelles de Telegram dans un véritable groupe privé à l’aide des jetons du bot pilote et du bot du système testé fournis par l’environnement.
- Nécessite
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENetOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. L’identifiant du groupe doit être l’identifiant numérique de la discussion Telegram. - Prend en charge
--credential-source convexpour les identifiants partagés regroupés. Utilisez le mode environnement par défaut, ou définissezOPENCLAW_QA_CREDENTIAL_SOURCE=convexpour utiliser les baux du pool. - Les valeurs par défaut couvrent la version canari, le filtrage des
mentions, l’adressage des commandes,
/status, les réponses mentionnées de bot à bot et les réponses aux commandes natives du cœur. Les valeurs par défaut demock-openaicouvrent également les régressions déterministes liées aux chaînes de réponses et à la diffusion du message final de Telegram. Utilisez--list-scenariospour les sondes facultatives telles quesession_status. - Se termine avec un code différent de zéro si un scénario échoue.
Utilisez
--allow-failurespour produire les artefacts sans code de sortie d’échec. - Nécessite deux bots distincts dans le même groupe privé, le bot du système testé devant disposer d’un nom d’utilisateur Telegram.
- Pour une observation stable de bot à bot, activez le mode de communication
entre bots dans
@BotFatherpour les deux bots et assurez-vous que le bot pilote peut observer le trafic des bots dans le groupe. - Écrit un rapport d’assurance qualité Telegram, un résumé et
qa-evidence.jsonsous.artifacts/qa-e2e/.... Les scénarios avec réponse incluent le temps aller-retour entre la requête d’envoi du pilote et la réponse observée du système testé.
Mantis Telegram Live est l’enveloppe de collecte de preuves pour les PR
autour de ce parcours. Elle exécute la référence candidate avec des
identifiants Telegram loués via Convex, affiche le paquet expurgé de rapport
et de preuves d’assurance qualité dans un navigateur de bureau Crabbox,
enregistre une preuve MP4, génère un GIF dont les périodes sans mouvement
sont supprimées, téléverse le paquet d’artefacts et publie des preuves
intégrées dans la PR via l’application GitHub Mantis lorsque pr_number est
défini. Les mainteneurs peuvent la lancer depuis l’interface Actions via
Mantis Scenario (scenario_id: telegram-live) ou directement depuis un
commentaire de pull request :
@openclaw-mantis telegram@openclaw-mantis telegram scenario=telegram-status-command@openclaw-mantis telegram scenarios=telegram-status-command,telegram-mentioned-message-replyMantis Telegram Desktop Proof est l’enveloppe agentique native Telegram
Desktop avant/après destinée aux preuves visuelles des PR. Lancez-la depuis
l’interface Actions avec des instructions libres, via Mantis Scenario
(scenario_id: telegram-desktop-proof) ou depuis un commentaire de PR :
@openclaw-mantis telegram desktop proofL’agent Mantis lit la PR, détermine quel comportement visible dans Telegram
prouve la modification, exécute le parcours de preuve Telegram Desktop avec
un véritable utilisateur dans Crabbox sur les références de base et
candidate, itère jusqu’à obtenir des GIF natifs exploitables, écrit un
manifeste motionPreview apparié et publie le même tableau de GIF à deux
colonnes via l’application GitHub Mantis lorsque pr_number est défini.
pnpm openclaw qa mantis telegram-desktop-builder- Loue ou réutilise un bureau Linux Crabbox, installe l’application native Telegram Desktop, configure OpenClaw avec un jeton loué pour le bot Telegram du système testé, démarre le Gateway et enregistre des preuves sous forme de captures d’écran et de fichiers MP4 depuis le bureau VNC visible.
- Utilise par défaut
--credential-source convexafin que les workflows n’aient besoin que du secret du courtier Convex. Utilisez--credential-source envavec les mêmes variablesOPENCLAW_QA_TELEGRAM_*quepnpm openclaw qa telegram. - Telegram Desktop nécessite toujours la connexion et le profil d’un
utilisateur. Le jeton du bot configure uniquement OpenClaw. Utilisez
--telegram-profile-archive-env <name>pour une archive de profil.tgzen base64, ou utilisez--keep-leaseet connectez-vous manuellement une fois via VNC. - Écrit
mantis-telegram-desktop-builder-report.md,mantis-telegram-desktop-builder-summary.json,telegram-desktop-builder.pngettelegram-desktop-builder.mp4dans le répertoire de sortie.
Les parcours de transport en conditions réelles partagent un contrat
standard unique afin d’éviter toute divergence des nouveaux transports ; la
matrice de couverture propre à chaque parcours se trouve dans
Vue d’ensemble de l’assurance qualité — couverture des transports en conditions réelles.
qa-channel est la vaste suite synthétique et ne fait pas partie de cette
matrice.
Identifiants Telegram partagés via Convex (v1)
Lorsque --credential-source convex (ou
OPENCLAW_QA_CREDENTIAL_SOURCE=convex) est activé pour l’assurance qualité
des transports en conditions réelles, le laboratoire d’assurance qualité
obtient un bail exclusif auprès d’un pool reposant sur Convex, envoie des
Heartbeat pour ce bail pendant l’exécution du parcours et libère le bail à
l’arrêt. Le nom de cette section est antérieur à la prise en charge de
Discord, Slack et WhatsApp ; le contrat de location est commun à tous les
types.
Structure de référence du projet Convex :
qa/convex-credential-broker/
Variables d’environnement requises :
OPENCLAW_QA_CONVEX_SITE_URL(par exemplehttps://your-deployment.convex.site)- Un secret pour le rôle sélectionné :
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERpourmaintainerOPENCLAW_QA_CONVEX_SECRET_CIpourci
- Sélection du rôle d’identification :
- CLI :
--credential-role maintainer|ci - Valeur par défaut de l’environnement :
OPENCLAW_QA_CREDENTIAL_ROLE(cipar défaut dans la CI,maintainersinon)
- CLI :
Variables d’environnement facultatives :
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(valeur par défaut :1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(valeur par défaut :30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(valeur par défaut :90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(valeur par défaut :15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(valeur par défaut :/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(identifiant de traçage facultatif)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1autorise les URL Convexhttp://en local loopback pour le développement exclusivement local.
OPENCLAW_QA_CONVEX_SITE_URL doit utiliser https:// en fonctionnement
normal.
Les commandes d’administration des mainteneurs (ajout, suppression et liste
du pool) nécessitent spécifiquement
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER.
Assistants CLI pour les mainteneurs :
pnpm openclaw qa credentials doctorpnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.jsonpnpm openclaw qa credentials list --kind telegrampnpm openclaw qa credentials remove --credential-id <credential-id>Utilisez doctor avant les exécutions en conditions réelles afin de vérifier
l’URL du site Convex, les secrets du courtier, le préfixe des points de
terminaison, le délai d’expiration HTTP et l’accessibilité des fonctions
d’administration et de liste, sans afficher les valeurs secrètes. Utilisez
--json pour obtenir une sortie lisible par machine dans les scripts et les
utilitaires de CI.
Contrat de point de terminaison par défaut
(OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1).
Les requêtes s’authentifient avec un en-tête
Authorization: Bearer <role secret> ; les corps ci-dessous omettent cet
en-tête :
POST /acquire- Requête :
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Réussite :
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Pool épuisé/erreur réessayable :
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Requête :
POST /payload-chunk- Requête :
{ kind, ownerId, actorRole, credentialId, leaseToken, index } - Réussite :
{ status: "ok", index, data }
- Requête :
POST /heartbeat- Requête :
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Réussite :
{ status: "ok" }(ou réponse2xxvide)
- Requête :
POST /release- Requête :
{ kind, ownerId, actorRole, credentialId, leaseToken } - Réussite :
{ status: "ok" }(ou réponse2xxvide)
- Requête :
POST /admin/add(secret de mainteneur uniquement)- Requête :
{ kind, actorId, payload, note?, status? } - Réussite :
{ status: "ok", credential }
- Requête :
POST /admin/remove(secret de mainteneur uniquement)- Requête :
{ credentialId, actorId } - Réussite :
{ status: "ok", changed, credential } - Protection contre un bail actif :
{ status: "error", code: "LEASE_ACTIVE", ... }
- Requête :
POST /admin/list(secret de mainteneur uniquement)- Requête :
{ kind?, status?, includePayload?, limit? } - Réussite :
{ status: "ok", credentials, count }
- Requête :
Structure de la charge utile pour le type Telegram :
{ groupId: string, driverToken: string, sutToken: string }groupIddoit être une chaîne représentant un identifiant numérique de discussion Telegram.admin/addvalide cette structure pourkind: "telegram"et rejette les charges utiles mal formées.
Structure de la charge utile pour le type Telegram avec utilisateur réel :
{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }groupId,testerUserIdettelegramApiIddoivent être des chaînes numériques.tdlibArchiveSha256etdesktopTdataArchiveSha256doivent être des chaînes hexadécimales SHA-256.kind: "telegram-user"est réservé au workflow de preuve Mantis Telegram Desktop. Les parcours génériques du laboratoire d’assurance qualité ne doivent pas l’acquérir.
Charges utiles multicanales validées par le courtier :
- Discord :
{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string, voiceChannelId?: string } - WhatsApp :
{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }
Les parcours Slack peuvent également louer des identifiants dans le pool,
mais la validation des charges utiles Slack réside actuellement dans
l’exécuteur d’assurance qualité Slack plutôt que dans le courtier. Utilisez
{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }
pour les entrées Slack.
Ajout d’un canal à l’assurance qualité
L’architecture et les noms des assistants de scénario pour les nouveaux
adaptateurs de canal se trouvent dans
Vue d’ensemble de l’assurance qualité — ajout d’un canal.
Exigences minimales : implémenter l’exécuteur de transport sur l’interface
hôte partagée qa-lab, ajouter une adapterFactory pour les scénarios
partagés, déclarer qaRunners dans le manifeste du Plugin, monter l’exécuteur
sous la forme openclaw qa <runner> et créer les scénarios sous
qa/scenarios/.
Suites de tests (où elles s’exécutent)
Considérez les suites comme offrant un « réalisme croissant » avec, en contrepartie, une instabilité et un coût croissants.
Tests unitaires et d’intégration (par défaut)
- Commande :
pnpm test - Configuration : les exécutions non ciblées utilisent l’ensemble de
partitions
vitest.full-*.config.tset peuvent développer les partitions multiprojets en configurations propres à chaque projet pour permettre une planification parallèle - Fichiers : inventaires des tests du cœur et des tests unitaires sous
src/**/*.test.ts,packages/**/*.test.tsettest/**/*.test.ts; les tests unitaires de l’interface utilisateur s’exécutent dans la partition dédiéeunit-ui - Portée :
- Tests unitaires purs
- Tests d’intégration dans le processus (authentification du Gateway, routage, outillage, analyse syntaxique, configuration)
- Tests de régression déterministes pour les bogues connus
- Attentes :
- S’exécutent dans la CI
- Ne nécessitent aucune véritable clé
- Doivent être rapides et stables
- Les tests du résolveur et du chargeur de surface publique doivent prouver
le comportement général de repli de
api.jsetruntime-api.jsavec de minuscules Plugin générés servant de fixtures, et non avec les API du code source de véritables Plugin intégrés. Les chargements d’API de véritables Plugin doivent résider dans les suites de contrat et d’intégration appartenant aux Plugin concernés.
Politique relative aux dépendances natives :
- Les installations de test par défaut ignorent les compilations natives
facultatives d’Opus pour Discord. La voix Discord utilise le composant
intégré
libopus-wasm, et@discordjs/opusreste désactivé dansallowBuildsafin que les tests locaux et les parcours Testbox ne compilent pas le module complémentaire natif. - Comparez les performances natives d’Opus dans le dépôt de référence de
libopus-wasm, et non dans les boucles d’installation et de test par défaut d’OpenClaw. Ne définissez pas@discordjs/opussurtruedans la configurationallowBuildspar défaut ; cela ferait compiler du code natif aux boucles d’installation et de test sans rapport.
Projets, partitions et parcours ciblés
- Les exécutions non ciblées de
pnpm testlancent treize configurations de partitions plus petites (core-unit-fast,core-unit-src,core-unit-security,core-unit-ui,core-unit-support,core-support-boundary,core-tooling,core-contracts,core-bundled,core-runtime,agentic,auto-reply,extensions) au lieu d’un unique processus natif gigantesque pour le projet racine. Cela réduit le pic de RSS sur les machines chargées et évite que les tâches d’auto-réponse ou de Plugin ne privent de ressources les suites sans rapport. pnpm test --watchutilise toujours le graphe de projets natif devitest.config.tsà la racine, car une boucle de surveillance à plusieurs partitions n’est pas pratique.pnpm test,pnpm test:watchetpnpm test:perf:importsfont d’abord passer les cibles explicites de fichiers ou de répertoires par des voies ciblées, afin quepnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsévite le coût de démarrage de l’ensemble du projet racine.- Par défaut,
pnpm test:changeddéveloppe les chemins Git modifiés en voies ciblées peu coûteuses : modifications directes de tests, fichiers*.test.tsvoisins, correspondances explicites de sources et dépendants locaux du graphe d’importation. Les modifications de configuration, d’initialisation ou de paquet ne déclenchent pas une exécution étendue des tests, sauf si vous utilisez explicitementOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed. pnpm check:changedest le point de contrôle local intelligent habituel pour les modifications limitées. Il classe le diff entre le cœur, les tests du cœur, les extensions, les tests d’extensions, les applications, la documentation, les métadonnées de version, l’outillage Docker en direct et l’outillage, puis exécute les commandes correspondantes de vérification des types, de lint et de garde-fou. Il n’exécute pas les tests Vitest ; appelezpnpm test:changedou explicitementpnpm test <target>pour fournir une preuve par les tests. Les changements de version limités aux métadonnées de publication exécutent des vérifications ciblées de version, de configuration et de dépendances racines, avec un garde-fou qui rejette les modifications de paquet en dehors du champ de version de premier niveau.- Les modifications du banc d’essai ACP Docker en direct exécutent des vérifications ciblées : syntaxe shell des scripts d’authentification Docker en direct et simulation du planificateur Docker en direct. Les modifications de
package.jsonne sont incluses que lorsque le diff se limite àscripts["test:docker:live-*"]; les modifications des dépendances, des exportations, de la version et des autres surfaces du paquet utilisent toujours les garde-fous plus larges. - Les tests unitaires légers en importations des agents, commandes, plugins, assistants d’auto-réponse, de
plugin-sdket de zones similaires d’utilitaires purs passent par la voieunit-fast, qui ignoretest/setup-openclaw-runtime.ts; les fichiers avec état ou fortement dépendants de l’exécution restent sur les voies existantes. - Certains fichiers sources d’assistants de
plugin-sdket decommandsassocient également les exécutions en mode modifié à des tests voisins explicites dans ces voies légères, afin que les modifications d’assistants évitent de réexécuter toute la suite lourde de ce répertoire. auto-replydispose de groupes dédiés pour les assistants principaux de haut niveau, les tests d’intégrationreply.*de haut niveau et la sous-arborescencesrc/auto-reply/reply/**. La CI divise en outre la sous-arborescence de réponse en partitions consacrées à l’exécuteur d’agent, à la répartition et au routage des commandes et de l’état, afin qu’un groupe riche en importations ne monopolise pas toute la fin d’exécution de Node.- La CI normale des PR et de la branche principale ignore volontairement le balayage par lots des plugins intégrés et la partition
agentic-plugins, réservée aux publications. La validation complète de publication déclenche le workflow enfant distinctPlugin Prereleasepour ces suites fortement axées sur les plugins sur les versions candidates.
Couverture de l’exécuteur intégré
- Lorsque vous modifiez les entrées de découverte des outils de messagerie ou le contexte d’exécution de la Compaction, conservez les deux niveaux de couverture.
- Ajoutez des tests de régression ciblés pour les limites de routage et de normalisation pures.
- Maintenez en bon état les suites d’intégration de l’exécuteur intégré :
src/agents/embedded-agent-runner/compact.hooks.test.ts,src/agents/embedded-agent-runner/run.overflow-compaction.test.tsetsrc/agents/embedded-agent-runner/run.overflow-compaction.loop.test.ts. - Ces suites vérifient que les identifiants délimités et le comportement de la Compaction continuent de passer par les véritables chemins
run.ts/compact.ts; les tests limités aux assistants ne remplacent pas suffisamment ces chemins d’intégration.
Valeurs par défaut du pool et de l’isolation Vitest
- La configuration Vitest de base utilise
threadspar défaut. - La configuration Vitest partagée fixe
isolate: falseet utilise l’exécuteur non isolé dans les projets racines ainsi que dans les configurations E2E et en direct. - La voie de l’interface utilisateur racine conserve son initialisation
jsdomet son optimiseur, mais s’exécute également sur l’exécuteur partagé non isolé. - Chaque partition de
pnpm testhérite des mêmes valeurs par défautthreads+isolate: falsedepuis la configuration Vitest partagée. scripts/run-vitest.mjsajoute par défaut--no-maglevaux processus Node enfants de Vitest afin de réduire les recompilations de V8 pendant les grandes exécutions locales. DéfinissezOPENCLAW_VITEST_ENABLE_MAGLEV=1pour comparer avec le comportement standard de V8.scripts/run-vitest.mjsmet fin aux exécutions Vitest explicites hors surveillance après 5 minutes sans sortie standard ni sortie d’erreur. DéfinissezOPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=0pour désactiver le mécanisme de surveillance lors d’une investigation volontairement silencieuse.
Itération locale rapide
pnpm changed:lanesindique les voies architecturales déclenchées par un diff.- Le hook de pré-commit effectue uniquement le formatage. Il réindexe les fichiers formatés et n’exécute ni lint, ni vérification des types, ni tests.
- Exécutez explicitement
pnpm check:changedavant le transfert ou le push lorsque vous avez besoin du point de contrôle local intelligent. - Par défaut,
pnpm test:changedpasse par des voies ciblées peu coûteuses. UtilisezOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changeduniquement lorsque l’agent estime qu’une modification du banc d’essai, de la configuration, d’un paquet ou d’un contrat exige réellement une couverture Vitest plus large. pnpm test:maxetpnpm test:changed:maxconservent le même comportement de routage, mais avec une limite de workers plus élevée.- La mise à l’échelle automatique des workers locaux est volontairement prudente et réduit leur nombre lorsque la charge moyenne de l’hôte est déjà élevée, afin que plusieurs exécutions Vitest simultanées aient par défaut un impact moindre.
- La configuration Vitest de base marque les projets et fichiers de configuration comme
forceRerunTriggers, afin que les réexécutions en mode modifié restent correctes lorsque le câblage des tests change. - La configuration maintient
OPENCLAW_VITEST_FS_MODULE_CACHEactivé sur les hôtes pris en charge ; définissezOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/pathpour utiliser un emplacement de cache explicite lors d’un profilage direct.
Débogage des performances
pnpm test:perf:importsactive le rapport Vitest sur la durée des importations ainsi que le détail des importations.pnpm test:perf:imports:changedlimite la même vue de profilage aux fichiers modifiés depuisorigin/main.- Les données de durée des partitions sont écrites dans
.artifacts/vitest-shard-timings.json. Les exécutions de configuration complète utilisent le chemin de configuration comme clé ; les partitions de CI basées sur un motif d’inclusion ajoutent le nom de la partition afin de pouvoir suivre séparément les partitions filtrées. - Lorsqu’un test particulièrement coûteux consacre encore l’essentiel de son temps aux importations de démarrage, placez les dépendances lourdes derrière une interface locale étroite
*.runtime.tset simulez directement cette interface, au lieu d’importer en profondeur des assistants d’exécution uniquement pour les transmettre àvi.mock(...). pnpm test:perf:changed:bench -- --ref <git-ref>compare le chemin routé detest:changedau chemin natif du projet racine pour ce diff validé, puis affiche le temps écoulé ainsi que le RSS maximal sous macOS.pnpm test:perf:changed:bench -- --worktreemesure les performances de l’arborescence de travail actuellement modifiée en faisant passer la liste des fichiers modifiés parscripts/test-projects.mjset la configuration Vitest racine.pnpm test:perf:profile:mainécrit un profil CPU du thread principal pour les surcoûts de démarrage et de transformation de Vitest/Vite.pnpm test:perf:profile:runnerécrit des profils CPU et de tas de l’exécuteur pour la suite unitaire, avec le parallélisme des fichiers désactivé.
Stabilité (Gateway)
- Commande :
pnpm test:stability:gateway - Configuration :
test/vitest/vitest.gateway.config.ts,test/vitest/vitest.logging.config.tsettest/vitest/vitest.infra.config.ts, chacune limitée à un worker - Portée :
- Démarre un véritable Gateway en local loopback avec les diagnostics activés par défaut
- Génère une activité synthétique de messages du Gateway, de mémoire et de charges utiles volumineuses par le chemin des événements de diagnostic
- Interroge
diagnostics.stabilityvia le RPC WS du Gateway - Couvre les assistants de persistance de l’ensemble de stabilité des diagnostics
- Vérifie que l’enregistreur reste borné, que les échantillons RSS synthétiques restent sous le budget de pression et que les profondeurs de file par session reviennent à zéro
- Attentes :
- Compatible avec la CI et sans clé
- Voie ciblée pour le suivi des régressions de stabilité, et non substitut à la suite Gateway complète
E2E (agrégat du dépôt)
- Commande :
pnpm test:e2e - Portée :
- Exécute la voie E2E de test rapide du Gateway
- Exécute la voie E2E du navigateur simulé de la Control UI
- Attentes :
- Compatible avec la CI et sans clé
- Nécessite l’installation de Playwright Chromium
E2E (test rapide du Gateway)
- Commande :
pnpm test:e2e:gateway - Configuration :
test/vitest/vitest.e2e.config.ts - Fichiers :
src/**/*.e2e.test.ts,test/**/*.e2e.test.tset les tests E2E des plugins intégrés sousextensions/ - Valeurs d’exécution par défaut :
- Utilise
threadsde Vitest avecisolate: false, comme le reste du dépôt. - Utilise un nombre adaptatif de workers (CI : jusqu’à 2 ; local : 1 par défaut).
- S’exécute par défaut en mode silencieux afin de réduire le surcoût des E/S de la console.
- Utilise
- Remplacements utiles :
OPENCLAW_E2E_WORKERS=<n>pour imposer le nombre de workers (plafonné à 16).OPENCLAW_E2E_VERBOSE=1pour réactiver la sortie détaillée de la console.
- Portée :
- Comportement de bout en bout du Gateway avec plusieurs instances
- Surfaces WebSocket/HTTP, association de Node et réseau plus lourd
- Attentes :
- S’exécute dans la CI lorsqu’il est activé dans le pipeline
- Aucune clé réelle requise
- Davantage d’éléments interdépendants que dans les tests unitaires, donc potentiellement plus lent
E2E (navigateur simulé de la Control UI)
- Commande :
pnpm test:ui:e2e - Configuration :
test/vitest/vitest.ui-e2e.config.ts - Fichiers :
ui/src/**/*.e2e.test.ts - Portée :
- Démarre la Control UI Vite
- Pilote une véritable page Chromium avec Playwright
- Remplace le WebSocket du Gateway par des simulations déterministes dans le navigateur
- Attentes :
- S’exécute dans la CI dans le cadre de
pnpm test:e2e - Aucun Gateway, agent ni clé de fournisseur réel requis
- La dépendance du navigateur doit être présente (
pnpm --dir ui exec playwright install chromium)
- S’exécute dans la CI dans le cadre de
E2E : test rapide du backend OpenShell
- Commande :
pnpm test:e2e:openshell - Fichier :
extensions/openshell/src/backend.e2e.test.ts - Portée :
- Réutilise un Gateway OpenShell local actif
- Crée un bac à sable à partir d’un Dockerfile local temporaire
- Exerce le backend OpenShell d’OpenClaw au moyen de véritables
sandbox ssh-configet exécutions SSH - Vérifie le comportement canonique distant du système de fichiers au moyen de la passerelle du système de fichiers du bac à sable
- Attentes :
- Sur activation uniquement ; ne fait pas partie de l’exécution
pnpm test:e2epar défaut - Nécessite une CLI
openshelllocale ainsi qu’un démon Docker fonctionnel - Nécessite un Gateway OpenShell local actif et sa source de configuration
- Utilise des valeurs isolées pour
HOME/XDG_CONFIG_HOME, puis détruit le bac à sable de test
- Sur activation uniquement ; ne fait pas partie de l’exécution
- Remplacements utiles :
OPENCLAW_E2E_OPENSHELL=1pour activer le test lors de l’exécution manuelle de la suite E2E plus largeOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshellpour désigner un binaire CLI non standard ou un script enveloppeOPENCLAW_E2E_OPENSHELL_CONFIG_HOME=/path/to/configpour exposer la configuration enregistrée du Gateway au test isoléOPENCLAW_E2E_OPENSHELL_HOST_IP=172.18.0.1pour remplacer l’adresse IP du Gateway Docker utilisée par le dispositif de politique de l’hôte
En direct (fournisseurs réels + modèles réels)
- Commande :
pnpm test:live - Configuration :
test/vitest/vitest.live.config.ts - Fichiers :
src/**/*.live.test.ts,test/**/*.live.test.tset tests en conditions réelles des plugins intégrés sousextensions/ - Par défaut : activé par
pnpm test:live(définitOPENCLAW_LIVE_TEST=1) - Portée :
- « Ce fournisseur/modèle fonctionne-t-il réellement aujourd’hui avec de vrais identifiants ? »
- Détecter les changements de format des fournisseurs, les particularités des appels d’outils, les problèmes d’authentification et le comportement des limites de débit
- Attentes :
- Non stable en CI par conception (réseaux réels, politiques réelles des fournisseurs, quotas, interruptions de service)
- Entraîne des coûts/utilise les limites de débit
- Préférer l’exécution de sous-ensembles ciblés plutôt que de « tout » exécuter
- Les exécutions en conditions réelles utilisent les clés d’API déjà exportées et les profils d’authentification préparés.
- Par défaut, les exécutions en conditions réelles isolent toujours
HOMEet copient les éléments de configuration et d’authentification dans un répertoire personnel de test temporaire afin que les fixtures des tests unitaires ne puissent pas modifier votre véritable~/.openclaw. - Définissez
OPENCLAW_LIVE_USE_REAL_HOME=1uniquement lorsque vous souhaitez intentionnellement que les tests en conditions réelles utilisent votre véritable répertoire personnel. pnpm test:liveutilise par défaut un mode plus silencieux : il conserve les messages de progression[live] ...et masque les journaux d’amorçage du Gateway ainsi que les messages Bonjour. DéfinissezOPENCLAW_LIVE_TEST_QUIET=0pour rétablir l’intégralité des journaux de démarrage.- Rotation des clés d’API (propre au fournisseur) : définissez
*_API_KEYSau format séparé par des virgules/points-virgules ou*_API_KEY_1,*_API_KEY_2(par exempleOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS), ou utilisez une substitution propre aux tests en conditions réelles viaOPENCLAW_LIVE_*_KEY; les tests réessaient en cas de réponse indiquant une limite de débit. - Sortie de progression/Heartbeat :
- Les suites en conditions réelles émettent des lignes de progression sur stderr afin que les longs appels aux fournisseurs restent visiblement actifs, même lorsque la capture de la console par Vitest est silencieuse.
test/vitest/vitest.live.config.tsdésactive l’interception de la console par Vitest afin que les lignes de progression des fournisseurs/du Gateway soient diffusées immédiatement pendant les exécutions en conditions réelles.- Réglez les Heartbeats des modèles directs avec
OPENCLAW_LIVE_HEARTBEAT_MS. - Réglez les Heartbeats du Gateway/des sondes avec
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Quelle suite dois-je exécuter ?
Utilisez ce tableau de décision :
- Modification de la logique/des tests : exécutez
pnpm test(etpnpm test:coveragesi vous avez effectué de nombreuses modifications) - Modification du réseau du Gateway/du protocole WS/de l’association : ajoutez
pnpm test:e2e - Débogage de « mon bot est indisponible »/des défaillances propres à un fournisseur/des appels d’outils : exécutez un
pnpm test:liveciblé
Tests en conditions réelles (avec accès au réseau)
Pour la matrice de modèles en conditions réelles, les tests de fumée des moteurs CLI, les tests de fumée ACP, le banc d’essai du serveur d’application Codex et tous les tests en conditions réelles des fournisseurs multimédias (Deepgram, BytePlus, ComfyUI, image, musique, vidéo, banc d’essai multimédia), ainsi que la gestion des identifiants pour les exécutions en conditions réelles :
- consultez Tester les suites en conditions réelles. Pour la liste de contrôle dédiée à la validation des mises à jour et des plugins, consultez Tester les mises à jour et les plugins.
Exécuteurs Docker (vérifications facultatives du « fonctionnement sous Linux »)
Ces exécuteurs Docker se répartissent en deux catégories :
- Exécuteurs de modèles en conditions réelles :
test:docker:live-modelsettest:docker:live-gatewayexécutent uniquement le fichier de test en conditions réelles correspondant aux clés de profil dans l’image Docker du dépôt (src/agents/models.profiles.live.test.tsetsrc/gateway/gateway-models.profiles.live.test.ts), en montant votre répertoire de configuration local, votre espace de travail et le fichier facultatif des variables d’environnement du profil. Les points d’entrée locaux correspondants sonttest:live:models-profilesettest:live:gateway-profiles. - Les exécuteurs Docker en conditions réelles conservent leurs propres limites pratiques lorsque nécessaire :
test:docker:live-modelsutilise par défaut l’ensemble soigneusement sélectionné des modèles pris en charge les plus significatifs, ettest:docker:live-gatewayutilise par défautOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000etOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. DéfinissezOPENCLAW_LIVE_MAX_MODELSou les variables d’environnement du Gateway lorsque vous souhaitez explicitement une limite inférieure ou une analyse plus étendue. test:docker:allconstruit une seule fois l’image Docker destinée aux tests en conditions réelles viatest:docker:live-build, empaquette une seule fois OpenClaw sous forme d’archive npm avecscripts/package-openclaw-for-docker.mjs, puis construit/réutilise deux imagesscripts/e2e/Dockerfile. L’image minimale sert uniquement d’exécuteur Node/Git pour les parcours d’installation, de mise à jour et de dépendances de plugins ; ces parcours montent l’archive préconstruite. L’image fonctionnelle installe la même archive dans/apppour les parcours fonctionnels de l’application construite. Les définitions des parcours Docker se trouvent dansscripts/lib/docker-e2e-scenarios.mjs; la logique de planification se trouve dansscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsexécute le plan sélectionné. L’agrégat utilise un ordonnanceur local pondéré :OPENCLAW_DOCKER_ALL_PARALLELISMcontrôle les emplacements de processus, tandis que les limites de ressources empêchent les parcours lourds en conditions réelles, d’installation npm et multiservices de démarrer tous simultanément. Si un parcours unique dépasse les limites actives, l’ordonnanceur peut tout de même le démarrer lorsque le pool est vide, puis le laisse s’exécuter seul jusqu’à ce que de la capacité soit de nouveau disponible. Les valeurs par défaut sont de 10 emplacements,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=5etOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; réglezOPENCLAW_DOCKER_ALL_WEIGHT_LIMITouOPENCLAW_DOCKER_ALL_DOCKER_LIMIT(ainsi que les autres substitutionsOPENCLAW_DOCKER_ALL_<RESOURCE>_LIMIT) uniquement lorsque l’hôte Docker dispose de davantage de marge. L’exécuteur effectue par défaut une vérification préalable de Docker, supprime les conteneurs E2E OpenClaw obsolètes, affiche l’état toutes les 30 secondes, enregistre la durée des parcours réussis dans.artifacts/docker-tests/lane-timings.jsonet utilise ces durées pour démarrer d’abord les parcours les plus longs lors des exécutions ultérieures. UtilisezOPENCLAW_DOCKER_ALL_DRY_RUN=1pour afficher le manifeste pondéré des parcours sans construire ni exécuter Docker, ounode scripts/test-docker-all.mjs --plan-jsonpour afficher le plan CI des parcours sélectionnés, les besoins en paquets/images et les identifiants.Package Acceptanceest la barrière de validation native de GitHub pour vérifier « si cette archive installable fonctionne comme un produit ». Elle résout un seul paquet candidat depuissource=npm,source=ref,source=url,source=trusted-urlousource=artifact, le téléverse sous le nompackage-under-test, puis exécute les parcours Docker E2E réutilisables sur cette archive exacte au lieu de réempaqueter la référence sélectionnée. Les profils sont classés par étendue :smoke,package,productetfull(ainsi quecustompour une liste explicite de parcours). Consultez Tester les mises à jour et les plugins pour le contrat des paquets/mises à jour/plugins, la matrice de survie aux mises à niveau publiées, les valeurs par défaut des versions et le triage des défaillances.- Les vérifications de construction et de publication exécutent
scripts/check-cli-bootstrap-imports.mjsaprès tsdown. La protection parcourt le graphe statique construit depuisdist/entry.jsetdist/cli/run-main.jset échoue si ce graphe d’amorçage antérieur à la répartition importe statiquement un paquet externe (Commander, interface utilisateur d’invite, undici, journalisation et autres dépendances lourdes au démarrage sont toutes prises en compte) avant la répartition des commandes ; elle limite également le fragment d’exécution groupé du Gateway à 70 Ko et rejette les importations statiques de chemins du Gateway connus comme rarement utilisés (control-ui-assets,diagnostic-stability-bundle,onboard-helpers,process-respawn,restart-sentinel,server-close,server-reload-handlers) depuis ce fragment.scripts/release-check.tssoumet séparément la CLI empaquetée à des tests de fumée avec--help,onboard --help,doctor --help,status --json --timeout 1,config schemaetmodels list --provider openai. - La compatibilité historique de Package Acceptance est limitée à
2026.4.25(2026.4.25-beta.*inclus). Jusqu’à cette limite, le banc d’essai tolère uniquement les lacunes de métadonnées des paquets publiés : entrées omises de l’inventaire d’assurance qualité privé, absence degateway install --wrapper, fichiers de correctifs absents de la fixture Git dérivée de l’archive, absence deupdate.channelpersistant, emplacements historiques des enregistrements d’installation des plugins, absence de persistance des enregistrements d’installation de la place de marché et migration des métadonnées de configuration pendantplugins update. Pour les paquets postérieurs à2026.4.25, ces chemins produisent des échecs stricts. - Exécuteurs de tests de fumée en conteneur :
test:docker:openwebui,test:docker:onboard,test:docker:npm-onboard-channel-agent,test:docker:release-user-journey,test:docker:release-typed-onboarding,test:docker:release-media-memory,test:docker:release-upgrade-user-journey,test:docker:release-plugin-marketplace,test:docker:skill-install,test:docker:update-channel-switch,test:docker:upgrade-survivor,test:docker:published-upgrade-survivor,test:docker:session-runtime-context,test:docker:agents-delete-shared-workspace,test:docker:gateway-network,test:docker:browser-cdp-snapshot,test:docker:mcp-channels,test:docker:agent-bundle-mcp-tools,test:docker:cron-mcp-cleanup,test:docker:plugins,test:docker:plugin-update,test:docker:plugin-lifecycle-matrixettest:docker:config-reloaddémarrent un ou plusieurs conteneurs réels et vérifient des parcours d’intégration de haut niveau. - Les parcours E2E Docker/Bash qui installent l’archive OpenClaw empaquetée avec
scripts/lib/openclaw-e2e-instance.shlimitent la durée denpm installàOPENCLAW_E2E_NPM_INSTALL_TIMEOUT(600spar défaut ; définissez0pour désactiver l’enveloppe à des fins de débogage).
Les exécuteurs Docker de modèles en conditions réelles montent également uniquement les répertoires personnels d’authentification CLI nécessaires (ou tous ceux pris en charge lorsque l’exécution n’est pas ciblée), puis les copient dans le répertoire personnel du conteneur avant l’exécution afin que l’OAuth des CLI externes puisse actualiser les jetons sans modifier le stockage d’authentification de l’hôte :
-
Modèles directs :
pnpm test:docker:live-models(script :scripts/test-live-models-docker.sh) -
Test de fumée de liaison ACP :
pnpm test:docker:live-acp-bind(script :scripts/test-live-acp-bind-docker.sh; couvre Claude, Codex et Gemini par défaut, avec une couverture stricte de Droid/OpenCode viapnpm test:docker:live-acp-bind:droidetpnpm test:docker:live-acp-bind:opencode) -
Test de fumée du moteur CLI :
pnpm test:docker:live-cli-backend(script :scripts/test-live-cli-backend-docker.sh) -
Test de fumée du banc d’essai du serveur d’application Codex :
pnpm test:docker:live-codex-harness(script :scripts/test-live-codex-harness-docker.sh) -
Gateway + agent de développement :
pnpm test:docker:live-gateway(script :scripts/test-live-gateway-models-docker.sh) -
Tests de fumée d’observabilité :
pnpm qa:otel:smoke,pnpm qa:prometheus:smokeetpnpm qa:observability:smokesont des parcours privés d’assurance qualité exécutés depuis le code source. Ils ne font intentionnellement pas partie des parcours Docker de publication des paquets, car l’archive npm omet QA Lab. -
Test de fumée Open WebUI en conditions réelles :
pnpm test:docker:openwebui(script :scripts/e2e/openwebui-docker.sh) -
Assistant d’intégration (TTY, structure complète) :
pnpm test:docker:onboard(script :scripts/e2e/onboard-docker.sh) -
Test de fumée de l’intégration/du canal/de l’agent avec l’archive npm :
pnpm test:docker:npm-onboard-channel-agentinstalle globalement l’archive OpenClaw empaquetée dans Docker, configure OpenAI via une intégration utilisant une référence de variable d’environnement ainsi que Telegram par défaut, exécute doctor, puis exécute un tour d’agent OpenAI simulé. Réutilisez une archive préconstruite avecOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz, ignorez la reconstruction sur l’hôte avecOPENCLAW_NPM_ONBOARD_HOST_BUILD=0ou changez de canal avecOPENCLAW_NPM_ONBOARD_CHANNEL=discordouOPENCLAW_NPM_ONBOARD_CHANNEL=slack. -
Test rapide du parcours utilisateur de version :
pnpm test:docker:release-user-journeyinstalle globalement l’archive tar d’OpenClaw empaquetée dans un répertoire personnel Docker vierge, exécute l’intégration initiale, configure un fournisseur OpenAI simulé, exécute un tour d’agent, installe et désinstalle des plugins externes, configure ClickClack avec une fixture locale, vérifie les messages sortants et entrants, redémarre le Gateway et exécute le diagnostic. -
Test rapide de l’intégration initiale typée de version :
pnpm test:docker:release-typed-onboardinginstalle l’archive tar empaquetée, piloteopenclaw onboardvia un véritable TTY, configure OpenAI comme fournisseur référencé par variable d’environnement, vérifie qu’aucune clé brute n’est conservée et exécute un tour d’agent simulé. -
Test rapide des médias et de la mémoire de version :
pnpm test:docker:release-media-memoryinstalle l’archive tar empaquetée, vérifie la compréhension d’image à partir d’une pièce jointe PNG, la sortie de génération d’images compatible avec OpenAI, le rappel par recherche en mémoire et la persistance du rappel après le redémarrage du Gateway. -
Test rapide du parcours utilisateur de mise à niveau de version :
pnpm test:docker:release-upgrade-user-journeyinstalle par défaut la version de référence publiée la plus récente antérieure à l’archive tar candidate, configure l’état du fournisseur, du plugin et de ClickClack sur le paquet publié, effectue la mise à niveau vers l’archive tar candidate, puis réexécute le parcours principal de l’agent, du plugin et du canal. S’il n’existe aucune version de référence publiée antérieure, il réutilise la version candidate. Remplacez la référence avecOPENCLAW_RELEASE_UPGRADE_BASELINE_SPEC=openclaw@<version>. -
Test rapide de la place de marché des plugins de version :
pnpm test:docker:release-plugin-marketplaceeffectue une installation depuis une place de marché fixture locale, met à jour le plugin installé, le désinstalle et vérifie que la CLI du plugin disparaît et que les métadonnées d’installation sont élaguées. -
Test rapide d’installation d’une Skill :
pnpm test:docker:skill-installinstalle globalement l’archive tar d’OpenClaw empaquetée dans Docker, désactive dans la configuration l’installation d’archives téléversées, résout par recherche le slug actuel d’une Skill ClawHub active, l’installe avecopenclaw skills installet vérifie la Skill installée ainsi que les métadonnées d’origine et de verrouillage.clawhub. -
Test rapide de changement de canal de mise à jour :
pnpm test:docker:update-channel-switchinstalle globalement l’archive tar d’OpenClaw empaquetée dans Docker, passe du paquetstableà la version gitdev, vérifie le canal conservé et le fonctionnement du plugin après la mise à jour, puis revient au paquetstableet vérifie l’état de la mise à jour. -
Test rapide de survie à la mise à niveau :
pnpm test:docker:upgrade-survivorinstalle l’archive tar d’OpenClaw empaquetée sur une fixture sale d’un ancien utilisateur comportant des agents, une configuration de canal, des listes d’autorisation de plugins, un état obsolète des dépendances de plugins et des fichiers existants d’espace de travail et de session. Il exécute la mise à jour du paquet ainsi que le diagnostic non interactif sans fournisseur actif ni clés de canal, puis démarre un Gateway en local loopback et vérifie la conservation de la configuration et de l’état ainsi que les budgets de démarrage et d’état. -
Test rapide publié de survie à la mise à niveau :
pnpm test:docker:published-upgrade-survivorinstalleopenclaw@latestpar défaut, initialise des fichiers réalistes d’utilisateur existant, configure cette version de référence avec une recette de commandes intégrée, valide la configuration obtenue, met à jour cette installation publiée vers l’archive tar candidate, exécute le diagnostic non interactif, écrit.artifacts/upgrade-survivor/summary.json, puis démarre un Gateway en local loopback et vérifie les intentions configurées, la conservation de l’état, le démarrage,/healthz,/readyzet les budgets d’état RPC. Remplacez une référence avecOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, demandez au planificateur agrégé de développer les références locales exactes avecOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS, par exempleopenclaw@2026.5.2 openclaw@2026.4.23 openclaw@2026.4.15, et développez les fixtures correspondant à des problèmes avecOPENCLAW_UPGRADE_SURVIVOR_SCENARIOS, par exemplereported-issues; l’ensemble des problèmes signalés inclutconfigured-plugin-installspour la réparation automatique de l’installation des plugins OpenClaw externes. L’acceptation du paquet expose ces valeurs sous les nomspublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesetpublished_upgrade_survivor_scenarios, résout les jetons de méta-référence tels quelast-stable-4ouall-since-2026.4.23, et la validation complète de version développe le contrôle du paquet d’endurance de version enlast-stable-4 2026.4.23 2026.5.2 2026.4.15, ainsi quereported-issues. -
Test rapide du contexte d’exécution de session :
pnpm test:docker:session-runtime-contextvérifie la conservation dans la transcription du contexte d’exécution masqué ainsi que la réparation par le diagnostic des branches dupliquées concernées de réécriture de l’invite. -
Test rapide d’installation globale avec Bun :
bash scripts/e2e/bun-global-install-smoke.shempaquette l’arborescence actuelle, l’installe avecbun install -gdans un répertoire personnel isolé et vérifie queopenclaw infer image providers --jsonrenvoie les fournisseurs d’images intégrés au lieu de rester bloqué. Réutilisez une archive tar précompilée avecOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz, ignorez la compilation sur l’hôte avecOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0, ou copiezdist/depuis une image Docker compilée avecOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local. -
Test rapide Docker du programme d’installation :
bash scripts/test-install-sh-docker.shpartage un même cache npm entre ses conteneurs racine, de mise à jour et npm direct. Le test rapide de mise à jour utilise par défaut la version npmlatestcomme référence stable avant la mise à niveau vers l’archive tar candidate. Remplacez-la localement avecOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22, ou sur GitHub avec l’entréeupdate_baseline_versiondu workflow de test rapide d’installation. Les vérifications du programme d’installation sans privilèges racine conservent un cache npm isolé afin que les entrées de cache appartenant à root ne masquent pas le comportement de l’installation locale de l’utilisateur. DéfinissezOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cachepour réutiliser le cache racine, de mise à jour et npm direct lors des réexécutions locales. -
L’intégration continue du test rapide d’installation ignore la mise à jour globale npm directe redondante avec
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1; exécutez le script localement sans cette variable d’environnement lorsque la couverture directe denpm install -gest nécessaire. -
Test rapide de la CLI de suppression d’agents avec espace de travail partagé :
pnpm test:docker:agents-delete-shared-workspace(script :scripts/e2e/agents-delete-shared-workspace-docker.sh) compile par défaut l’image issue du Dockerfile racine, initialise deux agents partageant un espace de travail dans un répertoire personnel de conteneur isolé, exécuteagents delete --jsonet vérifie la validité du JSON ainsi que le comportement de conservation de l’espace de travail. Réutilisez l’image du test rapide d’installation avecOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1. -
Réseau du Gateway et cycle de vie de l’hôte :
pnpm test:docker:gateway-network(script :scripts/e2e/gateway-network-docker.sh) conserve le test rapide d’authentification et d’intégrité WebSocket sur un réseau local à deux conteneurs, puis utilise l’interface HTTP d’administration en local loopback pour démontrer le verrouillage de préparation, l’accès de contrôle conservé, la récupération à la reprise et un arrêt-démarrage préparé dans le même conteneur. La vérification du redémarrage doit se terminer avant l’expiration du bail initial ; elle vérifie que l’état de suspension est local au processus tandis que la configuration persistante du Gateway et l’identité du conteneur sont conservées, et produit un fichier JSON exploitable par machine contenant les durées des phases. -
Test rapide d’instantané CDP du navigateur :
pnpm test:docker:browser-cdp-snapshot(script :scripts/e2e/browser-cdp-snapshot-docker.sh) compile l’image E2E source ainsi qu’une couche Chromium, démarre Chromium avec CDP brut, exécutebrowser doctor --deepet vérifie que les instantanés de rôles CDP couvrent les URL des liens, les éléments cliquables promus par le curseur, les références d’iframe et les métadonnées de frame. -
Régression du raisonnement minimal de
web_searchavec OpenAI Responses :pnpm test:docker:openai-web-search-minimal(script :scripts/e2e/openai-web-search-minimal-docker.sh) exécute un serveur OpenAI simulé via le Gateway, vérifie queweb_searchfait passerreasoning.effortdeminimalàlow, puis force le rejet par le schéma du fournisseur et vérifie que le détail brut apparaît dans les journaux du Gateway. -
Pont de canal MCP (Gateway initialisé + pont stdio + test rapide de trame de notification Claude brute) :
pnpm test:docker:mcp-channels(script :scripts/e2e/mcp-channels-docker.sh) -
Outils MCP de l’ensemble OpenClaw (véritable serveur MCP stdio + test rapide d’autorisation et de refus du profil OpenClaw intégré) :
pnpm test:docker:agent-bundle-mcp-tools(script :scripts/e2e/agent-bundle-mcp-tools-docker.sh) -
Nettoyage MCP Cron/sous-agent (véritable Gateway + arrêt du processus enfant MCP stdio après des exécutions Cron isolées et ponctuelles de sous-agent) :
pnpm test:docker:cron-mcp-cleanup(script :scripts/e2e/cron-mcp-cleanup-docker.sh) -
Plugins (test rapide d’installation et de mise à jour pour un chemin local,
file:, un registre npm avec dépendances remontées, des métadonnées de paquet npm mal formées, des références git mobiles, une fixture exhaustive ClawHub, des mises à jour depuis la place de marché et l’activation/l’inspection de l’ensemble Claude) :pnpm test:docker:plugins(script :scripts/e2e/plugins-docker.sh) DéfinissezOPENCLAW_PLUGINS_E2E_CLAWHUB=0pour ignorer le bloc ClawHub, ou remplacez la paire paquet/environnement d’exécution exhaustive par défaut avecOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECetOPENCLAW_PLUGINS_E2E_CLAWHUB_ID. SansOPENCLAW_CLAWHUB_URL/CLAWHUB_URL, le test utilise un serveur local hermétique de fixture ClawHub. -
Test rapide de mise à jour sans modification d’un plugin :
pnpm test:docker:plugin-update(script :scripts/e2e/plugin-update-unchanged-docker.sh) -
Test rapide de la matrice du cycle de vie des plugins :
pnpm test:docker:plugin-lifecycle-matrixinstalle l’archive tar d’OpenClaw empaquetée dans un conteneur minimal, installe un plugin npm, active et désactive celui-ci, le met à niveau puis le rétrograde via un registre npm local, supprime le code installé, puis vérifie que la désinstallation supprime toujours l’état obsolète tout en consignant les métriques RSS/CPU de chaque phase du cycle de vie. -
Test rapide des métadonnées de rechargement de la configuration :
pnpm test:docker:config-reload(script :scripts/e2e/config-reload-source-docker.sh) -
Plugins :
pnpm test:docker:pluginscouvre les tests rapides d’installation et de mise à jour pour un chemin local,file:, un registre npm avec dépendances remontées, des références git mobiles, des fixtures ClawHub, des mises à jour depuis la place de marché et l’activation/l’inspection de l’ensemble Claude.pnpm test:docker:plugin-updatecouvre le comportement de mise à jour sans modification des plugins installés.pnpm test:docker:plugin-lifecycle-matrixcouvre l’installation, l’activation, la désactivation, la mise à niveau, la rétrogradation et la désinstallation en cas de code manquant d’un plugin npm, avec suivi des ressources.
Pour précompiler et réutiliser manuellement l’image fonctionnelle partagée :
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-buildOPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channelsLes remplacements d’image propres à une suite, tels que OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE, restent prioritaires lorsqu’ils sont définis. Lorsque OPENCLAW_SKIP_DOCKER_BUILD=1 désigne une image distante partagée, les scripts la téléchargent si elle n’est pas déjà disponible localement. Les tests Docker du code QR et du programme d’installation conservent leurs propres Dockerfiles, car ils valident le comportement du paquet et de l’installation plutôt que l’environnement d’exécution partagé de l’application compilée.
Les exécuteurs Docker avec modèle actif montent également le dépôt de travail actuel en lecture seule
et le copient dans un répertoire de travail temporaire à l’intérieur du conteneur. Cela permet de conserver
une image d’exécution légère tout en exécutant Vitest sur votre source et votre configuration locales
exactes. L’étape de copie ignore les caches volumineux propres à la machine et les résultats de compilation
des applications, tels que .pnpm-store, .worktrees, __openclaw_vitest__, ainsi que les répertoires
locaux .build ou de sortie Gradle, afin que les exécutions Docker actives ne passent pas
plusieurs minutes à copier des artefacts propres à la machine. Elles définissent également
OPENCLAW_SKIP_CHANNELS=1 afin que les sondes actives du Gateway ne démarrent pas de véritables
processus de canal Telegram/Discord/etc. dans le conteneur.
test:docker:live-models exécute toujours pnpm test:live ; transmettez donc également
OPENCLAW_LIVE_GATEWAY_* lorsque vous devez restreindre ou exclure la couverture active du Gateway
de cette voie Docker.
test:docker:openwebui est un test de compatibilité de haut niveau : il démarre un
conteneur Gateway OpenClaw avec les points de terminaison HTTP compatibles avec OpenAI activés,
démarre un conteneur Open WebUI épinglé configuré pour utiliser ce Gateway, se connecte via
Open WebUI, vérifie que /api/models expose openclaw/default, puis envoie une
véritable requête de chat via le proxy /api/chat/completions d’Open WebUI. Définissez
OPENWEBUI_SMOKE_MODE=models pour les vérifications CI du chemin de publication qui doivent s’arrêter
après la connexion à Open WebUI et la découverte des modèles, sans attendre la réponse
d’un modèle actif. La première exécution peut être sensiblement plus lente, car Docker peut devoir
récupérer l’image Open WebUI et Open WebUI peut devoir terminer sa propre
configuration de démarrage à froid. Ce parcours nécessite une clé de modèle actif utilisable, fournie par
l’environnement du processus, des profils d’authentification préparés ou un fichier
OPENCLAW_PROFILE_FILE explicite. Les exécutions réussies affichent une petite charge utile JSON telle que
{ "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels est volontairement déterministe et ne nécessite pas de
véritable compte Telegram, Discord ou iMessage. Il démarre un conteneur Gateway
préconfiguré, puis un second conteneur qui lance openclaw mcp serve, et
vérifie ensuite 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 véritable
pont MCP stdio. La vérification des notifications inspecte directement les trames MCP stdio brutes
afin que le test valide ce que le pont émet réellement, et non uniquement ce qu’un SDK client
particulier expose par hasard.
test:docker:agent-bundle-mcp-tools est déterministe et ne nécessite pas de
clé de modèle actif. Il construit l’image Docker du dépôt, démarre un véritable serveur de
sonde MCP stdio dans le conteneur, matérialise ce serveur via l’environnement d’exécution MCP
du bundle OpenClaw intégré, exécute l’outil, puis vérifie que
coding et messaging conservent les outils bundle-mcp, tandis que minimal et
tools.deny: ["bundle-mcp"] les filtrent.
test:docker:cron-mcp-cleanup est déterministe et ne nécessite pas de clé de
modèle actif. Il démarre un Gateway préconfiguré avec un véritable serveur de sonde MCP stdio,
exécute un tour Cron isolé et un tour enfant ponctuel sessions_spawn, puis
vérifie que le processus enfant MCP se termine après chaque exécution.
Test manuel en langage naturel des fils ACP (hors CI) :
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Conservez ce script pour les workflows de régression et de débogage. Il pourra être de nouveau nécessaire pour valider le routage des fils ACP ; ne le supprimez donc pas.
Variables d’environnement utiles :
OPENCLAW_CONFIG_DIR=...(valeur par défaut :~/.openclaw) monté dans/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(valeur par défaut :~/.openclaw/workspace) monté dans/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...monté et chargé avant l’exécution des testsOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1pour vérifier uniquement les variables d’environnement chargées depuisOPENCLAW_PROFILE_FILE, en utilisant des répertoires temporaires de configuration et d’espace de travail, sans montage externe d’authentification CLIOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(valeur par défaut :~/.cache/openclaw/docker-cli-tools, sauf si l’exécution utilise déjà un répertoire monté géré ou de CI) monté dans/home/node/.npm-globalpour mettre en cache les installations CLI dans Docker- Les répertoires et fichiers externes d’authentification CLI sous
$HOMEsont montés en lecture seule sous/host-auth..., puis copiés dans/home/node/...avant le démarrage des tests- Répertoires par défaut (utilisés lorsque l’exécution n’est pas limitée à des fournisseurs précis) :
.factory,.gemini,.minimax - Fichiers par défaut :
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Les exécutions limitées à certains fournisseurs ne montent que les répertoires et fichiers nécessaires déduits de
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Remplacez manuellement ce comportement avec
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=noneou une liste séparée par des virgules telle queOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Répertoires par défaut (utilisés lorsque l’exécution n’est pas limitée à des fournisseurs précis) :
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...pour limiter l’exécutionOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...pour filtrer les fournisseurs dans le conteneurOPENCLAW_SKIP_DOCKER_BUILD=1pour réutiliser une imageopenclaw:local-liveexistante lors des réexécutions ne nécessitant pas de nouvelle constructionOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1pour garantir que les identifiants proviennent du magasin de profils, et non de l’environnementOPENCLAW_OPENWEBUI_MODEL=...pour choisir le modèle exposé par le Gateway lors du test Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...pour remplacer l’invite de vérification du nonce utilisée par le test Open WebUIOPENWEBUI_IMAGE=...pour remplacer l’étiquette épinglée de l’image Open WebUI
Vérification de cohérence de la documentation
Exécutez les vérifications de la documentation après toute modification : pnpm check:docs.
Exécutez la validation complète des ancres Mintlify lorsque vous devez également vérifier les titres dans les pages : pnpm docs:check-links:anchors.
Régression hors ligne (compatible avec la CI)
Il s’agit de régressions du « pipeline réel » sans véritables fournisseurs :
- Appel d’outils par le Gateway (OpenAI simulé, véritable Gateway et boucle d’agent) :
src/gateway/gateway.test.ts(cas : "runs a mock OpenAI tool call end-to-end via gateway agent loop") - Assistant de configuration du Gateway (WS
wizard.start/wizard.next, écrit la configuration et impose l’authentification) :src/gateway/gateway.test.ts(cas : "runs wizard over ws and writes auth token config")
Évaluations de fiabilité des agents (Skills)
Nous disposons déjà de quelques tests compatibles avec la CI qui se comportent comme des « évaluations de fiabilité des agents » :
- Appel d’outils simulé via le véritable Gateway et la boucle d’agent (
src/gateway/gateway.test.ts). - Parcours complets de l’assistant qui valident le câblage des sessions et les effets de la configuration (
src/gateway/gateway.test.ts).
Ce qui manque encore pour les Skills (voir Skills) :
- Prise de décision : lorsque des Skills figurent dans l’invite, l’agent choisit-il le bon Skill ou évite-t-il ceux qui ne sont pas pertinents ?
- Conformité : l’agent lit-il
SKILL.mdavant utilisation et respecte-t-il les étapes et arguments requis ? - Contrats de workflow : scénarios en plusieurs tours qui vérifient l’ordre des outils, la conservation de l’historique de session et les limites du bac à sable.
Les futures évaluations doivent d’abord rester déterministes :
- Un exécuteur de scénarios utilisant des fournisseurs simulés pour vérifier les appels d’outils et leur ordre, la lecture des fichiers de Skills et le câblage des sessions.
- Une petite suite de scénarios axés sur les Skills (utilisation ou évitement, restrictions, injection d’invite).
- Des évaluations actives facultatives (sur demande, contrôlées par des variables d’environnement), uniquement une fois la suite compatible avec la CI en place.
Tests de contrat (structure des Plugins et des canaux)
Les tests de contrat vérifient que chaque Plugin et canal enregistré respecte
son contrat d’interface. Ils parcourent tous les Plugins découverts et exécutent une
suite d’assertions sur la structure et le comportement. Le parcours de tests unitaires par défaut pnpm test
ignore volontairement ces fichiers partagés d’interface et de test ; exécutez explicitement les
commandes de contrat lorsque vous modifiez des surfaces partagées de canal ou de fournisseur.
Commandes
- Tous les contrats :
pnpm test:contracts - Contrats de canal uniquement :
pnpm test:contracts:channels - Contrats de fournisseur uniquement :
pnpm test:contracts:plugins
Contrats de canal
Situés dans src/channels/plugins/contracts/*.contract.test.ts. Catégories
principales actuelles :
- channel-catalog - métadonnées des entrées du catalogue des canaux intégrés/du registre
- plugin (adossé au registre, partitionné) - structure de base de l’enregistrement des Plugins
- surfaces-only (adossé au registre, partitionné) - vérifications de structure par surface pour
actions,setup,status,outbound,messaging,threading,directoryetgateway - session-binding (adossé au registre) - comportement de liaison des sessions
- outbound-payload - structure et normalisation de la charge utile des messages
- group-policy (solution de repli) - application de la stratégie de groupe par défaut pour chaque canal
- threading (adossé au registre, partitionné) - gestion des identifiants de fil
- directory (adossé au registre, partitionné) - API d’annuaire/de liste des membres
- registry et plugins-core.* - registre des Plugins de canal, chargeur et mécanismes internes d’autorisation d’écriture de la configuration
Les assistants de banc de test de capture de l’acheminement entrant et de charge utile sortante utilisés par ces
suites sont exposés en interne via src/plugin-sdk/channel-contract-testing.ts
(exclu de npm, il ne s’agit pas d’un sous-chemin public du SDK) ; il n’existe aucun fichier autonome
inbound.contract.test.ts dans ce répertoire.
Contrats de fournisseur
Situés dans src/plugins/contracts/*.contract.test.ts. Les catégories actuelles
comprennent :
- shape - structure du manifeste, de l’API et des exportations d’exécution du Plugin
- plugin-registration (+ parallèle) - cas d’enregistrement des manifestes
- package-manifest - exigences relatives au manifeste du paquet
- loader - comportement d’initialisation et de nettoyage du chargeur de Plugins
- registry - contenu et recherche dans le registre des contrats de Plugins
- providers - comportement partagé des fournisseurs intégrés, ainsi que des fournisseurs de recherche Web
- auth-choice - métadonnées des choix d’authentification et comportement de configuration
- provider-catalog-deprecation - métadonnées obsolètes du catalogue des fournisseurs
- wizard.choice-resolution, wizard.model-picker, wizard.setup-options - contrats de l’assistant de configuration des fournisseurs
- embedding-provider, memory-embedding-provider, web-fetch-provider, tts - contrats de fournisseur propres à chaque capacité
- session-actions, session-attachments, session-entry-projection - contrats d’état de session appartenant aux Plugins
- scheduled-turns - métadonnées des tours planifiés des Plugins et limites des horodatages
- host-hooks, run-context-lifecycle, runtime-import-side-effects, runtime-seams - contrats relatifs au cycle de vie de l’hôte et de l’environnement d’exécution des Plugins, ainsi qu’aux limites d’importation
- extension-runtime-dependencies - emplacement des dépendances d’exécution des extensions
Quand les exécuter
- Après avoir modifié les exportations ou sous-chemins de
plugin-sdk - Après avoir ajouté ou modifié un Plugin de canal ou de fournisseur
- Après avoir remanié l’enregistrement ou la découverte des Plugins
Les tests de contrat s’exécutent dans la CI et ne nécessitent pas de véritables clés d’API.
Ajout de régressions (recommandations)
Lorsque vous corrigez un problème de fournisseur ou de modèle découvert en conditions réelles :
- Ajoutez si possible une régression compatible avec la CI (fournisseur simulé ou substitut, ou capture de la transformation exacte de la structure de la requête)
- Si le problème nécessite intrinsèquement des conditions réelles (limites de débit, stratégies d’authentification), maintenez le test réel ciblé et facultatif via des variables d’environnement
- Ciblez de préférence la couche la plus petite permettant de détecter le bogue :
- bogue de conversion ou de réexécution d’une requête du fournisseur -> test direct des modèles
- bogue dans le pipeline de session, d’historique ou d’outils du Gateway -> test actif du Gateway ou test simulé du Gateway compatible avec la CI
- Garde-fou pour le parcours des SecretRef :
src/secrets/exec-secret-ref-id-parity.test.tsdéduit une cible échantillonnée par classe de SecretRef à partir des métadonnées du registre (listSecretTargetRegistryEntries()), puis vérifie que les identifiants d’exécution contenant des segments de parcours sont rejetés.- Si vous ajoutez une nouvelle famille cible SecretRef
includeInPlandanssrc/secrets/target-registry-data.ts, mettez à jourclassifyTargetClassdans ce test. Le test échoue volontairement pour les identifiants de cible non classés afin que les nouvelles classes ne puissent pas être ignorées silencieusement.