Testing
Pruebas
OpenClaw tiene tres suites de Vitest (unitarias/integración, e2e y en vivo), además de ejecutores de Docker. Esta página explica qué abarca cada suite, qué comando ejecutar para cada flujo de trabajo, cómo las pruebas en vivo detectan las credenciales y cómo añadir regresiones para errores reales de proveedores/modelos.
Inicio rápido
La mayoría de los días:
- Comprobación completa (prevista antes de enviar cambios):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Ejecución local más rápida de la suite completa en una máquina con recursos suficientes:
pnpm test:max - Bucle de observación directo de Vitest:
pnpm test:watch - La selección directa de archivos también enruta las rutas de plugins/canales:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Al iterar sobre un único fallo, prioriza primero las ejecuciones específicas.
- Sitio de control de calidad respaldado por Docker:
pnpm qa:lab:up - Carril de control de calidad respaldado por una máquina virtual Linux:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
Cuando modifiques pruebas o quieras mayor confianza:
- Informe informativo de cobertura de V8:
pnpm test:coverage - Suite e2e:
pnpm test:e2e
Directorios temporales de pruebas
Usa los asistentes compartidos de test/helpers/temp-dir.ts para los directorios temporales propiedad de las pruebas, de modo que la propiedad sea explícita y la limpieza permanezca dentro del ciclo de vida de la prueba:
const tempDirs = useAutoCleanupTempDirTracker(afterEach); it("uses a temp workspace", () => { const workspace = tempDirs.make("openclaw-example-"); // use workspace});useAutoCleanupTempDirTracker(afterEach) no expone intencionadamente ningún método de limpieza manual: Vitest se encarga de la limpieza después de cada prueba. Los asistentes anteriores de nivel inferior (makeTempDir, cleanupTempDirs, createTempDirTracker) siguen existiendo para las pruebas que aún no se han migrado; evita usarlos en código nuevo y evita nuevas llamadas directas a fs.mkdtemp*, salvo que una prueba verifique explícitamente el comportamiento básico de los directorios temporales. Cuando sea realmente necesario un directorio temporal directo, añade un comentario de autorización auditable con el motivo:
// openclaw-temp-dir: allow verifies raw fs cleanup behaviorconst workspace = fs.mkdtempSync(prefix);node scripts/report-test-temp-creations.mjs informa sobre la creación de nuevos directorios temporales directos y sobre el nuevo uso manual de asistentes compartidos en las líneas añadidas del diff, sin bloquear los estilos de limpieza existentes. Sigue la misma clasificación de rutas de pruebas que scripts/changed-lanes.mjs y omite la propia implementación del asistente compartido. check:changed ejecuta este informe para las rutas de pruebas modificadas como una señal de CI que solo genera advertencias (anotaciones de advertencia de GitHub, no fallos).
Flujos de trabajo en vivo y de Docker/Parallels
Al depurar proveedores/modelos reales (requiere credenciales reales):
- Suite en vivo (modelos y sondeos de herramientas/imágenes del Gateway):
pnpm test:live - Ejecutar de forma silenciosa un único archivo en vivo:
pnpm test:live -- src/agents/models.profiles.live.test.ts - Informes de rendimiento en tiempo de ejecución: ejecuta
OpenClaw Performanceconlive_openai_candidate=truepara un turno de agente real deopenai/gpt-5.6-lunao condeep_profile=truepara obtener artefactos de CPU/montículo/trazas de Kova. Las ejecuciones diarias programadas publican informes de los carriles del proveedor simulado, del perfil profundo y de GPT-5.6 Luna enopenclaw/clawgrit-reportsmediante una tarea de publicación independiente que consume artefactos; si la autenticación del publicador falta o no es válida, las ejecuciones programadas y las que usanprofile=releasefallan. Las ejecuciones manuales que no son de versión conservan los artefactos de GitHub y tratan la publicación de informes como orientativa. El informe del proveedor simulado también incluye cifras del arranque del Gateway a nivel de código fuente, memoria, presión de plugins, bucle repetido de saludo del modelo simulado y arranque de la CLI. - Barrido de modelos en vivo con Docker:
pnpm test:docker:live-models- Cada modelo seleccionado ejecuta un turno de texto y un pequeño sondeo similar a una lectura de archivo. Los modelos cuyos metadatos anuncian entrada de
imagetambién ejecutan un pequeño turno con imagen. Desactiva los sondeos adicionales conOPENCLAW_LIVE_MODEL_FILE_PROBE=0oOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0al aislar fallos de proveedores. - Cobertura de CI: tanto
OpenClaw Scheduled Live And E2E Checks, que se ejecuta diariamente, comoOpenClaw Release Checks, que se ejecuta manualmente, llaman al flujo de trabajo reutilizable en vivo/e2e coninclude_live_suites: true, lo que incluye tareas de la matriz de modelos en vivo de Docker divididas por proveedor. - Para repeticiones específicas en CI, ejecuta
OpenClaw Live And E2E Checks (Reusable)coninclude_live_suites: trueylive_models_only: true. - Añade nuevos secretos de proveedores con alta capacidad de señal a
scripts/ci-hydrate-live-auth.sh, además de a.github/workflows/openclaw-live-and-e2e-checks-reusable.ymly a sus invocadores programados/de versión.
- Cada modelo seleccionado ejecuta un turno de texto y un pequeño sondeo similar a una lectura de archivo. Los modelos cuyos metadatos anuncian entrada de
- Prueba de humo nativa del chat vinculado de Codex:
pnpm test:docker:live-codex-bind- Ejecuta un carril en vivo de Docker en la ruta del servidor de aplicaciones de Codex, vincula un mensaje directo sintético de Slack con
/codex bind, ejercita/codex fasty/codex permissionsy, a continuación, verifica que una respuesta sencilla y un archivo adjunto de imagen se enruten mediante la vinculación nativa del Plugin en lugar de ACP.
- Ejecuta un carril en vivo de Docker en la ruta del servidor de aplicaciones de Codex, vincula un mensaje directo sintético de Slack con
- Prueba de humo del arnés del servidor de aplicaciones de Codex:
pnpm test:docker:live-codex-harness- Ejecuta turnos de agente del Gateway mediante el arnés del servidor de aplicaciones de Codex propiedad del Plugin, verifica
/codex statusy/codex modelsy, de forma predeterminada, ejercita sondeos de imagen, MCP de Cron, subagente y Guardian. Desactiva el sondeo del subagente conOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0al aislar otros fallos. Para una comprobación específica del subagente, desactiva los demás sondeos: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. Esto termina después del sondeo del subagente, salvo que se establezcaOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0.
- Ejecuta turnos de agente del Gateway mediante el arnés del servidor de aplicaciones de Codex propiedad del Plugin, verifica
- Prueba de humo de instalación bajo demanda de Codex:
pnpm test:docker:codex-on-demand- Instala en Docker el archivo tar empaquetado de OpenClaw, ejecuta la configuración inicial con una clave de API de OpenAI y verifica que el Plugin de Codex y la dependencia
@openai/codexse hayan descargado bajo demanda en la raíz administrada del proyecto npm.
- Instala en Docker el archivo tar empaquetado de OpenClaw, ejecuta la configuración inicial con una clave de API de OpenAI y verifica que el Plugin de Codex y la dependencia
- Prueba de humo en vivo de las dependencias de herramientas de plugins:
pnpm test:docker:live-plugin-tool- Empaqueta un Plugin de prueba con una dependencia real de
slugify, lo instala mediantenpm-pack:, verifica la dependencia en la raíz administrada del proyecto npm y, a continuación, solicita a un modelo en vivo de OpenAI que llame a la herramienta del Plugin y devuelva el identificador oculto.
- Empaqueta un Plugin de prueba con una dependencia real de
- Prueba de humo del comando de rescate de Crestodian:
pnpm test:live:crestodian-rescue-channel- Comprobación opcional con redundancia adicional de la superficie del comando de rescate del canal de mensajes. Ejercita
/crestodian status, pone en cola un cambio persistente de modelo, responde con/crestodian yesy verifica la ruta de escritura de auditoría/configuración.
- Comprobación opcional con redundancia adicional de la superficie del comando de rescate del canal de mensajes. Ejercita
- Prueba de humo en Docker de la primera ejecución de Crestodian:
pnpm test:docker:crestodian-first-run- Parte de un directorio de estado vacío de OpenClaw y primero demuestra que la CLI empaquetada
openclaw crestodianfalla de forma segura sin inferencia. Después prueba y activa un Claude simulado mediante el módulo de activación empaquetado. Solo entonces una solicitud aproximada de la CLI empaquetada llega al planificador y se resuelve como una configuración tipada, seguida de operaciones de una sola ejecución sobre el modelo, el agente, el Plugin de Discord y SecretRef. Valida la configuración y las entradas de auditoría. Esto aporta evidencias complementarias de las comprobaciones/operaciones, no demuestra una configuración inicial interactiva ni el agente, las herramientas o la aprobación de Crestodian. El mismo carril está disponible en QA Lab mediantepnpm openclaw qa suite --scenario crestodian-ring-zero-setup.
- Parte de un directorio de estado vacío de OpenClaw y primero demuestra que la CLI empaquetada
- Prueba de humo de costes de Moonshot/Kimi: con
MOONSHOT_API_KEYestablecido, ejecutaopenclaw models list --provider moonshot --jsony, a continuación, ejecuta de forma aisladaopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsonconmoonshot/kimi-k2.6. Verifica que el JSON indique Moonshot/K2.6 y que la transcripción del asistente almacene el valor normalizado deusage.cost.
Ejecutores específicos de control de calidad
Estos comandos complementan las suites de pruebas principales cuando necesitas el realismo de QA Lab.
CI ejecuta QA Lab en flujos de trabajo específicos. La paridad agéntica está incluida dentro de QA-Lab - All Lanes y de la validación de versiones, no en un flujo de trabajo independiente para PR. La validación amplia debe usar Full Release Validation con rerun_group=qa-parity o el grupo de control de calidad de las comprobaciones de versión. Las comprobaciones de versión estable/predeterminada mantienen las pruebas exhaustivas prolongadas en vivo/Docker tras run_release_soak=true; el perfil full las activa obligatoriamente. QA-Lab - All Lanes se ejecuta cada noche en main y mediante ejecución manual, con el carril de paridad simulado, el carril Matrix en vivo, el carril de Telegram en vivo administrado por Convex y el carril de Discord en vivo administrado por Convex como tareas paralelas. Las ejecuciones programadas de control de calidad y las comprobaciones de versión pasan explícitamente --profile fast a Matrix, mientras que el valor predeterminado de la CLI de Matrix y de la entrada manual del flujo de trabajo sigue siendo all; la ejecución manual puede dividir all en tareas transport, media, e2ee-smoke, e2ee-deep y e2ee-cli. OpenClaw Release Checks ejecuta la paridad, además de los carriles rápidos de Matrix y Telegram, antes de aprobar una versión, y usa mock-openai/gpt-5.6-luna para las comprobaciones de transporte de la versión, de modo que sean deterministas y eviten el arranque habitual del Plugin del proveedor. Estos gateways de transporte en vivo desactivan la búsqueda en memoria; el comportamiento de la memoria sigue cubierto por las suites de paridad de control de calidad.
Las particiones de medios en vivo de la versión completa usan ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04, que ya incluye ffmpeg y ffprobe. Las particiones de modelos/backends en vivo de Docker usan la imagen compartida ghcr.io/openclaw/openclaw-live-test:<sha>, que se compila una vez por cada confirmación seleccionada y después se descarga con OPENCLAW_SKIP_DOCKER_BUILD=1, en lugar de volver a compilarla dentro de cada partición.
pnpm openclaw qa suite- Ejecuta escenarios de QA respaldados por el repositorio directamente en el host.
- Escribe los artefactos de nivel superior
qa-evidence.json,qa-suite-summary.jsonyqa-suite-report.mdpara el conjunto de escenarios seleccionado, incluidas selecciones de escenarios de flujo mixto, Vitest y Playwright. - Cuando se inicia mediante
pnpm openclaw qa run --qa-profile <profile>, incorpora la tabla de puntuación del perfil taxonómico seleccionado en el mismoqa-evidence.json.smoke-ciescribe evidencia reducida (evidenceMode: "slim", sinexecutionpor entrada).releaseabarca el subconjunto seleccionado de preparación para lanzamientos;allselecciona todas las categorías de madurez activas y está destinado a ejecuciones explícitas del flujo de trabajo de evidencia del perfil de QA cuando se necesita un artefacto con la tabla de puntuación completa. - De forma predeterminada, ejecuta varios escenarios seleccionados en paralelo con
procesos de trabajo de Gateway aislados.
qa-channelusa de forma predeterminada una concurrencia de 4 (limitada por la cantidad de escenarios seleccionados). Usa--concurrency <count>para ajustar la cantidad de procesos de trabajo o--concurrency 1para la vía serial anterior. - Finaliza con un código distinto de cero cuando falla algún escenario. Usa
--allow-failurespara generar artefactos sin un código de salida de error. - Admite los modos de proveedor
live-frontier,mock-openaiyaimock.aimockinicia un servidor de proveedor local respaldado por AIMock para ofrecer cobertura experimental de fixtures y simulaciones de protocolo sin reemplazar la víamock-openai, que tiene en cuenta los escenarios.
pnpm openclaw qa coverage --match <query>- Busca en identificadores y títulos de escenarios, superficies, identificadores de cobertura, referencias de documentación, referencias de código, plugins y requisitos de proveedores; después muestra los destinos de suite coincidentes.
- Úsalo antes de una ejecución de QA Lab cuando conozcas el comportamiento o la ruta de archivo afectados, pero no el escenario más pequeño. Es solo orientativo: debes seguir eligiendo pruebas simuladas, en vivo, de Multipass, de Matrix o de transporte según el comportamiento que se esté modificando.
pnpm test:plugins:kitchen-sink-live- Ejecuta la batería en vivo del Plugin Kitchen Sink de OpenAI mediante QA Lab.
Instala el paquete externo Kitchen Sink, verifica el inventario de superficies
del SDK de plugins, sondea
/healthzy/readyz, registra evidencia de CPU/RSS del Gateway, ejecuta un turno en vivo de OpenAI y comprueba diagnósticos adversariales. Requiere autenticación en vivo de OpenAI, comoOPENAI_API_KEY. En sesiones de Testbox preparadas, carga automáticamente el perfil de autenticación en vivo de Testbox cuando está disponible el auxiliaropenclaw-testbox-env.
- Ejecuta la batería en vivo del Plugin Kitchen Sink de OpenAI mediante QA Lab.
Instala el paquete externo Kitchen Sink, verifica el inventario de superficies
del SDK de plugins, sondea
pnpm test:gateway:cpu-scenarios- Ejecuta la prueba comparativa de inicio del Gateway junto con un pequeño paquete
de escenarios simulados de QA Lab (
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) y escribe un resumen combinado de observaciones de CPU en.artifacts/gateway-cpu-scenarios/. - De forma predeterminada, solo marca las observaciones sostenidas de CPU elevada
(
--cpu-core-warn, valor predeterminado0.9;--hot-wall-warn-ms, valor predeterminado30000), por lo que los picos breves durante el inicio se registran como métricas sin parecerse a la regresión que mantiene el Gateway saturado durante varios minutos. - Se ejecuta con los artefactos compilados de
dist; ejecuta primero una compilación cuando el checkout aún no tenga una salida reciente del entorno de ejecución.
- Ejecuta la prueba comparativa de inicio del Gateway junto con un pequeño paquete
de escenarios simulados de QA Lab (
pnpm openclaw qa suite --runner multipass- Ejecuta la misma suite de QA dentro de una máquina virtual Linux desechable de
Multipass, manteniendo los mismos indicadores de selección de escenarios,
proveedor y modelo que
qa suite. - Las ejecuciones en vivo reenvían las entradas de autenticación de QA que resultan
prácticas para el sistema invitado: claves de proveedor basadas en variables de
entorno, la ruta de configuración del proveedor en vivo de QA y
CODEX_HOMEcuando está presente. - Los directorios de salida deben permanecer bajo la raíz del repositorio para que el sistema invitado pueda escribir en ellos mediante el espacio de trabajo montado.
- Escribe el informe y el resumen normales de QA, además de los registros de
Multipass, en
.artifacts/qa-e2e/....
- Ejecuta la misma suite de QA dentro de una máquina virtual Linux desechable de
Multipass, manteniendo los mismos indicadores de selección de escenarios,
proveedor y modelo que
pnpm qa:lab:up- Inicia el sitio de QA respaldado por Docker para tareas de QA orientadas a operadores.
pnpm test:docker:npm-onboard-channel-agent- Genera un tarball de npm a partir del checkout actual, lo instala globalmente en Docker, ejecuta la incorporación no interactiva mediante una clave de API de OpenAI, configura Telegram de forma predeterminada, verifica que el entorno de ejecución del Plugin empaquetado se cargue sin reparar dependencias durante el inicio, ejecuta doctor y realiza un turno de agente local contra un endpoint simulado de OpenAI.
- Usa
OPENCLAW_NPM_ONBOARD_CHANNEL=discordpara ejecutar la misma vía de instalación empaquetada con Discord.
pnpm test:docker:session-runtime-context- Ejecuta una prueba de humo determinista de la aplicación compilada en Docker para
transcripciones con contexto de entorno de ejecución integrado. Verifica que el
contexto oculto del entorno de ejecución de OpenClaw persista como un mensaje
personalizado no visible, en lugar de filtrarse al turno visible del usuario;
después prepara un archivo JSONL de sesión defectuoso afectado y verifica que
openclaw doctor --fixlo reescriba en la rama activa con una copia de seguridad.
- Ejecuta una prueba de humo determinista de la aplicación compilada en Docker para
transcripciones con contexto de entorno de ejecución integrado. Verifica que el
contexto oculto del entorno de ejecución de OpenClaw persista como un mensaje
personalizado no visible, en lugar de filtrarse al turno visible del usuario;
después prepara un archivo JSONL de sesión defectuoso afectado y verifica que
pnpm test:docker:npm-telegram-live- Instala un paquete candidato de OpenClaw en Docker, ejecuta la incorporación del paquete instalado, configura Telegram mediante la CLI instalada y después reutiliza la vía de QA en vivo de Telegram con ese paquete instalado como Gateway del sistema sometido a prueba.
- El contenedor auxiliar solo monta desde el checkout el código fuente del arnés
qa-lab; el paquete instalado controladist,openclaw/plugin-sdky el entorno de ejecución del Plugin incluido, por lo que la vía no mezcla plugins del checkout actual con el paquete sometido a prueba. - El valor predeterminado es
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta; estableceOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzoOPENCLAW_CURRENT_PACKAGE_TGZpara probar un tarball local resuelto en lugar de instalarlo desde el registro. - De forma predeterminada, emite mediciones repetidas de RTT en
qa-evidence.jsonconOPENCLAW_NPM_TELEGRAM_RTT_SAMPLES=20. SobrescribeOPENCLAW_NPM_TELEGRAM_RTT_SAMPLES,OPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MSoOPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURESpara ajustar la ejecución.OPENCLAW_NPM_TELEGRAM_RTT_CHECKSacepta una lista separada por comas de identificadores de comprobaciones de QA de Telegram que se deben muestrear; cuando no se establece, la comprobación predeterminada compatible con RTT estelegram-mentioned-message-reply. - Usa las mismas credenciales de Telegram mediante variables de entorno o la misma
fuente de credenciales de Convex que
pnpm openclaw qa telegram. Para la automatización de CI o lanzamientos, estableceOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexjunto conOPENCLAW_QA_CONVEX_SITE_URLy un secreto de rol. SiOPENCLAW_QA_CONVEX_SITE_URLy un secreto de rol de Convex están presentes en CI, el contenedor auxiliar de Docker selecciona Convex automáticamente. - El contenedor auxiliar valida en el host las variables de entorno de credenciales
de Telegram o Convex antes de las tareas de compilación e instalación de Docker.
Establece
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1únicamente cuando estés depurando deliberadamente la configuración previa a las credenciales. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainersobrescribeOPENCLAW_QA_CREDENTIAL_ROLEcompartido solo para esta vía. Cuando se seleccionan credenciales de Convex y no se establece ningún rol, el contenedor auxiliar usacidentro de CI ymaintainerfuera de CI.- GitHub Actions expone esta vía como el flujo de trabajo manual para mantenedores
NPM Telegram Beta E2E. No se ejecuta al fusionar. El flujo de trabajo usa el entornoqa-live-sharedy concesiones de credenciales de CI de Convex.
- GitHub Actions también expone
Package Acceptancepara realizar pruebas de producto complementarias con un paquete candidato. Acepta una referencia de Git, una especificación npm publicada, una URL HTTPS de tarball junto con su SHA-256, una política de URL de confianza o un artefacto tarball procedente de otra ejecución (source=ref|npm|url|trusted-url|artifact); carga el archivo normalizadoopenclaw-current.tgzcomopackage-under-testy después ejecuta el planificador existente de pruebas E2E de Docker con los perfiles de víasmoke,package,product,fullocustom. Establecetelegram_mode=mock-openaiolive-frontierpara ejecutar el flujo de trabajo de QA de Telegram con el mismo artefactopackage-under-test.- Prueba del producto con la versión beta más reciente:
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 prueba con una URL exacta de tarball requiere un resumen y usa la política de seguridad para URL públicas:
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- Los espejos empresariales o privados de tarballs usan una política explícita de fuente de confianza:
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 lee .github/package-trusted-sources.json desde la referencia
de confianza del flujo de trabajo y no acepta credenciales en la URL ni una omisión
de la red privada proporcionada mediante una entrada del flujo de trabajo. Si la
política indicada declara autenticación mediante token de portador, configura el
secreto fijo OPENCLAW_TRUSTED_PACKAGE_TOKEN.
- La prueba mediante artefacto descarga un artefacto tarball de otra ejecución de 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- Empaqueta e instala la compilación actual de OpenClaw en Docker, inicia el Gateway con OpenAI configurado y después habilita los canales/plugins incluidos mediante modificaciones de configuración.
- Verifica que la detección durante la configuración inicial deje ausentes los plugins descargables no configurados, que la primera reparación configurada de doctor instale explícitamente cada Plugin descargable que falte y que un segundo reinicio no ejecute una reparación oculta de dependencias.
- También instala una versión de referencia npm anterior conocida, habilita Telegram
antes de ejecutar
openclaw update --tag <candidate>y verifica que doctor, después de actualizar al candidato, elimine los residuos de dependencias de plugins heredadas sin una reparación posterior a la instalación realizada por el arnés.
-
pnpm test:parallels:npm-update-
Ejecuta la prueba de humo nativa de actualización de la instalación empaquetada en los sistemas invitados de Parallels. Cada plataforma seleccionada instala primero el paquete de referencia solicitado, después ejecuta el comando instalado
openclaw updateen el mismo sistema invitado y verifica la versión instalada, el estado de la actualización, la disponibilidad del Gateway y un turno de agente local. -
Usa
--platform macos,--platform windowso--platform linuxmientras iteras sobre un sistema invitado. Usa--jsonpara obtener la ruta del artefacto de resumen y el estado de cada vía. -
La vía de OpenAI usa
openai/gpt-5.6-lunade forma predeterminada para la prueba del turno de agente en vivo. Pasa--model <provider/model>o estableceOPENCLAW_PARALLELS_OPENAI_MODELpara validar otro modelo de OpenAI. -
Encapsula las ejecuciones locales prolongadas en un tiempo de espera del host para que los bloqueos del transporte de Parallels no consuman el resto del período de pruebas:
bash timeout --foreground 150m pnpm test:parallels:npm-update -- --jsontimeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json -
El script escribe registros anidados de las vías en
/tmp/openclaw-parallels-npm-update.*. Inspeccionawindows-update.log,macos-update.logolinux-update.logantes de asumir que el contenedor auxiliar externo está bloqueado. -
La actualización de Windows puede tardar entre 10 y 15 minutos en las tareas de doctor posteriores a la actualización y en la actualización del paquete en un sistema invitado en frío; el proceso sigue siendo correcto mientras avance el registro de depuración anidado de npm.
-
No ejecutes este contenedor auxiliar agregado en paralelo con las vías individuales de prueba de humo de Parallels para macOS, Windows o Linux. Comparten el estado de la máquina virtual y pueden entrar en conflicto durante la restauración de instantáneas, la publicación de paquetes o el estado del Gateway del sistema invitado.
-
La prueba posterior a la actualización ejecuta la superficie normal de plugins incluidos porque las fachadas de capacidades, como voz, generación de imágenes y comprensión multimedia, se cargan mediante las API del entorno de ejecución incluido, aunque el propio turno del agente solo compruebe una respuesta de texto sencilla.
-
-
pnpm openclaw qa aimock- Inicia únicamente el servidor local del proveedor AIMock para realizar pruebas rápidas directas del protocolo.
-
pnpm openclaw qa matrix- Ejecuta el carril de QA en vivo de Matrix contra un homeserver Tuwunel
desechable respaldado por Docker. Solo está disponible desde el código
fuente; las instalaciones empaquetadas no incluyen
qa-lab. - CLI completa, catálogo de perfiles y escenarios, variables de entorno y estructura de artefactos: QA de Matrix.
- Ejecuta el carril de QA en vivo de Matrix contra un homeserver Tuwunel
desechable respaldado por Docker. Solo está disponible desde el código
fuente; las instalaciones empaquetadas no incluyen
-
pnpm openclaw qa telegram- Ejecuta el carril de QA en vivo de Telegram contra un grupo privado real usando los tokens del bot controlador y del bot del SUT proporcionados mediante variables de entorno.
- Requiere
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENyOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. El id. del grupo debe ser el id. numérico del chat de Telegram. - Admite
--credential-source convexpara usar credenciales compartidas de un grupo común. Usa de forma predeterminada el modo de variables de entorno o estableceOPENCLAW_QA_CREDENTIAL_SOURCE=convexpara habilitar los arrendamientos del grupo común. - Los valores predeterminados cubren la prueba canario, el control por
menciones, el direccionamiento de comandos,
/status, las respuestas mencionadas entre bots y las respuestas de comandos nativos del núcleo. Los valores predeterminados demock-openaitambién cubren regresiones deterministas de cadenas de respuestas y de transmisión del mensaje final de Telegram. Usa--list-scenariospara consultar pruebas opcionales comosession_status. - Finaliza con un código distinto de cero si falla algún escenario. Usa
--allow-failurespara generar artefactos sin un código de salida de error. - Requiere dos bots distintos en el mismo grupo privado y que el bot del SUT tenga un nombre de usuario de Telegram.
- Para una observación estable entre bots, habilita Bot-to-Bot Communication Mode
en
@BotFatherpara ambos bots y asegúrate de que el bot controlador pueda observar el tráfico de bots del grupo. - Escribe un informe de QA de Telegram, un resumen y
qa-evidence.jsonen.artifacts/qa-e2e/.... Los escenarios con respuesta incluyen el RTT desde la solicitud de envío del controlador hasta la respuesta observada del SUT.
Mantis Telegram Live es el contenedor de evidencias para PR de este carril.
Ejecuta la referencia candidata con credenciales de Telegram arrendadas
mediante Convex, representa el paquete redactado de informe y evidencias de
QA en un navegador de escritorio de Crabbox, graba evidencias en MP4, genera
un GIF recortado según el movimiento, carga el paquete de artefactos y
publica evidencias insertadas en el PR mediante la aplicación de GitHub
Mantis cuando se establece pr_number. Los mantenedores pueden iniciarlo
desde la interfaz de Actions mediante Mantis Scenario (scenario_id: telegram-live) o directamente desde un comentario de una solicitud de
incorporación:
@openclaw-mantis telegram@openclaw-mantis telegram scenario=telegram-status-command@openclaw-mantis telegram scenarios=telegram-status-command,telegram-mentioned-message-replyMantis Telegram Desktop Proof es el contenedor agéntico anterior/posterior
de la aplicación nativa Telegram Desktop para obtener pruebas visuales de
PR. Inícialo desde la interfaz de Actions con instructions de formato
libre, mediante Mantis Scenario (scenario_id: telegram-desktop-proof) o desde un comentario de PR:
@openclaw-mantis telegram desktop proofEl agente Mantis lee el PR, determina qué comportamiento visible en Telegram
demuestra el cambio, ejecuta el carril de pruebas de Telegram Desktop para
usuarios reales de Crabbox en las referencias de base y candidata, itera
hasta que los GIF nativos resulten útiles, escribe un manifiesto
motionPreview emparejado y publica la misma tabla de GIF de 2 columnas
mediante la aplicación de GitHub Mantis cuando se establece pr_number.
pnpm openclaw qa mantis telegram-desktop-builder- Arrienda o reutiliza un escritorio Linux de Crabbox, instala la aplicación nativa Telegram Desktop, configura OpenClaw con un token arrendado para el bot de Telegram del SUT, inicia el Gateway y graba evidencias en capturas de pantalla y MP4 desde el escritorio VNC visible.
- El valor predeterminado es
--credential-source convex, por lo que los flujos de trabajo solo necesitan el secreto del intermediario Convex. Usa--credential-source envcon las mismas variablesOPENCLAW_QA_TELEGRAM_*quepnpm openclaw qa telegram. - Telegram Desktop sigue necesitando un inicio de sesión o perfil de
usuario. El token del bot configura únicamente OpenClaw. Usa
--telegram-profile-archive-env <name>para proporcionar un archivo de perfil.tgzen base64, o usa--keep-leasee inicia sesión manualmente una vez mediante VNC. - Escribe
mantis-telegram-desktop-builder-report.md,mantis-telegram-desktop-builder-summary.json,telegram-desktop-builder.pngytelegram-desktop-builder.mp4en el directorio de salida.
Los carriles de transporte en vivo comparten un contrato estándar para
evitar que los nuevos transportes se desvíen; la matriz de cobertura de cada
carril se encuentra en
Resumen de QA: cobertura de transportes en vivo.
qa-channel es el conjunto sintético amplio y no forma parte de esa matriz.
Credenciales compartidas de Telegram mediante Convex (v1)
Cuando se habilita --credential-source convex (o
OPENCLAW_QA_CREDENTIAL_SOURCE=convex) para la QA de transportes en vivo, el
laboratorio de QA adquiere un arrendamiento exclusivo de un grupo respaldado
por Convex, envía Heartbeat para ese arrendamiento mientras se ejecuta el
carril y libera el arrendamiento al cerrarse. El nombre de la sección es
anterior a la compatibilidad con Discord, Slack y WhatsApp; el contrato de
arrendamiento se comparte entre los distintos tipos.
Estructura de referencia del proyecto Convex: qa/convex-credential-broker/
Variables de entorno obligatorias:
OPENCLAW_QA_CONVEX_SITE_URL(por ejemplo,https://your-deployment.convex.site)- Un secreto para el rol seleccionado:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERparamaintainerOPENCLAW_QA_CONVEX_SECRET_CIparaci
- Selección del rol de credenciales:
- CLI:
--credential-role maintainer|ci - Valor predeterminado del entorno:
OPENCLAW_QA_CREDENTIAL_ROLE(de forma predeterminada,cien CI ymaintaineren los demás casos)
- CLI:
Variables de entorno opcionales:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(valor predeterminado:1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(valor predeterminado:30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(valor predeterminado:90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(valor predeterminado:15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(valor predeterminado:/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(id. de seguimiento opcional)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1permite direcciones URL Convex de local loopback conhttp://exclusivamente para desarrollo local.
OPENCLAW_QA_CONVEX_SITE_URL debe usar https:// durante el funcionamiento normal.
Los comandos administrativos de los mantenedores (añadir, eliminar y
enumerar elementos del grupo) requieren específicamente
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER.
Utilidades de la CLI para mantenedores:
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>Usa doctor antes de las ejecuciones en vivo para comprobar la dirección
URL del sitio Convex, los secretos del intermediario, el prefijo del punto
de conexión, el tiempo de espera HTTP y el acceso administrativo y de
enumeración sin imprimir los valores secretos. Usa --json para obtener una
salida legible por máquinas en scripts y utilidades de CI.
Contrato predeterminado del punto de conexión
(OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1).
Las solicitudes se autentican con un encabezado
Authorization: Bearer <role secret>; los cuerpos siguientes omiten dicho
encabezado:
POST /acquire- Solicitud:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Éxito:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Agotado/reintentable:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Solicitud:
POST /payload-chunk- Solicitud:
{ kind, ownerId, actorRole, credentialId, leaseToken, index } - Éxito:
{ status: "ok", index, data }
- Solicitud:
POST /heartbeat- Solicitud:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Éxito:
{ status: "ok" }(o2xxvacío)
- Solicitud:
POST /release- Solicitud:
{ kind, ownerId, actorRole, credentialId, leaseToken } - Éxito:
{ status: "ok" }(o2xxvacío)
- Solicitud:
POST /admin/add(solo con el secreto del mantenedor)- Solicitud:
{ kind, actorId, payload, note?, status? } - Éxito:
{ status: "ok", credential }
- Solicitud:
POST /admin/remove(solo con el secreto del mantenedor)- Solicitud:
{ credentialId, actorId } - Éxito:
{ status: "ok", changed, credential } - Protección contra arrendamientos activos:
{ status: "error", code: "LEASE_ACTIVE", ... }
- Solicitud:
POST /admin/list(solo con el secreto del mantenedor)- Solicitud:
{ kind?, status?, includePayload?, limit? } - Éxito:
{ status: "ok", credentials, count }
- Solicitud:
Estructura de la carga útil para el tipo Telegram:
{ groupId: string, driverToken: string, sutToken: string }groupIddebe ser una cadena con el id. numérico de un chat de Telegram.admin/addvalida esta estructura parakind: "telegram"y rechaza las cargas útiles con formato incorrecto.
Estructura de la carga útil para el tipo de usuario real de Telegram:
{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }groupId,testerUserIdytelegramApiIddeben ser cadenas numéricas.tdlibArchiveSha256ydesktopTdataArchiveSha256deben ser cadenas hexadecimales SHA-256.kind: "telegram-user"está reservado para el flujo de trabajo de pruebas de Telegram Desktop de Mantis. Los carriles genéricos del laboratorio de QA no deben adquirirlo.
Cargas útiles multicanal validadas por el intermediario:
- Discord:
{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string, voiceChannelId?: string } - WhatsApp:
{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }
Los carriles de Slack también pueden arrendar credenciales del grupo, pero la
validación de la carga útil de Slack se encuentra actualmente en el ejecutor
de QA de Slack, no en el intermediario. Usa
{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }
para las filas de Slack.
Añadir un canal a QA
La arquitectura y los nombres de las utilidades de escenarios para los
adaptadores de canales nuevos se encuentran en
Resumen de QA: añadir un canal.
Los requisitos mínimos son: implementar el ejecutor del transporte en la
interfaz compartida del host qa-lab, añadir un adapterFactory para los
escenarios compartidos, declarar qaRunners en el manifiesto del Plugin,
montarlo como openclaw qa <runner> y crear escenarios en qa/scenarios/.
Conjuntos de pruebas (qué se ejecuta y dónde)
Considera los conjuntos como niveles de «realismo creciente» (y también de inestabilidad y coste crecientes).
Pruebas unitarias y de integración (predeterminado)
- Comando:
pnpm test - Configuración: las ejecuciones sin destino específico usan el conjunto de
particiones
vitest.full-*.config.tsy pueden expandir las particiones multiproyecto en configuraciones por proyecto para su programación en paralelo - Archivos: inventarios de pruebas del núcleo y unitarias en
src/**/*.test.ts,packages/**/*.test.tsytest/**/*.test.ts; las pruebas unitarias de la interfaz de usuario se ejecutan en la partición dedicadaunit-ui - Alcance:
- Pruebas unitarias puras
- Pruebas de integración dentro del proceso (autenticación del Gateway, enrutamiento, herramientas, análisis sintáctico y configuración)
- Regresiones deterministas de errores conocidos
- Expectativas:
- Se ejecutan en CI
- No requieren claves reales
- Deben ser rápidas y estables
- Las pruebas del solucionador y del cargador de superficies públicas deben
demostrar el comportamiento general de reserva de
api.jsyruntime-api.jsmediante pequeños accesorios de Plugin generados, no mediante las API del código fuente de Plugins incluidos reales. Las cargas de API de Plugins reales pertenecen a conjuntos de contratos/integración propiedad del Plugin.
Política de dependencias nativas:
- Las instalaciones de pruebas predeterminadas omiten las compilaciones
nativas opcionales de Opus para Discord. La voz de Discord usa el
libopus-wasmincluido y@discordjs/opuspermanece deshabilitado enallowBuildspara que las pruebas locales y los carriles de Testbox no compilen el complemento nativo. - Compara el rendimiento del Opus nativo en el repositorio de pruebas de
rendimiento de
libopus-wasm, no en los ciclos predeterminados de instalación y pruebas de OpenClaw. No establezcas@discordjs/opusentruedentro deallowBuildsde forma predeterminada; eso provoca que ciclos de instalación y pruebas no relacionados compilen código nativo.
Proyectos, particiones y carriles con alcance limitado
- Las ejecuciones no dirigidas de
pnpm testejecutan trece configuraciones de fragmentos más pequeños (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) en lugar de un único proceso nativo gigantesco del proyecto raíz. Esto reduce el pico de RSS en máquinas con carga y evita que el trabajo de respuesta automática o de plugins deje sin recursos a conjuntos de pruebas no relacionados. pnpm test --watchsigue usando el grafo de proyectos nativo devitest.config.tsen la raíz, porque un bucle de observación con múltiples fragmentos no resulta práctico.pnpm test,pnpm test:watchypnpm test:perf:importsdirigen primero los objetivos explícitos de archivos o directorios mediante carriles de ámbito limitado, de modo quepnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsevita pagar el coste de inicio de todo el proyecto raíz.- De forma predeterminada,
pnpm test:changedexpande las rutas de Git modificadas en carriles económicos de ámbito limitado: modificaciones directas de pruebas, archivos*.test.tshermanos, asignaciones explícitas de código fuente y dependientes locales del grafo de importaciones. Las modificaciones de configuración, preparación o paquetes no ejecutan pruebas de forma amplia, salvo que se use explícitamenteOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed. pnpm check:changedes la puerta de comprobación local inteligente habitual para trabajos acotados. Clasifica el diff en núcleo, pruebas del núcleo, extensiones, pruebas de extensiones, aplicaciones, documentación, metadatos de lanzamiento, herramientas de Docker en vivo y herramientas generales; después ejecuta los comandos correspondientes de comprobación de tipos, lint y protección. No ejecuta pruebas de Vitest; para demostrar el funcionamiento mediante pruebas, invoquepnpm test:changedo unpnpm test <target>explícito. Los incrementos de versión que solo afectan a metadatos de lanzamiento ejecutan comprobaciones dirigidas de versión, configuración y dependencias raíz, con una protección que rechaza cambios de paquetes fuera del campo de versión de nivel superior.- Las modificaciones del arnés ACP de Docker en vivo ejecutan comprobaciones específicas: sintaxis del shell para los scripts de autenticación de Docker en vivo y una ejecución de prueba del planificador de Docker en vivo. Los cambios en
package.jsonsolo se incluyen cuando el diff se limita ascripts["test:docker:live-*"]; los cambios de dependencias, exportaciones, versiones y otras superficies del paquete siguen usando las protecciones más amplias. - Las pruebas unitarias con pocas importaciones de agentes, comandos, plugins, auxiliares de respuesta automática,
plugin-sdky áreas similares de utilidades puras se dirigen mediante el carrilunit-fast, que omitetest/setup-openclaw-runtime.ts; los archivos con estado o con un uso intensivo del entorno de ejecución permanecen en los carriles existentes. - Determinados archivos fuente auxiliares de
plugin-sdkycommandstambién asignan las ejecuciones en modo de cambios a pruebas hermanas explícitas en esos carriles ligeros, por lo que las modificaciones de auxiliares evitan volver a ejecutar todo el conjunto pesado de ese directorio. auto-replydispone de grupos específicos para los auxiliares principales de nivel superior, las pruebas de integraciónreply.*de nivel superior y el subárbolsrc/auto-reply/reply/**. La CI divide además el subárbol de respuestas en fragmentos de ejecución de agentes, despacho y enrutamiento de comandos/estado, para evitar que un único grupo con muchas importaciones acapare toda la cola de Node.- La CI normal de PR y de la rama principal omite deliberadamente el barrido por lotes de plugins incluidos y el fragmento
agentic-plugins, reservado para lanzamientos. La Validación Completa de Lanzamiento inicia el flujo de trabajo secundario independientePlugin Prereleasepara esos conjuntos con gran carga de plugins en los candidatos a lanzamiento.
Cobertura del ejecutor integrado
- Cuando cambie las entradas de descubrimiento de herramientas de mensajes o el contexto del entorno de ejecución de Compaction, conserve ambos niveles de cobertura.
- Añada regresiones específicas de auxiliares para los límites puros de enrutamiento y normalización.
- Mantenga en buen estado los conjuntos de integración del ejecutor integrado:
src/agents/embedded-agent-runner/compact.hooks.test.ts,src/agents/embedded-agent-runner/run.overflow-compaction.test.tsysrc/agents/embedded-agent-runner/run.overflow-compaction.loop.test.ts. - Esos conjuntos verifican que los identificadores con ámbito y el comportamiento de Compaction sigan fluyendo
por las rutas reales de
run.ts/compact.ts; las pruebas limitadas a auxiliares no sustituyen adecuadamente esas rutas de integración.
Valores predeterminados del grupo y aislamiento de Vitest
- La configuración base de Vitest usa
threadsde forma predeterminada. - La configuración compartida de Vitest fija
isolate: falsey utiliza el ejecutor sin aislamiento en los proyectos raíz y en las configuraciones de extremo a extremo y en vivo. - El carril de interfaz de usuario raíz conserva su configuración de
jsdomy su optimizador, pero también se ejecuta con el ejecutor compartido sin aislamiento. - Cada fragmento de
pnpm testhereda los mismos valores predeterminados dethreads+isolate: falsede la configuración compartida de Vitest. scripts/run-vitest.mjsañade--no-maglevde forma predeterminada a los procesos secundarios de Node de Vitest para reducir la actividad repetida de compilación de V8 durante ejecuciones locales grandes. EstablezcaOPENCLAW_VITEST_ENABLE_MAGLEV=1para comparar con el comportamiento estándar de V8.scripts/run-vitest.mjsfinaliza las ejecuciones explícitas de Vitest sin observación tras 5 minutos sin salida estándar ni salida de error. EstablezcaOPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=0para desactivar el supervisor durante una investigación intencionadamente silenciosa.
Iteración local rápida
pnpm changed:lanesmuestra qué carriles arquitectónicos activa un diff.- El hook previo al commit solo aplica formato. Vuelve a preparar los archivos formateados y no ejecuta lint, comprobaciones de tipos ni pruebas.
- Ejecute
pnpm check:changedexplícitamente antes de entregar o enviar los cambios cuando necesite la puerta de comprobación local inteligente. - De forma predeterminada,
pnpm test:changedse dirige mediante carriles económicos de ámbito limitado. UseOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedsolo cuando el agente determine que una modificación del arnés, la configuración, el paquete o el contrato realmente necesita una cobertura de Vitest más amplia. pnpm test:maxypnpm test:changed:maxmantienen el mismo comportamiento de enrutamiento, pero con un límite superior de procesos de trabajo.- El escalado automático de procesos de trabajo locales es deliberadamente conservador y se reduce cuando la carga media del host ya es alta, para que varias ejecuciones simultáneas de Vitest causen menos perjuicios de forma predeterminada.
- La configuración base de Vitest marca los proyectos y archivos de configuración como
forceRerunTriggers, de modo que las repeticiones de ejecución en modo de cambios sigan siendo correctas cuando cambia el cableado de las pruebas. - La configuración mantiene
OPENCLAW_VITEST_FS_MODULE_CACHEhabilitado en los hosts compatibles; establezcaOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/pathpara usar una ubicación de caché explícita para la elaboración directa de perfiles.
Depuración del rendimiento
pnpm test:perf:importshabilita los informes de duración de las importaciones de Vitest junto con el desglose de importaciones.pnpm test:perf:imports:changedlimita la misma vista de elaboración de perfiles a los archivos modificados desdeorigin/main.- Los datos temporales de los fragmentos se escriben en
.artifacts/vitest-shard-timings.json. Las ejecuciones de configuraciones completas usan la ruta de configuración como clave; los fragmentos de CI con patrones de inclusión añaden el nombre del fragmento para poder realizar el seguimiento por separado de los fragmentos filtrados. - Cuando una prueba con alta carga aún dedica la mayor parte del tiempo a las importaciones iniciales,
mantenga las dependencias pesadas tras una interfaz local y acotada
*.runtime.tsy simule directamente esa interfaz, en lugar de importar profundamente auxiliares del entorno de ejecución solo para pasarlos mediantevi.mock(...). pnpm test:perf:changed:bench -- --ref <git-ref>compara eltest:changedenrutado con la ruta nativa del proyecto raíz para ese diff confirmado e imprime el tiempo transcurrido y el RSS máximo en macOS.pnpm test:perf:changed:bench -- --worktreemide el rendimiento del árbol de trabajo actual con cambios, dirigiendo la lista de archivos modificados mediantescripts/test-projects.mjsy la configuración raíz de Vitest.pnpm test:perf:profile:mainescribe un perfil de CPU del hilo principal para los costes de inicio y transformación de Vitest/Vite.pnpm test:perf:profile:runnerescribe perfiles de CPU y memoria dinámica del ejecutor para el conjunto unitario con el paralelismo de archivos deshabilitado.
Estabilidad (Gateway)
- Comando:
pnpm test:stability:gateway - Configuración:
test/vitest/vitest.gateway.config.ts,test/vitest/vitest.logging.config.tsytest/vitest/vitest.infra.config.ts, cada una forzada a un proceso de trabajo - Ámbito:
- Inicia un Gateway real de local loopback con los diagnósticos habilitados de forma predeterminada
- Genera actividad sintética de mensajes, memoria y cargas útiles grandes del Gateway mediante la ruta de eventos de diagnóstico
- Consulta
diagnostics.stabilitymediante el RPC de WebSocket del Gateway - Cubre los auxiliares de persistencia del paquete de estabilidad de diagnóstico
- Comprueba que el registrador permanezca acotado, que las muestras sintéticas de RSS se mantengan por debajo del presupuesto de presión y que las profundidades de las colas por sesión vuelvan a cero
- Expectativas:
- Apto para CI y sin claves
- Carril acotado para el seguimiento de regresiones de estabilidad, no un sustituto del conjunto completo del Gateway
E2E (agregado del repositorio)
- Comando:
pnpm test:e2e - Ámbito:
- Ejecuta el carril E2E de prueba de humo del Gateway
- Ejecuta el carril E2E de navegador de la interfaz de control con simulaciones
- Expectativas:
- Apto para CI y sin claves
- Requiere que Chromium de Playwright esté instalado
E2E (prueba de humo del Gateway)
- Comando:
pnpm test:e2e:gateway - Configuración:
test/vitest/vitest.e2e.config.ts - Archivos:
src/**/*.e2e.test.ts,test/**/*.e2e.test.tsy las pruebas E2E de plugins incluidos enextensions/ - Valores predeterminados del entorno de ejecución:
- Usa
threadsde Vitest conisolate: false, igual que el resto del repositorio. - Usa procesos de trabajo adaptativos (CI: hasta 2; local: 1 de forma predeterminada).
- Se ejecuta en modo silencioso de forma predeterminada para reducir el coste de E/S de la consola.
- Usa
- Modificaciones útiles:
OPENCLAW_E2E_WORKERS=<n>para forzar el número de procesos de trabajo (con un límite de 16).OPENCLAW_E2E_VERBOSE=1para volver a habilitar la salida detallada de la consola.
- Ámbito:
- Comportamiento integral del Gateway con varias instancias
- Superficies WebSocket/HTTP, emparejamiento de nodos y operaciones de red más pesadas
- Expectativas:
- Se ejecuta en CI (cuando está habilitado en la canalización)
- No requiere claves reales
- Tiene más componentes móviles que las pruebas unitarias (puede ser más lento)
E2E (navegador simulado de la interfaz de control)
- Comando:
pnpm test:ui:e2e - Configuración:
test/vitest/vitest.ui-e2e.config.ts - Archivos:
ui/src/**/*.e2e.test.ts - Ámbito:
- Inicia la interfaz de control de Vite
- Controla una página real de Chromium mediante Playwright
- Sustituye el WebSocket del Gateway por simulaciones deterministas dentro del navegador
- Expectativas:
- Se ejecuta en CI como parte de
pnpm test:e2e - No requiere un Gateway real, agentes ni claves de proveedores
- La dependencia del navegador debe estar presente (
pnpm --dir ui exec playwright install chromium)
- Se ejecuta en CI como parte de
E2E: prueba de humo del backend de OpenShell
- Comando:
pnpm test:e2e:openshell - Archivo:
extensions/openshell/src/backend.e2e.test.ts - Ámbito:
- Reutiliza un Gateway local activo de OpenShell
- Crea un entorno aislado a partir de un Dockerfile local temporal
- Ejercita el backend de OpenShell de OpenClaw mediante un
sandbox ssh-configreal y la ejecución por SSH - Verifica el comportamiento del sistema de archivos canónico remoto mediante el puente de sistema de archivos del entorno aislado
- Expectativas:
- Solo mediante activación explícita; no forma parte de la ejecución predeterminada de
pnpm test:e2e - Requiere una CLI
openshelllocal y un daemon de Docker operativo - Requiere un Gateway local activo de OpenShell y su fuente de configuración
- Usa valores aislados de
HOME/XDG_CONFIG_HOMEy después destruye el entorno aislado de prueba
- Solo mediante activación explícita; no forma parte de la ejecución predeterminada de
- Modificaciones útiles:
OPENCLAW_E2E_OPENSHELL=1para habilitar la prueba al ejecutar manualmente el conjunto E2E más amplioOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshellpara señalar un binario de CLI o script contenedor no predeterminadoOPENCLAW_E2E_OPENSHELL_CONFIG_HOME=/path/to/configpara exponer la configuración registrada del Gateway a la prueba aisladaOPENCLAW_E2E_OPENSHELL_HOST_IP=172.18.0.1para sustituir la IP del Gateway de Docker que utiliza el accesorio de política del host
En vivo (proveedores reales + modelos reales)
- Comando:
pnpm test:live - Configuración:
test/vitest/vitest.live.config.ts - Archivos:
src/**/*.live.test.ts,test/**/*.live.test.tsy pruebas en vivo de plugins incluidos enextensions/ - Valor predeterminado: habilitado por
pnpm test:live(estableceOPENCLAW_LIVE_TEST=1) - Alcance:
- «¿Este proveedor/modelo funciona realmente hoy con credenciales reales?»
- Detectar cambios en el formato del proveedor, particularidades de las llamadas a herramientas, problemas de autenticación y comportamiento de los límites de frecuencia
- Expectativas:
- Por diseño, no es estable en CI (redes reales, políticas reales de los proveedores, cuotas, interrupciones)
- Cuesta dinero o consume límites de frecuencia
- Es preferible ejecutar subconjuntos acotados en lugar de «todo»
- Las ejecuciones en vivo usan claves de API ya exportadas y perfiles de autenticación preparados.
- De forma predeterminada, las ejecuciones en vivo siguen aislando
HOMEy copian el material de configuración/autenticación en un directorio personal temporal de pruebas, para que los recursos de pruebas unitarias no puedan modificar el directorio real~/.openclaw. - Establezca
OPENCLAW_LIVE_USE_REAL_HOME=1solo cuando necesite deliberadamente que las pruebas en vivo usen su directorio personal real. pnpm test:liveusa de forma predeterminada un modo más silencioso: conserva la salida de progreso[live] ...y silencia los registros de arranque del Gateway y los mensajes de Bonjour. EstablezcaOPENCLAW_LIVE_TEST_QUIET=0si desea recuperar todos los registros de inicio.- Rotación de claves de API (específica del proveedor): establezca
*_API_KEYScon formato separado por comas o punto y coma, o*_API_KEY_1,*_API_KEY_2(por ejemplo,OPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS), o una sobrescritura por ejecución en vivo medianteOPENCLAW_LIVE_*_KEY; las pruebas vuelven a intentarlo cuando reciben respuestas de límite de frecuencia. - Salida de progreso/Heartbeat:
- Los conjuntos de pruebas en vivo emiten líneas de progreso en stderr, para que las llamadas prolongadas a proveedores muestren actividad incluso cuando la captura de consola de Vitest está en silencio.
test/vitest/vitest.live.config.tsdeshabilita la interceptación de consola de Vitest, para que las líneas de progreso del proveedor/Gateway se transmitan inmediatamente durante las ejecuciones en vivo.- Ajuste los Heartbeat de modelos directos con
OPENCLAW_LIVE_HEARTBEAT_MS. - Ajuste los Heartbeat del Gateway/sondeo con
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
¿Qué conjunto de pruebas debo ejecutar?
Use esta tabla de decisiones:
- Al editar lógica/pruebas: ejecute
pnpm test(ypnpm test:coveragesi cambió muchas cosas) - Al modificar la red del Gateway, el protocolo WS o el emparejamiento: añada
pnpm test:e2e - Al depurar «mi bot no funciona», fallos específicos de un proveedor o llamadas a herramientas: ejecute un
pnpm test:liveacotado
Pruebas en vivo (con acceso a la red)
Para la matriz de modelos en vivo, las pruebas rápidas de backends de CLI, las pruebas rápidas de ACP, el entorno de pruebas del servidor de aplicaciones de Codex y todas las pruebas en vivo de proveedores multimedia (Deepgram, BytePlus, ComfyUI, imagen, música, vídeo y entorno multimedia), además de la gestión de credenciales para ejecuciones en vivo:
- consulte Pruebas de conjuntos en vivo. Para la lista de comprobación específica de actualizaciones y validación de plugins, consulte Pruebas de actualizaciones y plugins.
Ejecutores de Docker (comprobaciones opcionales de «funciona en Linux»)
Estos ejecutores de Docker se dividen en dos grupos:
- Ejecutores de modelos en vivo:
test:docker:live-modelsytest:docker:live-gatewayejecutan únicamente el archivo en vivo correspondiente a sus claves de perfil dentro de la imagen de Docker del repositorio (src/agents/models.profiles.live.test.tsysrc/gateway/gateway-models.profiles.live.test.ts), montando el directorio de configuración local, el espacio de trabajo y el archivo opcional de variables de entorno del perfil. Los puntos de entrada locales correspondientes sontest:live:models-profilesytest:live:gateway-profiles. - Los ejecutores en vivo de Docker mantienen sus propios límites prácticos cuando es necesario:
test:docker:live-modelsusa de forma predeterminada el conjunto seleccionado de alta señal compatible, ytest:docker:live-gatewayusa de forma predeterminadaOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000yOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. EstablezcaOPENCLAW_LIVE_MAX_MODELSo las variables de entorno del Gateway cuando desee explícitamente un límite menor o un análisis más amplio. test:docker:allcompila una vez la imagen de Docker en vivo mediantetest:docker:live-build, empaqueta OpenClaw una vez como archivo tar de npm mediantescripts/package-openclaw-for-docker.mjsy, después, compila/reutiliza dos imágenes descripts/e2e/Dockerfile. La imagen básica es únicamente el ejecutor de Node/Git para las vías de instalación, actualización y dependencias de plugins; esas vías montan el archivo tar precompilado. La imagen funcional instala el mismo archivo tar en/apppara las vías de funcionalidad de la aplicación compilada. Las definiciones de vías de Docker se encuentran enscripts/lib/docker-e2e-scenarios.mjs; la lógica de planificación se encuentra enscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsejecuta el plan seleccionado. El conjunto usa un planificador local ponderado:OPENCLAW_DOCKER_ALL_PARALLELISMcontrola los espacios de procesos, mientras que los límites de recursos evitan que todas las vías pesadas —en vivo, de instalación de npm y de varios servicios— se inicien a la vez. Si una sola vía es más pesada que los límites activos, el planificador puede iniciarla cuando el grupo está vacío y mantenerla en ejecución de forma exclusiva hasta que vuelva a haber capacidad disponible. Los valores predeterminados son 10 espacios,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=5yOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; ajusteOPENCLAW_DOCKER_ALL_WEIGHT_LIMIToOPENCLAW_DOCKER_ALL_DOCKER_LIMIT(y otras sobrescriturasOPENCLAW_DOCKER_ALL_<RESOURCE>_LIMIT) solo cuando el host de Docker tenga más capacidad disponible. De forma predeterminada, el ejecutor realiza una comprobación previa de Docker, elimina los contenedores E2E obsoletos de OpenClaw, imprime el estado cada 30 segundos, almacena los tiempos de las vías correctas en.artifacts/docker-tests/lane-timings.jsony usa esos tiempos para iniciar primero las vías más largas en ejecuciones posteriores. UseOPENCLAW_DOCKER_ALL_DRY_RUN=1para imprimir el manifiesto ponderado de vías sin compilar ni ejecutar Docker, onode scripts/test-docker-all.mjs --plan-jsonpara imprimir el plan de CI de las vías seleccionadas, las necesidades de paquetes/imágenes y las credenciales.Package Acceptancees la validación de paquetes nativa de GitHub para «¿funciona como producto este archivo tar instalable?». Resuelve un paquete candidato desdesource=npm,source=ref,source=url,source=trusted-urlosource=artifact, lo carga comopackage-under-testy, después, ejecuta las vías E2E reutilizables de Docker con ese archivo tar exacto, en lugar de volver a empaquetar la referencia seleccionada. Los perfiles se ordenan por amplitud:smoke,package,productyfull(además decustompara una lista explícita de vías). Consulte Pruebas de actualizaciones y plugins para conocer el contrato de paquetes/actualizaciones/plugins, la matriz de supervivencia de actualizaciones publicadas, los valores predeterminados de las versiones y la clasificación de fallos.- Las comprobaciones de compilación y publicación ejecutan
scripts/check-cli-bootstrap-imports.mjsdespués de tsdown. La protección recorre el grafo compilado estático desdedist/entry.jsydist/cli/run-main.js, y falla si ese grafo de arranque previo al despacho importa estáticamente cualquier paquete externo (Commander, interfaces de solicitud, undici, registro y dependencias similares que sobrecarguen el inicio cuentan) antes del despacho del comando; también limita a 70 KB el fragmento de ejecución incluido del Gateway y rechaza las importaciones estáticas de rutas frías conocidas del Gateway (control-ui-assets,diagnostic-stability-bundle,onboard-helpers,process-respawn,restart-sentinel,server-close,server-reload-handlers) desde ese fragmento. Por separado,scripts/release-check.tsrealiza pruebas rápidas de la CLI empaquetada con--help,onboard --help,doctor --help,status --json --timeout 1,config schemaymodels list --provider openai. - La compatibilidad heredada de Package Acceptance está limitada a
2026.4.25(incluido2026.4.25-beta.*). Hasta ese límite, el entorno de pruebas tolera únicamente deficiencias de metadatos de paquetes publicados: entradas omitidas del inventario privado de control de calidad, ausencia degateway install --wrapper, archivos de parche ausentes en el recurso de Git derivado del archivo tar, ausencia deupdate.channelpersistente, ubicaciones heredadas de registros de instalación de plugins, ausencia de persistencia de registros de instalación del catálogo y migración de metadatos de configuración duranteplugins update. Para paquetes posteriores a2026.4.25, esas rutas producen fallos estrictos. - Ejecutores de pruebas rápidas de contenedores:
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-matrixytest:docker:config-reloadarrancan uno o más contenedores reales y verifican rutas de integración de nivel superior. - Las vías E2E de Docker/Bash que instalan el archivo tar empaquetado de OpenClaw mediante
scripts/lib/openclaw-e2e-instance.shlimitannpm installaOPENCLAW_E2E_NPM_INSTALL_TIMEOUT(valor predeterminado:600s; establezca0para deshabilitar el contenedor durante la depuración).
Los ejecutores de Docker de modelos en vivo también montan mediante enlace únicamente los directorios personales de autenticación de CLI necesarios (o todos los compatibles cuando la ejecución no está acotada) y, después, los copian en el directorio personal del contenedor antes de la ejecución, para que OAuth de CLI externas pueda renovar los tokens sin modificar el almacén de autenticación del host:
-
Modelos directos:
pnpm test:docker:live-models(script:scripts/test-live-models-docker.sh) -
Prueba rápida de enlace de ACP:
pnpm test:docker:live-acp-bind(script:scripts/test-live-acp-bind-docker.sh; cubre Claude, Codex y Gemini de forma predeterminada, con cobertura estricta de Droid/OpenCode mediantepnpm test:docker:live-acp-bind:droidypnpm test:docker:live-acp-bind:opencode) -
Prueba rápida del backend de CLI:
pnpm test:docker:live-cli-backend(script:scripts/test-live-cli-backend-docker.sh) -
Prueba rápida del entorno del servidor de aplicaciones de Codex:
pnpm test:docker:live-codex-harness(script:scripts/test-live-codex-harness-docker.sh) -
Gateway + agente de desarrollo:
pnpm test:docker:live-gateway(script:scripts/test-live-gateway-models-docker.sh) -
Pruebas rápidas de observabilidad:
pnpm qa:otel:smoke,pnpm qa:prometheus:smokeypnpm qa:observability:smokeson vías privadas de control de calidad para el código fuente extraído. Deliberadamente no forman parte de las vías de publicación de paquetes en Docker porque el archivo tar de npm omite el laboratorio de control de calidad. -
Prueba rápida en vivo de Open WebUI:
pnpm test:docker:openwebui(script:scripts/e2e/openwebui-docker.sh) -
Asistente de incorporación (TTY, estructura completa):
pnpm test:docker:onboard(script:scripts/e2e/onboard-docker.sh) -
Prueba rápida de incorporación/canal/agente con archivo tar de npm:
pnpm test:docker:npm-onboard-channel-agentinstala globalmente en Docker el archivo tar empaquetado de OpenClaw, configura OpenAI mediante una incorporación con referencia de variable de entorno y Telegram de forma predeterminada, ejecuta doctor y realiza un turno de agente de OpenAI simulado. Reutilice un archivo tar precompilado conOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz, omita la recompilación del host conOPENCLAW_NPM_ONBOARD_HOST_BUILD=0o cambie de canal conOPENCLAW_NPM_ONBOARD_CHANNEL=discordoOPENCLAW_NPM_ONBOARD_CHANNEL=slack. -
Prueba de humo del recorrido de usuario de la versión:
pnpm test:docker:release-user-journeyinstala globalmente el tarball empaquetado de OpenClaw en un directorio personal limpio de Docker, ejecuta la incorporación, configura un proveedor simulado de OpenAI, ejecuta un turno del agente, instala y desinstala plugins externos, configura ClickClack con un fixture local, verifica la mensajería saliente y entrante, reinicia el Gateway y ejecuta doctor. -
Prueba de humo de incorporación tipada de la versión:
pnpm test:docker:release-typed-onboardinginstala el tarball empaquetado, controlaopenclaw onboardmediante una TTY real, configura OpenAI como proveedor con referencia a una variable de entorno, verifica que no se conserve la clave sin procesar y ejecuta un turno simulado del agente. -
Prueba de humo de medios y memoria de la versión:
pnpm test:docker:release-media-memoryinstala el tarball empaquetado, verifica la comprensión de imágenes a partir de un archivo PNG adjunto, la salida de generación de imágenes compatible con OpenAI, la recuperación mediante búsqueda en memoria y la conservación de esa recuperación tras reiniciar el Gateway. -
Prueba de humo del recorrido de usuario de actualización de la versión:
pnpm test:docker:release-upgrade-user-journeyinstala de forma predeterminada la versión base publicada más reciente que sea anterior al tarball candidato, configura el estado del proveedor, el plugin y ClickClack en el paquete publicado, actualiza al tarball candidato y vuelve a ejecutar el recorrido principal de agente, plugin y canal. Si no existe una versión base publicada anterior, reutiliza la versión candidata. Anule la versión base conOPENCLAW_RELEASE_UPGRADE_BASELINE_SPEC=openclaw@<version>. -
Prueba de humo del marketplace de plugins de la versión:
pnpm test:docker:release-plugin-marketplaceinstala desde un marketplace de fixtures local, actualiza el plugin instalado, lo desinstala y verifica que la CLI del plugin desaparezca y que se depuren los metadatos de instalación. -
Prueba de humo de instalación de Skills:
pnpm test:docker:skill-installinstala globalmente el tarball empaquetado de OpenClaw en Docker, desactiva en la configuración las instalaciones desde archivos subidos, obtiene mediante una búsqueda el slug actual de una Skill activa de ClawHub, la instala conopenclaw skills instally verifica la Skill instalada junto con los metadatos de origen y bloqueo de.clawhub. -
Prueba de humo de cambio del canal de actualización:
pnpm test:docker:update-channel-switchinstala globalmente el tarball empaquetado de OpenClaw en Docker, cambia del paquetestablea la versión gitdev, verifica el canal conservado y el funcionamiento del plugin tras la actualización, vuelve después al paquetestabley comprueba el estado de actualización. -
Prueba de humo de supervivencia a la actualización:
pnpm test:docker:upgrade-survivorinstala el tarball empaquetado de OpenClaw sobre un fixture sucio de un usuario antiguo que contiene agentes, configuración de canales, listas de plugins permitidos, estado obsoleto de dependencias de plugins y archivos existentes de espacios de trabajo y sesiones. Ejecuta la actualización del paquete y doctor en modo no interactivo sin claves activas de proveedores ni canales; después inicia un Gateway en local loopback y comprueba la conservación de la configuración y el estado, así como los límites de tiempo de inicio y estado. -
Prueba de humo publicada de supervivencia a la actualización:
pnpm test:docker:published-upgrade-survivorinstalaopenclaw@latestde forma predeterminada, crea archivos realistas de un usuario existente, configura esa versión base con una receta de comandos integrada, valida la configuración resultante, actualiza esa instalación publicada al tarball candidato, ejecuta doctor en modo no interactivo, escribe.artifacts/upgrade-survivor/summary.json, inicia después un Gateway en local loopback y comprueba las intenciones configuradas, la conservación del estado, el inicio,/healthz,/readyzy los límites de tiempo del estado RPC. Anule una versión base conOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, solicite al planificador agregado que expanda versiones base locales exactas medianteOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS, por ejemploopenclaw@2026.5.2 openclaw@2026.4.23 openclaw@2026.4.15, y expanda fixtures con forma de incidencias medianteOPENCLAW_UPGRADE_SURVIVOR_SCENARIOS, por ejemploreported-issues; el conjunto de incidencias notificadas incluyeconfigured-plugin-installspara reparar automáticamente la instalación de plugins externos de OpenClaw. La aceptación de paquetes los expone comopublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesypublished_upgrade_survivor_scenarios, resuelve tokens de metaversión base comolast-stable-4oall-since-2026.4.23, y la validación completa de la versión expande la comprobación del paquete de estabilidad prolongada de la versión alast-stable-4 2026.4.23 2026.5.2 2026.4.15, además dereported-issues. -
Prueba de humo del contexto de ejecución de sesiones:
pnpm test:docker:session-runtime-contextverifica la conservación en la transcripción del contexto de ejecución oculto, además de la reparación mediante doctor de las ramas duplicadas afectadas de reescritura de prompts. -
Prueba de humo de instalación global con Bun:
bash scripts/e2e/bun-global-install-smoke.shempaqueta el árbol actual, lo instala mediantebun install -gen un directorio personal aislado y verifica queopenclaw infer image providers --jsondevuelva los proveedores de imágenes incluidos en lugar de quedarse bloqueado. Reutilice un tarball precompilado medianteOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz, omita la compilación en el host medianteOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0o copiedist/desde una imagen de Docker compilada medianteOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local. -
Prueba de humo del instalador en Docker:
bash scripts/test-install-sh-docker.shcomparte una caché de npm entre sus contenedores de root, actualización y npm directo. La prueba de humo de actualización utiliza de forma predeterminadalatestde npm como versión base estable antes de actualizar al tarball candidato. Anúlela localmente medianteOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22o mediante la entradaupdate_baseline_versiondel flujo de trabajo Install Smoke en GitHub. Las comprobaciones del instalador sin root mantienen una caché de npm aislada para que las entradas de caché propiedad de root no oculten el comportamiento de instalación local del usuario. EstablezcaOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cachepara reutilizar la caché de root, actualización y npm directo entre ejecuciones locales. -
La CI de Install Smoke omite la actualización global duplicada mediante npm directo con
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1; ejecute el script localmente sin esa variable de entorno cuando necesite cobertura directa denpm install -g. -
Prueba de humo de la CLI para eliminar agentes con un espacio de trabajo compartido:
pnpm test:docker:agents-delete-shared-workspace(script:scripts/e2e/agents-delete-shared-workspace-docker.sh) compila de forma predeterminada la imagen del Dockerfile raíz, crea dos agentes con un espacio de trabajo en un directorio personal de contenedor aislado, ejecutaagents delete --jsony verifica que el JSON sea válido y que se conserve el comportamiento del espacio de trabajo. Reutilice la imagen de la prueba de instalación medianteOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1. -
Redes del Gateway y ciclo de vida del host:
pnpm test:docker:gateway-network(script:scripts/e2e/gateway-network-docker.sh) conserva la prueba de humo de autenticación y estado de WebSocket en una LAN con dos contenedores; después utiliza HTTP de administración en local loopback para demostrar el bloqueo de preparación, el acceso de control conservado, la recuperación mediante reanudación y una detención y un inicio preparados dentro del mismo contenedor. La comprobación del reinicio debe finalizar antes de que venza el arrendamiento original, verifica que el estado de suspensión sea local al proceso mientras se conservan la configuración persistente del Gateway y la identidad del contenedor, y emite un JSON legible por máquinas con los tiempos de las fases. -
Prueba de humo de instantáneas CDP del navegador:
pnpm test:docker:browser-cdp-snapshot(script:scripts/e2e/browser-cdp-snapshot-docker.sh) compila la imagen E2E del código fuente junto con una capa de Chromium, inicia Chromium con CDP sin procesar, ejecutabrowser doctor --deepy verifica que las instantáneas de roles de CDP incluyan las URL de los enlaces, los elementos interactivos promovidos por el cursor, las referencias de iframes y los metadatos de los marcos. -
Regresión de razonamiento mínimo de
web_searchen OpenAI Responses:pnpm test:docker:openai-web-search-minimal(script:scripts/e2e/openai-web-search-minimal-docker.sh) ejecuta un servidor simulado de OpenAI mediante el Gateway, verifica queweb_searchelevereasoning.effortdeminimalalow, fuerza después el rechazo del esquema por parte del proveedor y comprueba que los detalles sin procesar aparezcan en los registros del Gateway. -
Puente de canales MCP (Gateway inicializado + puente stdio + prueba de humo de marcos de notificación sin procesar de Claude):
pnpm test:docker:mcp-channels(script:scripts/e2e/mcp-channels-docker.sh) -
Herramientas MCP del paquete de OpenClaw (servidor MCP stdio real + prueba de humo de permisos y denegaciones con un perfil de OpenClaw integrado):
pnpm test:docker:agent-bundle-mcp-tools(script:scripts/e2e/agent-bundle-mcp-tools-docker.sh) -
Limpieza de MCP de Cron y subagentes (Gateway real + finalización de procesos secundarios MCP stdio tras ejecuciones aisladas de Cron y ejecuciones únicas de subagentes):
pnpm test:docker:cron-mcp-cleanup(script:scripts/e2e/cron-mcp-cleanup-docker.sh) -
Plugins (prueba de humo de instalación y actualización para rutas locales,
file:, registro de npm con dependencias elevadas, metadatos mal formados de paquetes npm, referencias móviles de git, conjunto completo de ClawHub, actualizaciones del marketplace y activación e inspección de paquetes de Claude):pnpm test:docker:plugins(script:scripts/e2e/plugins-docker.sh) EstablezcaOPENCLAW_PLUGINS_E2E_CLAWHUB=0para omitir el bloque de ClawHub o anule el par predeterminado de paquete y entorno de ejecución del conjunto completo medianteOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECyOPENCLAW_PLUGINS_E2E_CLAWHUB_ID. SinOPENCLAW_CLAWHUB_URL/CLAWHUB_URL, la prueba utiliza un servidor de fixtures local y hermético de ClawHub. -
Prueba de humo de actualización sin cambios de plugins:
pnpm test:docker:plugin-update(script:scripts/e2e/plugin-update-unchanged-docker.sh) -
Prueba de humo de la matriz del ciclo de vida de plugins:
pnpm test:docker:plugin-lifecycle-matrixinstala el tarball empaquetado de OpenClaw en un contenedor básico, instala un plugin de npm, alterna entre activarlo y desactivarlo, lo actualiza y vuelve a una versión anterior mediante un registro local de npm, elimina el código instalado y verifica después que la desinstalación siga eliminando el estado obsoleto mientras registra métricas de RSS y CPU para cada fase del ciclo de vida. -
Prueba de humo de metadatos de recarga de configuración:
pnpm test:docker:config-reload(script:scripts/e2e/config-reload-source-docker.sh) -
Plugins:
pnpm test:docker:pluginscubre las pruebas de humo de instalación y actualización para rutas locales,file:, registros de npm con dependencias elevadas, referencias móviles de git, fixtures de ClawHub, actualizaciones del marketplace y activación e inspección de paquetes de Claude.pnpm test:docker:plugin-updatecubre el comportamiento de las actualizaciones sin cambios de los plugins instalados.pnpm test:docker:plugin-lifecycle-matrixcubre la instalación, activación, desactivación, actualización, reversión a una versión anterior y desinstalación con código ausente de plugins de npm, con seguimiento de recursos.
Para precompilar y reutilizar manualmente la imagen funcional compartida:
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-channelsLas anulaciones de imágenes específicas de cada suite, como OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE, siguen teniendo prioridad cuando se establecen. Cuando OPENCLAW_SKIP_DOCKER_BUILD=1 apunta a una imagen compartida remota, los scripts la descargan si todavía no está disponible localmente. Las pruebas de QR y del instalador en Docker conservan sus propios Dockerfiles porque validan el comportamiento del paquete y la instalación, en lugar del entorno de ejecución compartido de la aplicación compilada.
Los ejecutores de Docker con modelos activos también montan el checkout actual en modo de solo lectura
y lo preparan en un directorio de trabajo temporal dentro del contenedor. Esto mantiene ligera la
imagen del entorno de ejecución y, al mismo tiempo, permite ejecutar Vitest con su código fuente y
configuración locales exactos. El paso de preparación omite las cachés grandes que solo existen localmente y los
resultados de compilación de aplicaciones, como .pnpm-store, .worktrees, __openclaw_vitest__ y
los directorios locales de la aplicación .build o de resultados de Gradle, para que las ejecuciones activas de Docker no
dediquen minutos a copiar artefactos específicos de la máquina. También establecen
OPENCLAW_SKIP_CHANNELS=1 para que las sondas activas del Gateway no inicien procesos reales de los canales
Telegram/Discord/etc. dentro del contenedor.
test:docker:live-models sigue ejecutando pnpm test:live, por lo que también debe pasar
OPENCLAW_LIVE_GATEWAY_* cuando necesite limitar o excluir la cobertura activa del Gateway
de esa vía de Docker.
test:docker:openwebui es una prueba de humo de compatibilidad de nivel superior: inicia un
contenedor del Gateway de OpenClaw con los endpoints HTTP compatibles con OpenAI habilitados,
inicia un contenedor de Open WebUI con una versión fijada conectado a ese Gateway, inicia sesión mediante
Open WebUI, verifica que /api/models exponga openclaw/default y, a continuación, envía una
solicitud de chat real mediante el proxy /api/chat/completions de Open WebUI. Establezca
OPENWEBUI_SMOKE_MODE=models para las comprobaciones de CI de la ruta de lanzamiento que deban detenerse
después del inicio de sesión en Open WebUI y la detección de modelos, sin esperar a que se complete
una respuesta de un modelo en vivo. La primera ejecución puede ser notablemente más lenta porque Docker quizá tenga que
descargar la imagen de Open WebUI y Open WebUI quizá deba completar su propia
configuración de arranque en frío. Esta vía requiere una clave de modelo en vivo utilizable, proporcionada mediante
el entorno del proceso, perfiles de autenticación preparados o un
OPENCLAW_PROFILE_FILE explícito. Las ejecuciones correctas imprimen una pequeña carga JSON como
{ "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels es intencionadamente determinista y no necesita una
cuenta real de Telegram, Discord ni iMessage. Arranca un contenedor del Gateway
con datos iniciales, inicia un segundo contenedor que ejecuta openclaw mcp serve y, a continuación,
verifica la detección de conversaciones enrutadas, la lectura de transcripciones, los metadatos de
archivos adjuntos, el comportamiento de la cola de eventos en vivo, el enrutamiento de envíos salientes y las notificaciones
de canales y permisos al estilo de Claude a través del puente MCP stdio real. La
comprobación de notificaciones inspecciona directamente las tramas MCP stdio sin procesar para que la prueba de humo
valide lo que el puente emite realmente, no solo lo que un SDK de cliente específico
muestre por casualidad.
test:docker:agent-bundle-mcp-tools es determinista y no necesita una
clave de modelo en vivo. Compila la imagen Docker del repositorio, inicia un servidor de
prueba MCP stdio real dentro del contenedor, materializa ese servidor mediante el
entorno de ejecución MCP del paquete OpenClaw integrado, ejecuta la herramienta y, a continuación, verifica que
coding y messaging conserven las herramientas bundle-mcp, mientras que minimal y
tools.deny: ["bundle-mcp"] las filtren.
test:docker:cron-mcp-cleanup es determinista y no necesita una clave de
modelo en vivo. Inicia un Gateway con datos iniciales y un servidor de prueba MCP stdio real,
ejecuta un turno de Cron aislado y un turno secundario único de sessions_spawn y, a continuación,
verifica que el proceso secundario MCP finalice después de cada ejecución.
Prueba de humo manual de hilos ACP en lenguaje natural (no para CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Conserve este script para los flujos de regresión y depuración. Puede volver a ser necesario para validar el enrutamiento de hilos ACP, así que no lo elimine.
Variables de entorno útiles:
OPENCLAW_CONFIG_DIR=...(predeterminado:~/.openclaw) montado en/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(predeterminado:~/.openclaw/workspace) montado en/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...se monta y se carga antes de ejecutar las pruebasOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1para verificar únicamente las variables de entorno cargadas desdeOPENCLAW_PROFILE_FILE, mediante directorios temporales de configuración y espacio de trabajo, sin montajes externos de autenticación de la CLIOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(predeterminado:~/.cache/openclaw/docker-cli-tools, salvo que la ejecución ya utilice un directorio de enlace administrado o de CI) montado en/home/node/.npm-globalpara almacenar en caché las instalaciones de herramientas de la CLI dentro de Docker- Los directorios y archivos externos de autenticación de la CLI bajo
$HOMEse montan como de solo lectura bajo/host-auth...y, a continuación, se copian en/home/node/...antes de iniciar las pruebas- Directorios predeterminados (utilizados cuando la ejecución no se limita a proveedores específicos):
.factory,.gemini,.minimax - Archivos predeterminados:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Las ejecuciones limitadas por proveedor montan únicamente los directorios y archivos necesarios deducidos de
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Anule esta selección manualmente con
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=noneo una lista separada por comas comoOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Directorios predeterminados (utilizados cuando la ejecución no se limita a proveedores específicos):
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...para limitar la ejecuciónOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...para filtrar los proveedores dentro del contenedorOPENCLAW_SKIP_DOCKER_BUILD=1para reutilizar una imagenopenclaw:local-liveexistente en repeticiones que no necesiten una nueva compilaciónOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1para garantizar que las credenciales procedan del almacén de perfiles (no del entorno)OPENCLAW_OPENWEBUI_MODEL=...para elegir el modelo que expone el Gateway para la prueba de humo de Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...para sustituir la instrucción de comprobación del nonce utilizada por la prueba de humo de Open WebUIOPENWEBUI_IMAGE=...para sustituir la etiqueta fijada de la imagen de Open WebUI
Comprobación básica de la documentación
Ejecute las comprobaciones de documentación después de editarla: pnpm check:docs.
Ejecute la validación completa de anclas de Mintlify cuando también necesite comprobar los encabezados internos de las páginas: pnpm docs:check-links:anchors.
Regresión sin conexión (segura para CI)
Estas son regresiones de la «canalización real» sin proveedores reales:
- Llamadas a herramientas del Gateway (OpenAI simulado, Gateway y bucle del agente reales):
src/gateway/gateway.test.ts(caso: "runs a mock OpenAI tool call end-to-end via gateway agent loop") - Asistente del Gateway (WS
wizard.start/wizard.next, escribe la configuración y exige autenticación):src/gateway/gateway.test.ts(caso: "runs wizard over ws and writes auth token config")
Evaluaciones de fiabilidad del agente (Skills)
Ya tenemos algunas pruebas seguras para CI que se comportan como «evaluaciones de fiabilidad del agente»:
- Llamadas simuladas a herramientas mediante el Gateway y el bucle del agente reales (
src/gateway/gateway.test.ts). - Flujos integrales del asistente que validan la conexión de sesiones y los efectos de la configuración (
src/gateway/gateway.test.ts).
Lo que todavía falta para Skills (consulte Skills):
- Toma de decisiones: cuando se enumeran Skills en la instrucción, ¿elige el agente la Skill correcta (o evita las irrelevantes)?
- Cumplimiento: ¿lee el agente
SKILL.mdantes de usarla y sigue los pasos y argumentos requeridos? - Contratos de flujo de trabajo: escenarios de varios turnos que verifiquen el orden de las herramientas, la conservación del historial de la sesión y los límites del entorno aislado.
Las evaluaciones futuras deben seguir siendo deterministas en primer lugar:
- Un ejecutor de escenarios que use proveedores simulados para comprobar las llamadas y el orden de las herramientas, las lecturas de archivos de Skills y la conexión de sesiones.
- Un pequeño conjunto de escenarios centrados en Skills (uso frente a omisión, controles e inyección de instrucciones).
- Evaluaciones en vivo opcionales (con habilitación explícita y controladas mediante variables de entorno) solo después de disponer del conjunto seguro para CI.
Pruebas de contrato (estructura de plugins y canales)
Las pruebas de contrato verifican que cada Plugin y canal registrado cumpla
su contrato de interfaz. Recorren todos los plugins detectados y ejecutan un
conjunto de comprobaciones de estructura y comportamiento. La vía unitaria predeterminada pnpm test
omite intencionadamente estos archivos compartidos de interfaces y pruebas de humo; ejecute los comandos
de contrato explícitamente cuando modifique superficies compartidas de canales o proveedores.
Comandos
- Todos los contratos:
pnpm test:contracts - Solo contratos de canales:
pnpm test:contracts:channels - Solo contratos de proveedores:
pnpm test:contracts:plugins
Contratos de canales
Se encuentran en src/channels/plugins/contracts/*.contract.test.ts. Categorías
actuales de nivel superior:
- channel-catalog: metadatos de las entradas del catálogo de canales integrados o del registro
- plugin (respaldado por el registro, fragmentado): estructura básica de registro de plugins
- surfaces-only (respaldado por el registro, fragmentado): comprobaciones de estructura por superficie para
actions,setup,status,outbound,messaging,threading,directoryygateway - session-binding (respaldado por el registro): comportamiento de vinculación de sesiones
- outbound-payload: estructura y normalización de la carga de mensajes
- group-policy (alternativa): aplicación de la política de grupos predeterminada por canal
- threading (respaldado por el registro, fragmentado): gestión de identificadores de hilos
- directory (respaldado por el registro, fragmentado): API de directorio/lista de miembros
- registry y plugins-core.*: registro de plugins de canales, cargador y componentes internos de autorización de escritura de configuración
Los auxiliares del entorno de pruebas para capturar la distribución entrante y las cargas salientes utilizados por estos
conjuntos se exponen internamente mediante src/plugin-sdk/channel-contract-testing.ts
(excluido de npm, no es una subruta pública del SDK); no existe ningún archivo independiente
inbound.contract.test.ts en este directorio.
Contratos de proveedores
Se encuentran en src/plugins/contracts/*.contract.test.ts. Las categorías actuales
incluyen:
- shape: estructura del manifiesto, la API y las exportaciones del entorno de ejecución del Plugin
- plugin-registration (+ paralelo): casos de registro de manifiestos
- package-manifest: requisitos del manifiesto del paquete
- loader: comportamiento de configuración y desmontaje del cargador de plugins
- registry: contenido y búsqueda del registro de contratos de plugins
- providers: comportamiento compartido de los proveedores integrados, además de los proveedores de búsqueda web
- auth-choice: metadatos de elección de autenticación y comportamiento de configuración
- provider-catalog-deprecation: metadatos obsoletos del catálogo de proveedores
- wizard.choice-resolution, wizard.model-picker, wizard.setup-options: contratos del asistente de configuración de proveedores
- embedding-provider, memory-embedding-provider, web-fetch-provider, tts: contratos de proveedores específicos de cada capacidad
- session-actions, session-attachments, session-entry-projection: contratos del estado de sesión propiedad del Plugin
- scheduled-turns: metadatos de turnos programados y límites de marcas de tiempo del Plugin
- host-hooks, run-context-lifecycle, runtime-import-side-effects, runtime-seams: contratos del ciclo de vida del host y del entorno de ejecución del Plugin, y de los límites de importación
- extension-runtime-dependencies: ubicación de las dependencias del entorno de ejecución de las extensiones
Cuándo ejecutarlas
- Después de cambiar las exportaciones o subrutas de
plugin-sdk - Después de añadir o modificar un Plugin de canal o proveedor
- Después de refactorizar el registro o la detección de plugins
Las pruebas de contrato se ejecutan en CI y no requieren claves de API reales.
Incorporación de regresiones (orientación)
Cuando corrija un problema de proveedor o modelo detectado en vivo:
- Añada una regresión segura para CI si es posible (proveedor simulado o auxiliar, o capture la transformación exacta de la estructura de la solicitud)
- Si el problema solo puede reproducirse en vivo por su naturaleza (límites de frecuencia, políticas de autenticación), mantenga la prueba en vivo acotada y con habilitación explícita mediante variables de entorno
- Procure dirigirse a la capa más pequeña que detecte el error:
- error de conversión o reproducción de solicitudes del proveedor -> prueba directa de modelos
- error de sesión, historial o canalización de herramientas del Gateway -> prueba de humo en vivo del Gateway o prueba simulada del Gateway segura para CI
- Protección del recorrido de SecretRef:
src/secrets/exec-secret-ref-id-parity.test.tsobtiene un destino de muestra por cada clase de SecretRef a partir de los metadatos del registro (listSecretTargetRegistryEntries()) y, a continuación, comprueba que se rechacen los identificadores de ejecución con segmentos de recorrido.- Si añade una nueva familia de destinos SecretRef con
includeInPlanensrc/secrets/target-registry-data.ts, actualiceclassifyTargetClassen esa prueba. La prueba falla intencionadamente con los identificadores de destino no clasificados para que las clases nuevas no puedan omitirse silenciosamente.