- Kit de test complet (suites, en direct, Docker) : Tests
- Validation des mises à jour et des packages de plugins : Tester les mises à jour et les plugins
Valeurs par défaut de l’agent
Les sessions d’agent exécutent localement un ou quelques tests ciblés ainsi que des vérifications statiques peu coûteuses uniquement pour les sources fiables et lorsque l’installation existante des dépendances est prête. N’exécutez jamais localement les outils d’un dépôt non fiable. Les suites plus importantes, les contrôles des modifications avec répartition de la vérification des types et du lint, les builds, Docker, les chaînes de packages, les tests E2E, les preuves en direct et la validation multiplateforme s’exécutent à distance via Crabbox. Pour les sources fiables des mainteneurs, les validations lourdes utilisent par défaut Blacksmith Testbox. Le workflow Testbox configuré hydrate les identifiants ; le code non fiable d’un contributeur ou d’un fork doit donc utiliser à la place la CI du fork sans secrets ou une instance AWS Crabbox directe et assainie. Ne préchauffez pas l’environnement pour du travail anticipé. Procurez-vous le backend à la demande lorsque la première commande lourde est prête, réutilisez l’identifianttbx_... renvoyé pour les commandes lourdes ultérieures,
synchronisez le checkout actuel à chaque exécution et arrêtez-le avant le
transfert.
Après la première réutilisation réussie, le wrapper enregistre la base du bail,
les dépendances et l’empreinte du workflow Testbox sous .crabbox/testbox-leases/.
Les modifications limitées au code source continuent de réutiliser
l’environnement préchauffé. Une modification de la base de fusion, du fichier
de verrouillage, d’une entrée du gestionnaire de packages, du wrapper ou du
workflow Testbox provoque un échec sécurisé et exige un nouveau bail. Chaque
exécution synchronise néanmoins le checkout actuel.
OPENCLAW_TESTBOX_ALLOW_STALE=1 est réservé aux diagnostics intentionnels, et non
aux preuves de publication.
Les commandes de test locales ci-dessous sont destinées aux workflows humains
et aux preuves d’agent limitées. L’indisponibilité d’un fournisseur distant doit
être signalée ; elle n’autorise pas l’exécution silencieuse d’un contrôle local
étendu.
Pour une preuve lourde non fiable, préchauffez l’environnement à la demande avec
--provider aws. Chaque exécution doit définir CRABBOX_ENV_ALLOW=CI, transmettre
--provider aws --no-hydrate et utiliser un HOME distant temporaire neuf avant
d’installer les dépendances ou d’exécuter les tests. Utilisez un bail nouvellement
préchauffé dédié à cette source non fiable ; ne réutilisez jamais un bail fiable
ou précédemment hydraté. Lancez un binaire Crabbox fiable installé depuis un
checkout propre et fiable de main, puis récupérez uniquement la PR
distante avec --fresh-pr ; n’exécutez jamais localement le wrapper ou la
configuration du checkout non fiable. Supprimez la définition de
CRABBOX_AWS_INSTANCE_PROFILE et provoquez un échec sécurisé sauf si la valeur résolue de
aws.instanceProfile est vide. Avant toute installation ou tout test, utilisez des
outils fiables avec des chemins absolus pour exiger un jeton IMDSv2, prouver que
le point de terminaison des identifiants IAM renvoie 404 et vérifier que la
valeur distante de git rev-parse HEAD correspond au SHA complet de la tête de PR
examinée. Liez le bail à ce SHA, puis arrêtez et préchauffez de nouveau
l’environnement lorsque la tête change. Téléversez le fichier fiable
scripts/crabbox-untrusted-bootstrap.sh depuis un checkout propre de main avec
--fresh-pr ; il installe les versions épinglées de Node/pnpm, vérifie le
SHA et la version épinglée du gestionnaire de packages, isole
HOME, installe les dépendances, puis exécute le test demandé. Si le
courtier ne peut pas prouver l’absence de rôle ou si aucune PR distante n’existe,
utilisez la CI du fork sans secrets. N’utilisez pas hydrate-github,
--no-sync ni un workflow Testbox dont les identifiants ont été hydratés.
Supprimez la définition de toutes les substitutions CRABBOX_TAILSCALE*, imposez
--network public --tailscale=false, effacez les indicateurs de nœud de sortie/LAN et exigez que
crabbox inspect signale un réseau public sans état Tailscale avant de
téléverser le moindre script.
Ordre local habituel
pnpm test:changedpour la preuve Vitest limitée aux modifications.pnpm test <path-or-filter>pour un fichier, un répertoire ou une cible explicite.pnpm testuniquement lorsqu’une suite Vitest locale complète est intentionnellement nécessaire.
pnpm test* / pnpm check* /
pnpm crabbox:run :
- Preuve ciblée limitée avec des dépendances prêtes :
node scripts/run-vitest.mjs <path-or-filter>. - Contrôle des modifications avec classification préalable :
node scripts/check-changed.mjs; les plans limités à la documentation, sans modification ou portant sur peu de métadonnées restent locaux lorsque les dépendances sont prêtes, tandis que les plans lourds ou dépourvus de dépendances sont délégués à Testbox. - Preuve étendue explicite avec conservation du bail :
node scripts/crabbox-wrapper.mjs run --provider blacksmith-testbox ... -- env OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 corepack pnpm check:changed, afin que pnpm s’exécute dans Testbox. - Le dernier
exitCodedu wrapper et son JSON de minutage constituent le résultat de la commande. Une exécution Blacksmith GitHub Actions déléguée peut affichercancelledaprès une commande SSH réussie, car Testbox est arrêté en dehors de l’action de maintien en vie ; consultez le résumé du wrapper et la sortie de la commande avant d’interpréter cela comme un échec. OPENCLAW_HEAVY_CHECK_LOCK_SCOPE=worktree <local-heavy-check command>: conserve la sérialisation des contrôles lourds dans l’arbre de travail actuel plutôt que dans le répertoire commun Git pour des commandes telles quepnpm check:changedet lespnpm test ...ciblés. Utilisez-le uniquement sur des hôtes locaux de grande capacité lorsque vous exécutez intentionnellement des contrôles indépendants dans plusieurs arbres de travail liés.
Commandes principales
Les exécutions du wrapper de test se terminent par un bref résumé[test] passed|failed|skipped ... in ... ; la ligne de durée propre à Vitest reste le détail par fragment.
État de test partagé et assistants de processus
src/test-utils/openclaw-test-state.ts: à utiliser depuis Vitest lorsqu’un test nécessite unHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH, un jeu de données de configuration, un espace de travail, un répertoire d’agent ou un magasin de profils d’authentification isolé.pnpm test:env-mutations:report: rapport non bloquant des tests et harnais qui modifient directementHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH,OPENCLAW_WORKSPACE_DIRou des clés d’environnement associées. Utilisez-le pour trouver les candidats à la migration vers l’assistant d’état de test partagé.test/helpers/openclaw-test-instance.ts: pour les tests E2E au niveau du processus qui nécessitent un Gateway actif, l’environnement de la CLI, la capture des journaux et le nettoyage au même endroit.- Les chaînes E2E Docker/Bash qui chargent
scripts/lib/docker-e2e-image.shpeuvent transmettredocker_e2e_test_state_shell_b64 <label> <scenario>au conteneur et le décoder avecscripts/lib/openclaw-e2e-instance.sh; les scripts utilisant plusieurs répertoires personnels peuvent transmettredocker_e2e_test_state_function_b64et appeleropenclaw_test_state_create <label> <scenario>dans chaque flux.node scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --jsonécrit un fichier d’environnement hôte pouvant être chargé (le--placé avantcreateempêche les versions récentes de Node d’interpréter--env-filecomme un indicateur Node). Les chaînes qui lancent un Gateway peuvent chargerscripts/lib/openclaw-e2e-instance.shpour la résolution du point d’entrée, le démarrage d’une simulation OpenAI, le lancement au premier plan ou en arrière-plan, les sondes de disponibilité, l’exportation de l’environnement d’état, les vidages de journaux et le nettoyage des processus.
Chaînes de la Control UI, de la TUI et des extensions
- E2E simulé de l’interface de contrôle :
pnpm test:ui:e2eexécute le groupe Vitest + Playwright qui démarre l’interface de contrôle Vite et pilote une véritable page Chromium face à un WebSocket de Gateway simulé. Les tests se trouvent dansui/src/**/*.e2e.test.ts; les simulations et contrôles partagés se trouvent dansui/src/test-helpers/control-ui-e2e.ts.pnpm test:e2einclut ce groupe. Les exécutions d’agents utilisent Testbox/Crabbox par défaut, y compris pour les validations ciblées ; utiliseznode scripts/run-vitest.mjs run --config test/vitest/vitest.ui-e2e.config.ts --configLoader runner ui/src/ui/e2e/chat-flow.e2e.test.tsuniquement comme solution de repli locale explicite. - Tests PTY de la TUI :
node scripts/run-vitest.mjs run --config test/vitest/vitest.tui-pty.config.tsexécute le groupe PTY rapide avec faux backend.OPENCLAW_TUI_PTY_INCLUDE_LOCAL=1oupnpm tui:pty:test:watch --mode localexécute le test de bon fonctionnementtui --local, plus lent, qui simule uniquement le point de terminaison externe du modèle. Vérifiez le texte visible stable ou les appels aux fixtures, et non des instantanés ANSI bruts. pnpm test:extensionsetpnpm test extensionsexécutent tous les fragments d’extensions/plugins. Les plugins de canaux lourds, le plugin de navigateur et OpenAI s’exécutent dans des fragments dédiés ; les autres groupes de plugins restent regroupés.pnpm test extensions/<id>exécute le groupe d’un seul plugin intégré.- Les fichiers sources ayant des tests voisins sont associés à ces derniers avant tout recours à des motifs glob plus larges sur les répertoires. Les modifications d’utilitaires sous
src/channels/plugins/contracts/test-helpers,src/plugin-sdk/test-helpersetsrc/plugins/contractsutilisent un graphe d’importation local afin d’exécuter les tests qui les importent plutôt que de lancer largement chaque fragment lorsque le chemin de dépendance est précis. - Les cibles de répertoires de contrats se répartissent entre leurs groupes de contrats :
pnpm test src/channels/plugins/contractsexécute les quatre configurations de contrats de canaux etpnpm test src/plugins/contractsexécute la configuration des contrats de plugins, puisque les projets génériqueschannels/pluginsexcluentcontracts/**. auto-replyest divisé en trois configurations dédiées (core,top-level,reply) afin que le banc de test des réponses ne domine pas les tests plus légers de statut, de jetons et d’utilitaires de premier niveau.- Les fichiers de test
plugin-sdketcommandssélectionnés sont acheminés vers des groupes légers dédiés qui ne conservent quetest/setup.ts, tandis que les cas exigeants en ressources d’exécution restent dans leurs groupes existants. - La configuration Vitest de base utilise par défaut
pool: "threads"etisolate: false, avec l’exécuteur partagé non isolé activé dans toutes les configurations du dépôt. pnpm test:channelsexécutevitest.channels.config.ts.
Gateway et E2E
- L’intégration du Gateway est facultative :
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm testoupnpm test:gateway. pnpm test:e2e: agrégat E2E du dépôt =pnpm test:e2e:gateway && pnpm test:ui:e2e.pnpm test:e2e:gateway: tests de bon fonctionnement de bout en bout du Gateway (association WS/HTTP/Node multi-instance). Utilise par défautthreads+isolate: false, avec des processus de travail adaptatifs dansvitest.e2e.config.ts; ajustez-les avecOPENCLAW_E2E_WORKERS=<n>, et activez les journaux détaillés avecOPENCLAW_E2E_VERBOSE=1.pnpm test:live: tests en conditions réelles des fournisseurs (Claude/Minimax/DeepSeek/z.ai/etc., conditionnés par*.live.test.ts). Nécessite des clés d’API etLIVE=1(ouOPENCLAW_LIVE_TEST=1) pour ne pas les ignorer ; sortie détaillée avecOPENCLAW_LIVE_TEST_QUIET=0.
Suite Docker complète (pnpm test:docker:all)
Construit l’image partagée de tests en conditions réelles, empaquette OpenClaw une seule fois sous forme d’archive npm, construit/réutilise une image d’exécution minimale Node/Git ainsi qu’une image fonctionnelle qui installe cette archive dans /app, puis exécute les groupes de tests de bon fonctionnement Docker au moyen d’un planificateur pondéré. scripts/package-openclaw-for-docker.mjs est l’unique outil local/CI d’empaquetage du paquet et valide l’archive ainsi que dist/postinstall-inventory.json avant leur utilisation par Docker.
- Image minimale (
OPENCLAW_DOCKER_E2E_BARE_IMAGE) : groupes d’installation, de mise à jour et de dépendances de plugins ; monte l’archive préconstruite au lieu de sources du dépôt copiées. - Image fonctionnelle (
OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE) : groupes de fonctionnalités normales de l’application compilée. - Définitions des groupes :
scripts/lib/docker-e2e-scenarios.mjs. Planificateur :scripts/lib/docker-e2e-plan.mjs. Exécuteur :scripts/test-docker-all.mjs. node scripts/test-docker-all.mjs --plan-jsonproduit le plan CI géré par le planificateur (groupes, types d’images, besoins en paquet/image de tests en conditions réelles, scénarios d’état, vérifications des identifiants) sans construire ni exécuter Docker.
Le modèle de variable d’environnement pour les limites de ressources est
OPENCLAW_DOCKER_ALL_<RESOURCE>_LIMIT (nom de la ressource en majuscules, caractères non alphanumériques remplacés par _).
Autre comportement : le runner effectue par défaut une vérification préalable de Docker, nettoie les conteneurs E2E OpenClaw obsolètes, partage les caches d’outils CLI des fournisseurs entre les lanes compatibles et cesse de planifier de nouvelles lanes mutualisées après le premier échec, sauf si OPENCLAW_DOCKER_ALL_FAIL_FAST=0 est défini. Si une lane dépasse la limite effective de poids ou de ressources sur un hôte à faible parallélisme, elle peut tout de même démarrer depuis un pool vide et s’exécuter seule jusqu’à ce qu’elle libère de la capacité. Les journaux par lane, summary.json, failures.json et les mesures temporelles des phases sont écrits sous .artifacts/docker-tests/<run-id>/ ; utilisez pnpm test:docker:timings <summary.json> pour examiner les lanes lentes et pnpm test:docker:rerun <run-id|summary.json|failures.json> pour afficher des commandes peu coûteuses de réexécution ciblée.
Lanes Docker notables
Gate locale de PR
Pour les vérifications locales de gate et de landing d’une PR, exécutez :pnpm check:changedpnpm checkpnpm check:test-typespnpm buildpnpm testpnpm check:docs
pnpm test échoue de manière intermittente sur un hôte chargé, réexécutez-le une fois avant de considérer cela comme une régression, puis isolez le problème avec pnpm test <path/to/test>. Pour les hôtes à mémoire limitée :
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed
Outils de mesure des performances des tests
pnpm test:perf:imports: active les rapports de durée et de répartition des imports Vitest, tout en continuant d’utiliser l’acheminement par lane délimité pour les cibles explicites de fichiers ou de répertoires.pnpm test:perf:imports:changedlimite le même profilage aux fichiers modifiés depuisorigin/main.pnpm test:perf:changed:bench -- --ref <git-ref>compare les performances du chemin acheminé en mode changements à celles de l’exécution native du projet racine pour le même diff git validé ;pnpm test:perf:changed:bench -- --worktreemesure les performances de l’ensemble des changements actuels de l’arbre de travail sans validation préalable.pnpm test:perf:profile:mainécrit un profil CPU pour le thread principal de Vitest (.artifacts/vitest-main-profile) ;pnpm test:perf:profile:runnerécrit des profils CPU et de tas pour le runner unitaire (.artifacts/vitest-runner-profile).pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json: exécute en série chaque configuration Vitest terminale de la suite complète et écrit des données de durée groupées ainsi que des artefacts JSON/journaux par configuration. Les rapports de suite complète isolent les fichiers par défaut afin que les graphes de modules conservés et les pauses du ramasse-miettes provenant de fichiers antérieurs ne soient pas imputés aux assertions ultérieures ; transmettez-- --no-isolateuniquement lors du profilage intentionnel de l’accumulation dans un worker partagé. L’agent de performances des tests utilise ceci comme référence avant de tenter de corriger les tests lents.pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.jsoncompare les rapports groupés après une modification axée sur les performances.- Les exécutions partitionnées de la suite complète, des extensions et des motifs d’inclusion mettent à jour les données temporelles locales dans
.artifacts/vitest-shard-timings.json; les exécutions ultérieures de configurations complètes utilisent ces mesures pour équilibrer les partitions lentes et rapides. Les partitions CI basées sur des motifs d’inclusion ajoutent le nom de la partition à la clé temporelle, ce qui permet de conserver visibles les mesures des partitions filtrées sans remplacer les données temporelles de la configuration complète. DéfinissezOPENCLAW_TEST_PROJECTS_TIMINGS=0pour ignorer l’artefact temporel local.
Benchmarks
Latence du modèle (scripts/bench-model.ts)
Latence du modèle (scripts/bench-model.ts)
MINIMAX_API_KEY, MINIMAX_BASE_URL, MINIMAX_MODEL, ANTHROPIC_API_KEY. Invite par défaut : « Répondez par un seul mot : ok. Sans ponctuation ni texte supplémentaire. »Démarrage de la CLI (scripts/bench-cli-startup.ts)
Démarrage de la CLI (scripts/bench-cli-startup.ts)
startup:--version,--help,health,health --json,status --json,statusreal:health,status,status --json,sessions,sessions --json,tasks --json,tasks list --json,tasks audit --json,agents list --json,gateway status,gateway status --json,gateway health --json,config get gateway.portall: les deux préréglages combinés
sampleCount, la moyenne, p50, p95, le minimum/maximum, la distribution des codes de sortie/signaux et le RSS maximal par commande. --cpu-prof-dir / --heap-prof-dir écrivent les profils V8 de chaque exécution.Sortie enregistrée : pnpm test:startup:bench:smoke écrit .artifacts/cli-startup-bench-smoke.json ; pnpm test:startup:bench:save écrit .artifacts/cli-startup-bench-all.json (runs=5 warmup=1). Fixture versionnée : test/fixtures/cli-startup-bench.json, actualisée par pnpm test:startup:bench:update, comparée par pnpm test:startup:bench:check.Démarrage du Gateway (scripts/bench-gateway-startup.ts)
Démarrage du Gateway (scripts/bench-gateway-startup.ts)
Utilise par défaut le point d’entrée CLI compilé à l’emplacement Identifiants de cas :
dist/entry.js ; exécutez d’abord pnpm build. Passez --entry scripts/run-node.mjs pour mesurer plutôt l’exécuteur source et conservez ces résultats séparément des références du point d’entrée compilé.default, skipChannels (démarrage des canaux ignoré), oneInternalHook, allInternalHooks, fiftyPlugins (50 plugins de manifeste), fiftyStartupLazyPlugins (50 plugins de manifeste chargés tardivement au démarrage).La sortie comprend la première sortie du processus, /healthz, /readyz, l’heure du journal de mise en écoute HTTP, l’heure du journal indiquant que le Gateway est prêt, le temps CPU, le ratio de cœurs CPU, le RSS maximal, le tas, les métriques de trace de démarrage, le retard de la boucle d’événements et les métriques détaillées de la table de recherche des plugins. Le script définit OPENCLAW_GATEWAY_STARTUP_TRACE=1 dans l’environnement du Gateway enfant./healthz indique la vivacité (le serveur HTTP peut répondre). /readyz indique que le système est utilisable (les processus auxiliaires des plugins de démarrage, les canaux et les travaux critiques pour l’état prêt effectués après l’attachement sont stabilisés). Les hooks de démarrage sont distribués de manière asynchrone et ne font pas partie de la garantie de disponibilité. L’heure du journal indiquant l’état prêt est l’horodatage interne du Gateway, utile pour l’attribution côté processus, mais elle ne remplace pas la sonde externe /readyz.Utilisez la sortie JSON ou --output pour comparer les modifications. N’utilisez --cpu-prof-dir qu’après que la sortie de trace indique un travail d’importation, de compilation ou lié au CPU que les seuls minutages des phases ne peuvent pas expliquer.Redémarrage du Gateway (scripts/bench-gateway-restart.ts)
Redémarrage du Gateway (scripts/bench-gateway-restart.ts)
macOS et Linux uniquement (utilise SIGUSR1 pour les redémarrages dans le processus ; échoue immédiatement sous Windows). Même point d’entrée compilé par défaut et même remplacement Identifiants de cas :
--entry scripts/run-node.mjs que pour le démarrage du Gateway ci-dessus.skipChannels, skipChannelsAcpxProbe (sonde de démarrage ACPX activée), skipChannelsNoAcpxProbe (sonde désactivée), default, fiftyPlugins.La sortie comprend les prochains /healthz et /readyz, le temps d’indisponibilité, le minutage de disponibilité après redémarrage, le CPU, le RSS, les métriques de trace de démarrage du processus de remplacement et les métriques de trace du redémarrage pour le traitement du signal, l’achèvement des travaux actifs, les phases de fermeture, le démarrage suivant, le minutage de disponibilité et les instantanés de mémoire. Le script définit OPENCLAW_GATEWAY_STARTUP_TRACE=1 et OPENCLAW_GATEWAY_RESTART_TRACE=1.Utilisez ce benchmark lorsqu’une modification touche la signalisation de redémarrage, les gestionnaires de fermeture, le démarrage après redémarrage, l’arrêt des processus auxiliaires, le transfert de service ou la disponibilité après redémarrage. Commencez par skipChannels afin d’isoler les mécanismes du Gateway du démarrage des canaux ; n’utilisez default ou les cas comportant de nombreux plugins qu’une fois que le cas restreint explique le chemin de redémarrage. Les métriques de trace sont des indices d’attribution, pas des verdicts — évaluez une modification du redémarrage à partir de plusieurs échantillons, de la portée correspondante du propriétaire, du comportement de /healthz//readyz et du contrat de redémarrage visible par l’utilisateur.E2E d’intégration initiale (Docker)
Facultatif ; nécessaire uniquement pour les tests de fumée de l’intégration initiale en conteneur. Flux complet de démarrage à froid dans un conteneur Linux propre :openclaw health.