Testing
Testes
OpenClaw tem três suítes Vitest (unitária/integração, e2e, ao vivo) e um pequeno conjunto de executores Docker. Este documento é um guia de "como testamos":
- O que cada suíte cobre (e o que ela deliberadamente não cobre).
- Quais comandos executar para fluxos de trabalho comuns (local, pré-push, depuração).
- Como os testes ao vivo descobrem credenciais e selecionam modelos/provedores.
- Como adicionar regressões para problemas reais de modelo/provedor.
Início rápido
Na maioria dos dias:
- Gate completo (esperado antes do push):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Execução mais rápida da suíte completa local em uma máquina espaçosa:
pnpm test:max - Loop direto de observação do Vitest:
pnpm test:watch - O direcionamento direto por arquivo agora também roteia caminhos de extensões/canais:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Prefira execuções direcionadas primeiro quando estiver iterando em uma única falha.
- Site de QA com respaldo Docker:
pnpm qa:lab:up - Lane de QA com respaldo de VM Linux:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
Quando você tocar em testes ou quiser confiança extra:
- Gate de cobertura:
pnpm test:coverage - Suíte E2E:
pnpm test:e2e
Ao depurar provedores/modelos reais (requer credenciais reais):
- Suíte ao vivo (modelos + sondas de ferramenta/imagem do Gateway):
pnpm test:live - Direcione um arquivo ao vivo de forma silenciosa:
pnpm test:live -- src/agents/models.profiles.live.test.ts - Relatórios de desempenho em runtime: dispare
OpenClaw Performancecomlive_gpt54=truepara uma rodada real de agenteopenai/gpt-5.4oudeep_profile=truepara artefatos de CPU/heap/trace do Kova. Execuções diárias agendadas publicam artefatos de lanes de provedor mock, perfil profundo e GPT 5.4 emopenclaw/clawgrit-reportsquandoCLAWGRIT_REPORTS_TOKENestá configurado. O relatório de provedor mock também inclui números em nível de código-fonte para inicialização do Gateway, memória, pressão de Plugins, loop repetido de saudação com modelo falso e inicialização da CLI. - Varredura de modelos ao vivo Docker:
pnpm test:docker:live-models- Cada modelo selecionado agora executa uma rodada de texto mais uma pequena sonda no estilo leitura de arquivo.
Modelos cujos metadados anunciam entrada
imagetambém executam uma pequena rodada de imagem. Desative as sondas extras comOPENCLAW_LIVE_MODEL_FILE_PROBE=0ouOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0ao isolar falhas de provedor. - Cobertura de CI:
OpenClaw Scheduled Live And E2E Checksdiário eOpenClaw Release Checksmanual chamam o fluxo de trabalho reutilizável ao vivo/E2E cominclude_live_suites: true, que inclui jobs separados da matriz de modelos ao vivo Docker fragmentados por provedor. - Para reexecuções de CI focadas, dispare
OpenClaw Live And E2E Checks (Reusable)cominclude_live_suites: trueelive_models_only: true. - Adicione novos segredos de provedor de alto sinal a
scripts/ci-hydrate-live-auth.shmais.github/workflows/openclaw-live-and-e2e-checks-reusable.ymle seus chamadores agendados/de release.
- Cada modelo selecionado agora executa uma rodada de texto mais uma pequena sonda no estilo leitura de arquivo.
Modelos cujos metadados anunciam entrada
- Smoke de chat vinculado nativo do Codex:
pnpm test:docker:live-codex-bind- Executa uma lane ao vivo Docker contra o caminho de app-server do Codex, vincula uma DM sintética do
Slack com
/codex bind, exercita/codex faste/codex permissions, depois verifica uma resposta simples e que um anexo de imagem seja roteado pela vinculação nativa do Plugin em vez de ACP.
- Executa uma lane ao vivo Docker contra o caminho de app-server do Codex, vincula uma DM sintética do
Slack com
- Smoke do harness de app-server do Codex:
pnpm test:docker:live-codex-harness- Executa rodadas de agente do Gateway pelo harness de app-server do Codex de propriedade do Plugin,
verifica
/codex statuse/codex modelse, por padrão, exercita sondas de imagem, MCP de cron, subagente e Guardian. Desative a sonda de subagente comOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0ao isolar outras falhas de app-server do Codex. Para uma verificação focada de subagente, desative as outras sondas: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. Isso sai depois da sonda de subagente, a menos queOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0esteja definido.
- Executa rodadas de agente do Gateway pelo harness de app-server do Codex de propriedade do Plugin,
verifica
- Smoke do comando de resgate do Crestodian:
pnpm test:live:crestodian-rescue-channel- Verificação opcional de dupla segurança para a superfície de comando de resgate do canal de mensagens.
Ela exercita
/crestodian status, enfileira uma alteração persistente de modelo, responde/crestodian yese verifica o caminho de gravação de auditoria/configuração.
- Verificação opcional de dupla segurança para a superfície de comando de resgate do canal de mensagens.
Ela exercita
- Smoke Docker do planejador do Crestodian:
pnpm test:docker:crestodian-planner- Executa o Crestodian em um contêiner sem configuração com uma CLI Claude falsa no
PATHe verifica se o fallback do planejador fuzzy se traduz em uma gravação de configuração tipada auditada.
- Executa o Crestodian em um contêiner sem configuração com uma CLI Claude falsa no
- Smoke Docker da primeira execução do Crestodian:
pnpm test:docker:crestodian-first-run- Começa de um diretório de estado vazio do OpenClaw, roteia
openclawpuro para o Crestodian, aplica gravações de configuração/modelo/agente/Plugin do Discord + SecretRef, valida a configuração e verifica entradas de auditoria. O mesmo caminho de configuração Ring 0 também é coberto no QA Lab porpnpm openclaw qa suite --scenario crestodian-ring-zero-setup.
- Começa de um diretório de estado vazio do OpenClaw, roteia
- Smoke de custo Moonshot/Kimi: com
MOONSHOT_API_KEYdefinido, executeopenclaw models list --provider moonshot --json, depois execute umopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsonisolado contramoonshot/kimi-k2.6. Verifique se o JSON informa Moonshot/K2.6 e se a transcrição do assistente armazenausage.costnormalizado.
Executores específicos de QA
Estes comandos ficam ao lado das principais suítes de teste quando você precisa de realismo de QA Lab:
A CI executa QA Lab em fluxos de trabalho dedicados. A paridade agentic fica aninhada em
QA-Lab - All Lanes e validação de release, não em um fluxo de trabalho de PR autônomo.
Validações amplas devem usar Full Release Validation com
rerun_group=qa-parity ou o grupo de QA de verificações de release. As verificações estáveis/padrão de release
mantêm o soak exaustivo ao vivo/Docker atrás de run_release_soak=true; o
perfil full força o soak. QA-Lab - All Lanes
é executado todas as noites em main e por despacho manual com a lane de paridade mock, lane
Matrix ao vivo, lane Telegram ao vivo gerenciada pelo Convex e lane Discord
ao vivo gerenciada pelo Convex como jobs paralelos. QA agendado e verificações de release passam Matrix
--profile fast explicitamente, enquanto a CLI Matrix e a entrada manual do fluxo de trabalho
permanecem com padrão all; o despacho manual pode fragmentar all em jobs transport,
media, e2ee-smoke, e2ee-deep e e2ee-cli. OpenClaw Release Checks executa paridade mais as lanes rápidas de Matrix e Telegram antes da aprovação de release,
usando mock-openai/gpt-5.5 para verificações de transporte de release, para que elas permaneçam
determinísticas e evitem a inicialização normal do Plugin de provedor. Esses Gateways de transporte
ao vivo desativam a busca de memória; o comportamento de memória continua coberto pelas suítes de paridade
de QA.
Os fragmentos de mídia ao vivo de release completo usam
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04, que já tem
ffmpeg e ffprobe. Fragmentos Docker de modelos/backends ao vivo usam a imagem compartilhada
ghcr.io/openclaw/openclaw-live-test:<sha> criada uma vez por commit selecionado,
depois a puxam com OPENCLAW_SKIP_DOCKER_BUILD=1 em vez de reconstruir
dentro de cada fragmento.
pnpm openclaw qa suite- Executa cenários de QA baseados no repositório diretamente no host.
- Executa vários cenários selecionados em paralelo por padrão com workers de
gateway isolados.
qa-channelusa concorrência 4 por padrão (limitada pela contagem de cenários selecionados). Use--concurrency <count>para ajustar a contagem de workers, ou--concurrency 1para a lane serial anterior. - Sai com código diferente de zero quando qualquer cenário falha. Use
--allow-failuresquando você quiser artefatos sem um código de saída de falha. - Oferece suporte aos modos de provedor
live-frontier,mock-openaieaimock.aimockinicia um servidor de provedor local baseado em AIMock para cobertura experimental de fixtures e mocks de protocolo sem substituir a lanemock-openaicom reconhecimento de cenários.
pnpm test:plugins:kitchen-sink-live- Executa o gauntlet do Plugin OpenAI Kitchen Sink ao vivo pelo QA Lab. Ele
instala o pacote externo Kitchen Sink, verifica o inventário da superfície do SDK
de Plugin, sonda
/healthze/readyz, registra evidências de CPU/RSS do gateway, executa um turno OpenAI ao vivo e verifica diagnósticos adversariais. Exige autenticação OpenAI ao vivo, comoOPENAI_API_KEY. Em sessões Testbox hidratadas, ele carrega automaticamente o perfil de autenticação ao vivo do Testbox quando o helperopenclaw-testbox-envestá presente.
- Executa o gauntlet do Plugin OpenAI Kitchen Sink ao vivo pelo QA Lab. Ele
instala o pacote externo Kitchen Sink, verifica o inventário da superfície do SDK
de Plugin, sonda
pnpm test:gateway:cpu-scenarios- Executa o benchmark de inicialização do gateway mais um pequeno pacote de cenários mock do QA Lab
(
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) e grava um resumo combinado de observação de CPU em.artifacts/gateway-cpu-scenarios/. - Sinaliza por padrão apenas observações sustentadas de CPU quente (
--cpu-core-warnmais--hot-wall-warn-ms), então picos curtos de inicialização são registrados como métricas sem parecer a regressão de gateway travado por minutos. - Usa artefatos
distcompilados; execute um build primeiro quando o checkout ainda não tiver uma saída de runtime atualizada.
- Executa o benchmark de inicialização do gateway mais um pequeno pacote de cenários mock do QA Lab
(
pnpm openclaw qa suite --runner multipass- Executa a mesma suíte de QA dentro de uma VM Linux Multipass descartável.
- Mantém o mesmo comportamento de seleção de cenários que
qa suiteno host. - Reutiliza as mesmas flags de seleção de provedor/modelo que
qa suite. - Execuções ao vivo encaminham as entradas de autenticação de QA compatíveis que são práticas para o guest:
chaves de provedor baseadas em env, o caminho de configuração do provedor ao vivo de QA e
CODEX_HOMEquando presente. - Diretórios de saída devem permanecer sob a raiz do repositório para que o guest possa gravar de volta pelo workspace montado.
- Grava o relatório + resumo normais de QA e os logs do Multipass em
.artifacts/qa-e2e/....
pnpm qa:lab:up- Inicia o site de QA baseado em Docker para trabalho de QA em estilo de operador.
pnpm test:docker:npm-onboard-channel-agent- Cria um tarball npm a partir do checkout atual, instala-o globalmente no Docker, executa o onboarding não interativo com chave de API da OpenAI, configura Telegram por padrão, verifica que o runtime do Plugin empacotado carrega sem reparo de dependências na inicialização, executa doctor e executa um turno de agente local contra um endpoint OpenAI simulado.
- Use
OPENCLAW_NPM_ONBOARD_CHANNEL=discordpara executar a mesma lane de instalação empacotada com Discord.
pnpm test:docker:session-runtime-context- Executa um smoke Docker determinístico do app compilado para transcrições de contexto de runtime
incorporado. Ele verifica que o contexto de runtime oculto do OpenClaw é persistido como uma
mensagem customizada sem exibição em vez de vazar para o turno visível do usuário,
então semeia um JSONL de sessão quebrada afetada e verifica que
openclaw doctor --fixo reescreve para o branch ativo com um backup.
- Executa um smoke Docker determinístico do app compilado para transcrições de contexto de runtime
incorporado. Ele verifica que o contexto de runtime oculto do OpenClaw é persistido como uma
mensagem customizada sem exibição em vez de vazar para o turno visível do usuário,
então semeia um JSONL de sessão quebrada afetada e verifica que
pnpm test:docker:npm-telegram-live- Instala um candidato de pacote OpenClaw no Docker, executa onboarding de pacote instalado, configura Telegram pela CLI instalada e então reutiliza a lane de QA do Telegram ao vivo com esse pacote instalado como o Gateway SUT.
- O padrão é
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta; definaOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzouOPENCLAW_CURRENT_PACKAGE_TGZpara testar um tarball local resolvido em vez de instalar a partir do registro. - Usa as mesmas credenciais env do Telegram ou a fonte de credenciais Convex que
pnpm openclaw qa telegram. Para automação de CI/release, definaOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexmaisOPENCLAW_QA_CONVEX_SITE_URLe o segredo da função. SeOPENCLAW_QA_CONVEX_SITE_URLe um segredo de função Convex estiverem presentes no CI, o wrapper Docker seleciona Convex automaticamente. - O wrapper valida env de credenciais do Telegram ou Convex no host antes do
trabalho de build/instalação do Docker. Defina
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1apenas ao depurar deliberadamente a configuração pré-credencial. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainersubstitui oOPENCLAW_QA_CREDENTIAL_ROLEcompartilhado somente para esta lane.- GitHub Actions expõe esta lane como o workflow manual de mantenedor
NPM Telegram Beta E2E. Ele não é executado no merge. O workflow usa o ambienteqa-live-sharede leases de credenciais Convex de CI.
- GitHub Actions também expõe
Package Acceptancepara prova de produto em execução lateral contra um pacote candidato. Ele aceita uma ref confiável, especificação npm publicada, URL HTTPS de tarball mais SHA-256, ou artefato de tarball de outra execução, faz upload doopenclaw-current.tgznormalizado comopackage-under-test, então executa o agendador Docker E2E existente com perfis de lane smoke, pacote, produto, completo ou customizado. Definatelegram_mode=mock-openaioulive-frontierpara executar o workflow de QA do Telegram contra o mesmo artefatopackage-under-test.- Prova de produto do beta mais recente:
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
- Prova por URL exata de tarball exige um digest:
gh workflow run package-acceptance.yml --ref main \
-f source=url \
-f package_url=https://registry.npmjs.org/openclaw/-/openclaw-VERSION.tgz \
-f package_sha256=<sha256> \
-f suite_profile=package
- Prova por artefato baixa um artefato de tarball de outra execução do 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- Empacota e instala o build atual do OpenClaw no Docker, inicia o Gateway com OpenAI configurada e então habilita canais/plugins incluídos por meio de edições de config.
- Verifica que a descoberta de setup deixa ausentes plugins baixáveis não configurados, que o primeiro reparo configurado do doctor instala explicitamente cada Plugin baixável ausente, e que uma segunda reinicialização não executa reparo oculto de dependências.
- Também instala uma baseline npm antiga conhecida, habilita Telegram antes de executar
openclaw update --tag <candidate>e verifica que o doctor pós-atualização do candidato limpa detritos de dependências legadas de Plugin sem um reparo postinstall do lado do harness.
-
pnpm test:parallels:npm-update-
Executa o smoke nativo de atualização de instalação empacotada entre guests Parallels. Cada plataforma selecionada primeiro instala o pacote baseline solicitado, depois executa o comando
openclaw updateinstalado no mesmo guest e verifica a versão instalada, o status de atualização, a prontidão do gateway e um turno de agente local. -
Use
--platform macos,--platform windowsou--platform linuxenquanto itera em um guest. Use--jsonpara o caminho do artefato de resumo e o status por lane. -
A lane OpenAI usa
openai/gpt-5.5para a prova de turno de agente ao vivo por padrão. Passe--model <provider/model>ou definaOPENCLAW_PARALLELS_OPENAI_MODELao validar deliberadamente outro modelo OpenAI. -
Envolva execuções locais longas em um timeout do host para que travamentos de transporte do Parallels não consumam o restante da janela de testes:
timeout --foreground 150m pnpm test:parallels:npm-update -- --json timeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json -
O script grava logs de lane aninhados em
/tmp/openclaw-parallels-npm-update.*. Inspecionewindows-update.log,macos-update.logoulinux-update.logantes de assumir que o wrapper externo travou. -
A atualização do Windows pode passar de 10 a 15 minutos no doctor pós-atualização e no trabalho de atualização de pacote em um guest frio; isso ainda é saudável quando o log de depuração npm aninhado está avançando.
-
Não execute este wrapper agregado em paralelo com lanes smoke individuais do Parallels macOS, Windows ou Linux. Elas compartilham estado de VM e podem colidir na restauração de snapshot, no serviço de pacotes ou no estado do gateway do guest.
-
A prova pós-atualização executa a superfície normal de Plugin incluído porque facades de capacidade como fala, geração de imagem e entendimento de mídia são carregadas por APIs de runtime incluídas mesmo quando o turno do agente em si verifica apenas uma resposta de texto simples.
-
-
pnpm openclaw qa aimock- Inicia somente o servidor de provedor AIMock local para testes smoke diretos de protocolo.
-
pnpm openclaw qa matrix- Executa a lane de QA ao vivo do Matrix contra um homeserver Tuwunel descartável baseado em Docker. Somente checkout de origem - instalações empacotadas não distribuem
qa-lab. - CLI completa, catálogo de perfis/cenários, env vars e layout de artefatos: QA do Matrix.
- Executa a lane de QA ao vivo do Matrix contra um homeserver Tuwunel descartável baseado em Docker. Somente checkout de origem - instalações empacotadas não distribuem
-
pnpm openclaw qa telegram- Executa a lane de QA ao vivo do Telegram contra um grupo privado real usando os tokens do driver e do bot SUT vindos do env.
- Exige
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENeOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. O id do grupo deve ser o id numérico do chat do Telegram. - Oferece suporte a
--credential-source convexpara credenciais compartilhadas em pool. Use o modo env por padrão, ou definaOPENCLAW_QA_CREDENTIAL_SOURCE=convexpara optar por leases em pool. - Sai com código diferente de zero quando qualquer cenário falha. Use
--allow-failuresquando você quiser artefatos sem um código de saída de falha. - Exige dois bots distintos no mesmo grupo privado, com o bot SUT expondo um nome de usuário do Telegram.
- Para observação estável de bot para bot, habilite Bot-to-Bot Communication Mode no
@BotFatherpara ambos os bots e garanta que o bot driver possa observar o tráfego de bots do grupo. - Grava um relatório de QA do Telegram, resumo e artefato de mensagens observadas em
.artifacts/qa-e2e/.... Cenários de resposta incluem RTT desde a solicitação de envio do driver até a resposta SUT observada.
Lanes de transporte ao vivo compartilham um contrato padrão para que novos transportes não desviem; a matriz de cobertura por lane fica em visão geral de QA → Cobertura de transporte ao vivo. qa-channel é a suíte sintética ampla e não faz parte dessa matriz.
Credenciais compartilhadas do Telegram via Convex (v1)
Quando --credential-source convex (ou OPENCLAW_QA_CREDENTIAL_SOURCE=convex) está habilitado para
openclaw qa telegram, o QA lab adquire um lease exclusivo de um pool baseado em Convex, envia heartbeats
para esse lease enquanto a lane está em execução e libera o lease no desligamento.
Scaffold de projeto Convex de referência:
qa/convex-credential-broker/
Env vars obrigatórias:
OPENCLAW_QA_CONVEX_SITE_URL(por exemplohttps://your-deployment.convex.site)- Um segredo para a função selecionada:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERparamaintainerOPENCLAW_QA_CONVEX_SECRET_CIparaci
- Seleção de função de credencial:
- CLI:
--credential-role maintainer|ci - Padrão env:
OPENCLAW_QA_CREDENTIAL_ROLE(padrão paraciem CI,maintainercaso contrário)
- CLI:
Env vars opcionais:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(padrão1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(padrão30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(padrão90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(padrão15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(padrão/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(id de rastreamento opcional)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1permite URLs Convexhttp://de local loopback para desenvolvimento somente local.
OPENCLAW_QA_CONVEX_SITE_URL deve usar https:// na operação normal.
Comandos administrativos de mantenedor (adicionar/remover/listar pool) exigem
especificamente OPENCLAW_QA_CONVEX_SECRET_MAINTAINER.
Auxiliares de CLI para mantenedores:
pnpm openclaw qa credentials doctor
pnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.json
pnpm openclaw qa credentials list --kind telegram
pnpm openclaw qa credentials remove --credential-id <credential-id>
Use doctor antes de execuções live para verificar a URL do site Convex, os segredos do broker,
o prefixo do endpoint, o tempo limite HTTP e a acessibilidade de admin/list sem imprimir
valores secretos. Use --json para saída legível por máquina em scripts e utilitários de CI.
Contrato padrão de endpoint (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1):
POST /acquire- Solicitação:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Sucesso:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Esgotado/repetível:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Solicitação:
POST /heartbeat- Solicitação:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Sucesso:
{ status: "ok" }(ou2xxvazio)
- Solicitação:
POST /release- Solicitação:
{ kind, ownerId, actorRole, credentialId, leaseToken } - Sucesso:
{ status: "ok" }(ou2xxvazio)
- Solicitação:
POST /admin/add(somente segredo de mantenedor)- Solicitação:
{ kind, actorId, payload, note?, status? } - Sucesso:
{ status: "ok", credential }
- Solicitação:
POST /admin/remove(somente segredo de mantenedor)- Solicitação:
{ credentialId, actorId } - Sucesso:
{ status: "ok", changed, credential } - Proteção de lease ativo:
{ status: "error", code: "LEASE_ACTIVE", ... }
- Solicitação:
POST /admin/list(somente segredo de mantenedor)- Solicitação:
{ kind?, status?, includePayload?, limit? } - Sucesso:
{ status: "ok", credentials, count }
- Solicitação:
Formato do payload para o tipo Telegram:
{ groupId: string, driverToken: string, sutToken: string }groupIddeve ser uma string de id numérico de chat do Telegram.admin/addvalida esse formato parakind: "telegram"e rejeita payloads malformados.
Adicionar um canal ao QA
A arquitetura e os nomes dos auxiliares de cenário para novos adaptadores de canal ficam em Visão geral de QA → Adicionar um canal. O requisito mínimo: implementar o runner de transporte na seam compartilhada do host qa-lab, declarar qaRunners no manifesto do Plugin, montar como openclaw qa <runner> e criar cenários em qa/scenarios/.
Suítes de teste (o que roda onde)
Pense nas suítes como "realismo crescente" (e instabilidade/custo crescentes):
Unidade / integração (padrão)
- Comando:
pnpm test - Configuração: execuções sem alvo usam o conjunto de shards
vitest.full-*.config.tse podem expandir shards multiprojeto em configurações por projeto para agendamento paralelo - Arquivos: inventários core/unit em
src/**/*.test.ts,packages/**/*.test.tsetest/**/*.test.ts; testes unitários de UI rodam no shard dedicadounit-ui - Escopo:
- Testes unitários puros
- Testes de integração em processo (autenticação do gateway, roteamento, ferramentas, parsing, configuração)
- Regressões determinísticas para bugs conhecidos
- Expectativas:
- Roda no CI
- Nenhuma chave real exigida
- Deve ser rápido e estável
- Testes de resolvedor e loader de superfície pública devem provar comportamento amplo de fallback de
api.jseruntime-api.jscom fixtures minúsculas geradas de Plugin, não APIs reais de código-fonte de Plugin bundled. Carregamentos reais de API de Plugin pertencem a suítes de contrato/integração pertencentes ao Plugin.
Projects, shards, and scoped lanes
pnpm testsem alvo executa doze configurações de shard menores (core-unit-fast,core-unit-src,core-unit-security,core-unit-ui,core-unit-support,core-support-boundary,core-contracts,core-bundled,core-runtime,agentic,auto-reply,extensions) em vez de um único processo gigante nativo do projeto raiz. Isso reduz o pico de RSS em máquinas carregadas e evita que tarefas de auto-reply/extensão deixem suítes não relacionadas sem recursos.pnpm test --watchainda usa o grafo de projetos nativo raiz devitest.config.ts, porque um loop de watch multi-shard não é prático.pnpm test,pnpm test:watchepnpm test:perf:importsroteiam alvos explícitos de arquivo/diretório primeiro por lanes com escopo, entãopnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsevita pagar o custo de inicialização completo do projeto raiz.pnpm test:changedexpande caminhos git alterados em lanes baratas com escopo por padrão: edições diretas de teste, arquivos irmãos*.test.ts, mapeamentos explícitos de código-fonte e dependentes locais do grafo de imports. Edições de configuração/setup/pacote não executam testes amplamente, a menos que você use explicitamenteOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed.pnpm check:changedé o gate normal e inteligente de verificação local para trabalhos estreitos. Ele classifica o diff em core, testes de core, extensões, testes de extensão, apps, docs, metadados de release, ferramentas live Docker e tooling, depois executa os comandos correspondentes de typecheck, lint e guard. Ele não executa testes Vitest; chamepnpm test:changedoupnpm test <target>explícito para prova de teste. Aumentos de versão somente de metadados de release executam verificações direcionadas de versão/configuração/dependência raiz, com um guard que rejeita alterações de pacote fora do campo de versão de nível superior.- Edições do harness live Docker ACP executam verificações focadas: sintaxe shell para os scripts de autenticação live Docker e um dry-run do agendador live Docker. Alterações em
package.jsonsão incluídas somente quando o diff se limita ascripts["test:docker:live-*"]; edições de dependência, export, versão e outras superfícies de pacote ainda usam os guards mais amplos. - Testes unitários leves em imports de agentes, comandos, plugins, auxiliares de auto-reply,
plugin-sdke áreas semelhantes de utilitários puros passam pela laneunit-fast, que ignoratest/setup-openclaw-runtime.ts; arquivos com estado/pesados de runtime permanecem nas lanes existentes. - Arquivos de código-fonte auxiliares selecionados de
plugin-sdkecommandstambém mapeiam execuções em modo changed para testes irmãos explícitos nessas lanes leves, então edições de auxiliares evitam reexecutar a suíte pesada completa daquele diretório. auto-replytem buckets dedicados para auxiliares de core de nível superior, testes de integraçãoreply.*de nível superior e a subárvoresrc/auto-reply/reply/**. O CI divide ainda mais a subárvore reply em shards de agent-runner, dispatch e commands/state-routing para que um bucket pesado em imports não detenha toda a cauda do Node.- O CI normal de PR/main ignora intencionalmente a varredura em lote de extensão e o shard somente de release
agentic-plugins. A Full Release Validation dispara o workflow filho separadoPlugin Prereleasepara essas suítes pesadas de plugin/extensão em candidatos a release.
Embedded runner coverage
- Quando você alterar entradas de descoberta de message-tool ou contexto de runtime de Compaction, mantenha ambos os níveis de cobertura.
- Adicione regressões focadas de auxiliares para fronteiras puras de roteamento e normalização.
- Mantenha saudáveis as suítes de integração do runner embutido:
src/agents/pi-embedded-runner/compact.hooks.test.ts,src/agents/pi-embedded-runner/run.overflow-compaction.test.tsesrc/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts. - Essas suítes verificam que ids com escopo e comportamento de Compaction ainda fluem
pelos caminhos reais
run.ts/compact.ts; testes somente de auxiliares não são um substituto suficiente para esses caminhos de integração.
Vitest pool and isolation defaults
- A configuração base do Vitest usa
threadspor padrão. - A configuração compartilhada do Vitest fixa
isolate: falsee usa o runner não isolado nas configurações raiz de projetos, e2e e live. - A lane raiz de UI mantém seu setup
jsdome otimizador, mas também roda no runner não isolado compartilhado. - Cada shard de
pnpm testherda os mesmos padrõesthreads+isolate: falseda configuração compartilhada do Vitest. scripts/run-vitest.mjsadiciona--no-maglevpor padrão para processos Node filhos do Vitest para reduzir churn de compilação do V8 durante grandes execuções locais. DefinaOPENCLAW_VITEST_ENABLE_MAGLEV=1para comparar com o comportamento padrão do V8.
Fast local iteration
pnpm changed:lanesmostra quais lanes arquiteturais um diff aciona.- O hook de pre-commit é somente de formatação. Ele coloca novamente em stage os arquivos formatados e não executa lint, typecheck nem testes.
- Execute
pnpm check:changedexplicitamente antes do handoff ou push quando você precisar do gate inteligente de verificação local. pnpm test:changedroteia por lanes baratas com escopo por padrão. UseOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedsomente quando o agente decidir que uma edição de harness, configuração, pacote ou contrato realmente precisa de cobertura Vitest mais ampla.pnpm test:maxepnpm test:changed:maxmantêm o mesmo comportamento de roteamento, apenas com um limite maior de workers.- O autoescalonamento local de workers é intencionalmente conservador e reduz a carga quando a média de carga do host já está alta, então várias execuções Vitest concorrentes causam menos impacto por padrão.
- A configuração base do Vitest marca os arquivos de projetos/configuração como
forceRerunTriggerspara que reexecuções em modo changed permaneçam corretas quando a fiação de testes muda. - A configuração mantém
OPENCLAW_VITEST_FS_MODULE_CACHEhabilitado em hosts compatíveis; definaOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/pathse quiser um local de cache explícito para profiling direto.
Perf debugging
pnpm test:perf:importshabilita relatórios de duração de import do Vitest mais saída de detalhamento de imports.pnpm test:perf:imports:changedlimita a mesma visualização de profiling a arquivos alterados desdeorigin/main.- Dados de tempo dos shards são gravados em
.artifacts/vitest-shard-timings.json. Execuções de configuração inteira usam o caminho da configuração como chave; shards de CI com padrões de inclusão acrescentam o nome do shard para que shards filtrados possam ser acompanhados separadamente. - Quando um teste quente ainda gasta a maior parte do tempo em imports de inicialização,
mantenha dependências pesadas atrás de uma seam local estreita
*.runtime.tse faça mock dessa seam diretamente em vez de fazer deep-import de auxiliares de runtime apenas para passá-los porvi.mock(...). pnpm test:perf:changed:bench -- --ref <git-ref>compara otest:changedroteado com o caminho nativo de projeto raiz para aquele diff commitado e imprime tempo total mais RSS máximo no macOS.pnpm test:perf:changed:bench -- --worktreefaz benchmark da árvore suja atual roteando a lista de arquivos alterados porscripts/test-projects.mjse pela configuração raiz do Vitest.pnpm test:perf:profile:maingrava um perfil de CPU da thread principal para overhead de inicialização e transformação do Vitest/Vite.pnpm test:perf:profile:runnergrava perfis de CPU+heap do runner para a suíte unitária com paralelismo de arquivos desabilitado.
Estabilidade (gateway)
- Comando:
pnpm test:stability:gateway - Configuração:
vitest.gateway.config.ts, forçada para um worker - Escopo:
- Inicia um Gateway real em loopback com diagnósticos habilitados por padrão
- Conduz churn sintético de mensagens de gateway, memória e payloads grandes pelo caminho de eventos de diagnóstico
- Consulta
diagnostics.stabilitypelo RPC WS do Gateway - Cobre auxiliares de persistência de bundle de estabilidade de diagnóstico
- Afirma que o gravador permanece limitado, amostras sintéticas de RSS ficam abaixo do orçamento de pressão e profundidades de fila por sessão drenam de volta para zero
- Expectativas:
- Seguro para CI e sem chaves
- Lane estreita para acompanhamento de regressão de estabilidade, não substituto para a suíte completa do Gateway
E2E (smoke do gateway)
- Comando:
pnpm test:e2e - Configuração:
vitest.e2e.config.ts - Arquivos:
src/**/*.e2e.test.ts,test/**/*.e2e.test.tse testes E2E de Plugins empacotados emextensions/ - Padrões de tempo de execução:
- Usa
threadsdo Vitest comisolate: false, correspondendo ao restante do repositório. - Usa workers adaptativos (CI: até 2, local: 1 por padrão).
- Executa em modo silencioso por padrão para reduzir a sobrecarga de E/S do console.
- Usa
- Substituições úteis:
OPENCLAW_E2E_WORKERS=<n>para forçar a contagem de workers (limitada a 16).OPENCLAW_E2E_VERBOSE=1para reativar a saída detalhada do console.
- Escopo:
- Comportamento ponta a ponta de Gateway com múltiplas instâncias
- Superfícies WebSocket/HTTP, pareamento de Node e rede mais pesada
- Expectativas:
- Executa em CI (quando habilitado no pipeline)
- Não requer chaves reais
- Mais partes móveis do que testes unitários (pode ser mais lento)
E2E: verificação smoke do backend do OpenShell
- Comando:
pnpm test:e2e:openshell - Arquivo:
extensions/openshell/src/backend.e2e.test.ts - Escopo:
- Inicia um Gateway OpenShell isolado no host via Docker
- Cria um sandbox a partir de um Dockerfile local temporário
- Exercita o backend OpenShell do OpenClaw por meio de
sandbox ssh-configreal + execução SSH - Verifica o comportamento do sistema de arquivos canônico remoto por meio da ponte fs do sandbox
- Expectativas:
- Somente por adesão; não faz parte da execução padrão de
pnpm test:e2e - Requer uma CLI local
openshelle um daemon Docker funcional - Usa
HOME/XDG_CONFIG_HOMEisolados e depois destrói o Gateway e o sandbox de teste
- Somente por adesão; não faz parte da execução padrão de
- Substituições úteis:
OPENCLAW_E2E_OPENSHELL=1para habilitar o teste ao executar manualmente a suíte e2e mais amplaOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshellpara apontar para um binário de CLI não padrão ou script wrapper
Ao vivo (provedores reais + modelos reais)
- Comando:
pnpm test:live - Configuração:
vitest.live.config.ts - Arquivos:
src/**/*.live.test.ts,test/**/*.live.test.tse testes ao vivo de Plugins empacotados emextensions/ - Padrão: habilitado por
pnpm test:live(defineOPENCLAW_LIVE_TEST=1) - Escopo:
- "Este provedor/modelo realmente funciona hoje com credenciais reais?"
- Capturar mudanças de formato de provedores, peculiaridades de chamada de ferramentas, problemas de autenticação e comportamento de limite de taxa
- Expectativas:
- Não é estável para CI por design (redes reais, políticas reais de provedores, cotas, indisponibilidades)
- Custa dinheiro / usa limites de taxa
- Prefira executar subconjuntos reduzidos em vez de "tudo"
- Execuções ao vivo carregam
~/.profilepara obter chaves de API ausentes. - Por padrão, execuções ao vivo ainda isolam
HOMEe copiam material de configuração/autenticação para um home de teste temporário para que fixtures unitárias não possam alterar seu~/.openclawreal. - Defina
OPENCLAW_LIVE_USE_REAL_HOME=1somente quando você intencionalmente precisar que testes ao vivo usem seu diretório home real. pnpm test:liveagora usa por padrão um modo mais silencioso: mantém a saída de progresso[live] ..., mas suprime o aviso extra de~/.profilee silencia logs de bootstrap do Gateway/conversa do Bonjour. DefinaOPENCLAW_LIVE_TEST_QUIET=0se quiser os logs completos de inicialização de volta.- Rotação de chaves de API (específica por provedor): defina
*_API_KEYScom formato separado por vírgula/ponto e vírgula ou*_API_KEY_1,*_API_KEY_2(por exemplo,OPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) ou substituição por execução ao vivo viaOPENCLAW_LIVE_*_KEY; os testes tentam novamente em respostas de limite de taxa. - Saída de progresso/Heartbeat:
- Suítes ao vivo agora emitem linhas de progresso para stderr para que chamadas longas a provedores fiquem visivelmente ativas mesmo quando a captura de console do Vitest está silenciosa.
vitest.live.config.tsdesabilita a interceptação de console do Vitest para que linhas de progresso do provedor/Gateway sejam transmitidas imediatamente durante execuções ao vivo.- Ajuste Heartbeats de modelo direto com
OPENCLAW_LIVE_HEARTBEAT_MS. - Ajuste Heartbeats de Gateway/probe com
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Qual suíte devo executar?
Use esta tabela de decisão:
- Editando lógica/testes: execute
pnpm test(epnpm test:coveragese você mudou muita coisa) - Alterando rede do Gateway / protocolo WS / pareamento: adicione
pnpm test:e2e - Depurando "meu bot está fora do ar" / falhas específicas de provedor / chamada de ferramentas: execute um
pnpm test:livereduzido
Testes ao vivo (que tocam a rede)
Para a matriz de modelos ao vivo, verificações smoke de backend da CLI, verificações smoke ACP, harness de servidor de aplicativo Codex e todos os testes ao vivo de provedores de mídia (Deepgram, BytePlus, ComfyUI, imagem, música, vídeo, harness de mídia) - além do tratamento de credenciais para execuções ao vivo - consulte Testando suítes ao vivo. Para a lista de verificação dedicada de atualização e validação de Plugin, consulte Testando atualizações e Plugins.
Runners Docker (verificações opcionais de "funciona no Linux")
Estes runners Docker se dividem em dois grupos:
- Runners de modelos ao vivo:
test:docker:live-modelsetest:docker:live-gatewayexecutam apenas seu arquivo ao vivo correspondente de chave de perfil dentro da imagem Docker do repositório (src/agents/models.profiles.live.test.tsesrc/gateway/gateway-models.profiles.live.test.ts), montando seu diretório de configuração local e workspace (e carregando~/.profilese montado). Os pontos de entrada locais correspondentes sãotest:live:models-profilesetest:live:gateway-profiles. - Runners Docker ao vivo usam por padrão um limite de smoke menor para manter uma varredura Docker completa prática:
test:docker:live-modelsusa por padrãoOPENCLAW_LIVE_MAX_MODELS=12, etest:docker:live-gatewayusa por padrãoOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000eOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Substitua essas variáveis de ambiente quando você quiser explicitamente a varredura exaustiva maior. test:docker:allcria a imagem Docker ao vivo uma vez viatest:docker:live-build, empacota o OpenClaw uma vez como um tarball npm por meio descripts/package-openclaw-for-docker.mjse depois cria/reutiliza duas imagensscripts/e2e/Dockerfile. A imagem básica é apenas o runner Node/Git para lanes de instalação/atualização/dependência de Plugin; essas lanes montam o tarball pré-criado. A imagem funcional instala o mesmo tarball em/apppara lanes de funcionalidade do aplicativo criado. As definições de lanes Docker ficam emscripts/lib/docker-e2e-scenarios.mjs; a lógica do planejador fica emscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsexecuta o plano selecionado. O agregado usa um escalonador local ponderado:OPENCLAW_DOCKER_ALL_PARALLELISMcontrola slots de processo, enquanto limites de recursos impedem que lanes pesadas ao vivo, de instalação npm e multisserviço iniciem todas ao mesmo tempo. Se uma única lane for mais pesada que os limites ativos, o escalonador ainda pode iniciá-la quando o pool estiver vazio e então mantê-la rodando sozinha até que haja capacidade disponível novamente. Os padrões são 10 slots,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=10eOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; ajusteOPENCLAW_DOCKER_ALL_WEIGHT_LIMITouOPENCLAW_DOCKER_ALL_DOCKER_LIMITsomente quando o host Docker tiver mais folga. O runner executa uma pré-verificação do Docker por padrão, remove contêineres E2E obsoletos do OpenClaw, imprime status a cada 30 segundos, armazena tempos de lanes bem-sucedidas em.artifacts/docker-tests/lane-timings.jsone usa esses tempos para iniciar primeiro lanes mais longas em execuções posteriores. UseOPENCLAW_DOCKER_ALL_DRY_RUN=1para imprimir o manifesto ponderado de lanes sem criar ou executar Docker, ounode scripts/test-docker-all.mjs --plan-jsonpara imprimir o plano de CI para lanes selecionadas, necessidades de pacote/imagem e credenciais.Package Acceptanceé o gate de pacote nativo do GitHub para "este tarball instalável funciona como um produto?" Ele resolve um pacote candidato a partir desource=npm,source=ref,source=urlousource=artifact, faz upload dele comopackage-under-teste então executa as lanes E2E Docker reutilizáveis contra esse tarball exato em vez de reempacotar a ref selecionada. Os perfis são ordenados por abrangência:smoke,package,productefull. Consulte Testando atualizações e Plugins para o contrato de pacote/atualização/Plugin, a matriz de sobrevivência de upgrade publicado, padrões de release e triagem de falhas.- Verificações de build e release executam
scripts/check-cli-bootstrap-imports.mjsapós tsdown. A guarda percorre o grafo criado estático a partir dedist/entry.jsedist/cli/run-main.jse falha se a inicialização pré-dispatch importar dependências de pacote como Commander, interface de prompt, undici ou logging antes do dispatch de comando; ela também mantém o chunk de execução do Gateway empacotado dentro do orçamento e rejeita importações estáticas de caminhos frios conhecidos do Gateway. A verificação smoke da CLI empacotada também cobre ajuda raiz, ajuda de onboard, ajuda de doctor, status, esquema de configuração e um comando de listagem de modelos. - A compatibilidade legada do Package Acceptance é limitada a
2026.4.25(2026.4.25-beta.*incluído). Até esse corte, o harness tolera apenas lacunas de metadados de pacotes enviados: entradas omitidas de inventário privado de QA, ausência degateway install --wrapper, ausência de arquivos de patch na fixture git derivada do tarball, ausência deupdate.channelpersistido, locais legados de registros de instalação de Plugin, ausência de persistência de registros de instalação do marketplace e migração de metadados de configuração duranteplugins update. Para pacotes após2026.4.25, esses caminhos são falhas estritas. - Runners de smoke de contêiner:
test:docker:openwebui,test:docker:onboard,test:docker:npm-onboard-channel-agent,test:docker:update-channel-switch,test:docker:upgrade-survivor,test:docker:published-upgrade-survivor,test:docker:session-runtime-context,test:docker:agents-delete-shared-workspace,test:docker:gateway-network,test:docker:browser-cdp-snapshot,test:docker:mcp-channels,test:docker:pi-bundle-mcp-tools,test:docker:cron-mcp-cleanup,test:docker:plugins,test:docker:plugin-update,test:docker:plugin-lifecycle-matrixetest:docker:config-reloadinicializam um ou mais contêineres reais e verificam caminhos de integração de nível mais alto.
Os runners Docker de modelos ao vivo também montam por bind somente os homes de autenticação da CLI necessários (ou todos os compatíveis quando a execução não está reduzida), depois os copiam para o home do contêiner antes da execução para que o OAuth de CLI externa possa atualizar tokens sem modificar o armazenamento de autenticação do host:
- Modelos diretos:
pnpm test:docker:live-models(script:scripts/test-live-models-docker.sh) - Teste de fumaça de bind ACP:
pnpm test:docker:live-acp-bind(script:scripts/test-live-acp-bind-docker.sh; cobre Claude, Codex e Gemini por padrão, com cobertura estrita de Droid/OpenCode viapnpm test:docker:live-acp-bind:droidepnpm test:docker:live-acp-bind:opencode) - Teste de fumaça do backend da CLI:
pnpm test:docker:live-cli-backend(script:scripts/test-live-cli-backend-docker.sh) - Teste de fumaça do harness do servidor de app do Codex:
pnpm test:docker:live-codex-harness(script:scripts/test-live-codex-harness-docker.sh) - Gateway + agente de desenvolvimento:
pnpm test:docker:live-gateway(script:scripts/test-live-gateway-models-docker.sh) - Teste de fumaça de observabilidade:
pnpm qa:otel:smokeé uma lane privada de QA com checkout do código-fonte. Ela intencionalmente não faz parte das lanes de lançamento de pacote Docker porque o tarball npm omite o QA Lab. - Teste de fumaça live do Open WebUI:
pnpm test:docker:openwebui(script:scripts/e2e/openwebui-docker.sh) - Assistente de onboarding (TTY, scaffolding completo):
pnpm test:docker:onboard(script:scripts/e2e/onboard-docker.sh) - Teste de fumaça de onboarding/canal/agente com tarball npm:
pnpm test:docker:npm-onboard-channel-agentinstala o tarball empacotado do OpenClaw globalmente no Docker, configura OpenAI via onboarding com referência de env mais Telegram por padrão, executa o doctor e executa uma rodada simulada de agente OpenAI. Reutilize um tarball pré-construído comOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz, ignore a reconstrução no host comOPENCLAW_NPM_ONBOARD_HOST_BUILD=0ou troque o canal comOPENCLAW_NPM_ONBOARD_CHANNEL=discordouOPENCLAW_NPM_ONBOARD_CHANNEL=slack. - Teste de fumaça de troca de canal de atualização:
pnpm test:docker:update-channel-switchinstala o tarball empacotado do OpenClaw globalmente no Docker, troca de pacotestablepara gitdev, verifica o canal persistido e o funcionamento do Plugin após a atualização, depois troca de volta para pacotestablee verifica o status de atualização. - Teste de fumaça de sobrevivência de upgrade:
pnpm test:docker:upgrade-survivorinstala o tarball empacotado do OpenClaw sobre uma fixture suja de usuário antigo com agentes, configuração de canal, allowlists de Plugin, estado obsoleto de dependências de Plugin e arquivos de workspace/sessão existentes. Ele executa a atualização do pacote mais o doctor não interativo sem provedor live nem chaves de canal, depois inicia um Gateway de loopback e verifica a preservação de configuração/estado mais orçamentos de inicialização/status. - Teste de fumaça de sobrevivência de upgrade publicado:
pnpm test:docker:published-upgrade-survivorinstalaopenclaw@latestpor padrão, semeia arquivos realistas de usuário existente, configura essa linha de base com uma receita de comando embutida, valida a configuração resultante, atualiza essa instalação publicada para o tarball candidato, executa o doctor não interativo, grava.artifacts/upgrade-survivor/summary.json, depois inicia um Gateway de loopback e verifica intents configuradas, preservação de estado, inicialização,/healthz,/readyze orçamentos de status RPC. Substitua uma linha de base comOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, peça ao agendador agregado para expandir linhas de base locais exatas comOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS, como[email protected] [email protected] [email protected], e expanda fixtures no formato de issues comOPENCLAW_UPGRADE_SURVIVOR_SCENARIOS, comoreported-issues; o conjunto reported-issues incluiconfigured-plugin-installspara reparo automático de instalação de Plugin externo do OpenClaw. Package Acceptance expõe esses itens comopublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesepublished_upgrade_survivor_scenarios, resolve tokens meta de linha de base comolast-stable-4ouall-since-2026.4.23, e Full Release Validation expande o gate de pacote release-soak paralast-stable-4 2026.4.23 2026.5.2 2026.4.15maisreported-issues. - Teste de fumaça de contexto de runtime de sessão:
pnpm test:docker:session-runtime-contextverifica a persistência oculta da transcrição de contexto de runtime mais o reparo pelo doctor de ramificações duplicadas afetadas de reescrita de prompt. - Teste de fumaça de instalação global com Bun:
bash scripts/e2e/bun-global-install-smoke.shempacota a árvore atual, instala combun install -gem uma home isolada e verifica queopenclaw infer image providers --jsonretorna provedores de imagem integrados em vez de travar. Reutilize um tarball pré-construído comOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz, ignore a build do host comOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0ou copiedist/de uma imagem Docker construída comOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local. - Teste de fumaça do instalador no Docker:
bash scripts/test-install-sh-docker.shcompartilha um cache npm entre seus contêineres root, update e direct-npm. O teste de fumaça de atualização usa por padrão npmlatestcomo a linha de base stable antes de fazer upgrade para o tarball candidato. Substitua comOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22localmente, ou com a entradaupdate_baseline_versiondo fluxo de trabalho Install Smoke no GitHub. Verificações de instalador sem root mantêm um cache npm isolado para que entradas de cache pertencentes ao root não mascarem o comportamento de instalação local do usuário. DefinaOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cachepara reutilizar o cache root/update/direct-npm em novas execuções locais. - Install Smoke CI ignora a atualização global direct-npm duplicada com
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1; execute o script localmente sem essa env quando for necessária cobertura direta denpm install -g. - Teste de fumaça da CLI para excluir workspace compartilhado de agentes:
pnpm test:docker:agents-delete-shared-workspace(script:scripts/e2e/agents-delete-shared-workspace-docker.sh) constrói a imagem do Dockerfile raiz por padrão, semeia dois agentes com um workspace em uma home de contêiner isolada, executaagents delete --jsone verifica JSON válido mais o comportamento de workspace preservado. Reutilize a imagem install-smoke comOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1. - Rede do Gateway (dois contêineres, autenticação WS + integridade):
pnpm test:docker:gateway-network(script:scripts/e2e/gateway-network-docker.sh) - Teste de fumaça de snapshot CDP do navegador:
pnpm test:docker:browser-cdp-snapshot(script:scripts/e2e/browser-cdp-snapshot-docker.sh) constrói a imagem E2E de origem mais uma camada do Chromium, inicia o Chromium com CDP bruto, executabrowser doctor --deepe verifica que os snapshots de papéis do CDP cobrem URLs de links, clicáveis promovidos por cursor, refs de iframe e metadados de frame. - Regressão de raciocínio mínimo com OpenAI Responses web_search:
pnpm test:docker:openai-web-search-minimal(script:scripts/e2e/openai-web-search-minimal-docker.sh) executa um servidor OpenAI simulado pelo Gateway, verifica queweb_searchelevareasoning.effortdeminimalparalow, depois força a rejeição do schema do provedor e verifica que o detalhe bruto aparece nos logs do Gateway. - Ponte de canal MCP (Gateway semeado + ponte stdio + teste de fumaça de frame de notificação Claude bruto):
pnpm test:docker:mcp-channels(script:scripts/e2e/mcp-channels-docker.sh) - Ferramentas MCP do pacote Pi (servidor MCP stdio real + teste de fumaça allow/deny do perfil Pi incorporado):
pnpm test:docker:pi-bundle-mcp-tools(script:scripts/e2e/pi-bundle-mcp-tools-docker.sh) - Limpeza de MCP Cron/subagente (Gateway real + desmontagem de filho MCP stdio após cron isolado e execuções únicas de subagente):
pnpm test:docker:cron-mcp-cleanup(script:scripts/e2e/cron-mcp-cleanup-docker.sh) - Plugins (teste de fumaça de instalação/atualização para caminho local,
file:, registro npm com dependências hoisted, refs móveis do git, kitchen-sink do ClawHub, atualizações de marketplace e habilitação/inspeção do pacote Claude):pnpm test:docker:plugins(script:scripts/e2e/plugins-docker.sh) DefinaOPENCLAW_PLUGINS_E2E_CLAWHUB=0para ignorar o bloco do ClawHub, ou substitua o par padrão pacote/runtime kitchen-sink comOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECeOPENCLAW_PLUGINS_E2E_CLAWHUB_ID. SemOPENCLAW_CLAWHUB_URL/CLAWHUB_URL, o teste usa um servidor local hermético de fixture do ClawHub. - Teste de fumaça de atualização inalterada de Plugin:
pnpm test:docker:plugin-update(script:scripts/e2e/plugin-update-unchanged-docker.sh) - Teste de fumaça da matriz de ciclo de vida de Plugin:
pnpm test:docker:plugin-lifecycle-matrixinstala o tarball empacotado do OpenClaw em um contêiner limpo, instala um Plugin npm, alterna habilitar/desabilitar, faz upgrade e downgrade dele por um registro npm local, exclui o código instalado, depois verifica que a desinstalação ainda remove estado obsoleto enquanto registra métricas de RSS/CPU para cada fase do ciclo de vida. - Teste de fumaça de metadados de recarregamento de configuração:
pnpm test:docker:config-reload(script:scripts/e2e/config-reload-source-docker.sh) - Plugins:
pnpm test:docker:pluginscobre teste de fumaça de instalação/atualização para caminho local,file:, registro npm com dependências hoisted, refs móveis do git, fixtures do ClawHub, atualizações de marketplace e habilitação/inspeção do pacote Claude.pnpm test:docker:plugin-updatecobre o comportamento de atualização inalterada para Plugins instalados.pnpm test:docker:plugin-lifecycle-matrixcobre instalação, habilitação, desabilitação, upgrade, downgrade e desinstalação com código ausente de Plugin npm com rastreamento de recursos.
Para pré-construir e reutilizar manualmente a imagem funcional compartilhada:
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-build
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channels
Substituições de imagem específicas da suíte, como OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE, ainda têm precedência quando definidas. Quando OPENCLAW_SKIP_DOCKER_BUILD=1 aponta para uma imagem compartilhada remota, os scripts fazem pull dela se ainda não estiver local. Os testes Docker de QR e instalador mantêm seus próprios Dockerfiles porque validam comportamento de pacote/instalação em vez do runtime de app construído compartilhado.
Os executores Docker de modelos live também montam o checkout atual como somente leitura e
o preparam em um diretório de trabalho temporário dentro do contêiner. Isso mantém a imagem de runtime
enxuta, enquanto ainda executa o Vitest contra exatamente o seu código-fonte/configuração local.
A etapa de preparação ignora caches grandes apenas locais e saídas de build de apps, como
.pnpm-store, .worktrees, __openclaw_vitest__ e diretórios de saída .build locais do app ou
do Gradle, para que execuções live no Docker não passem minutos copiando
artefatos específicos da máquina.
Elas também definem OPENCLAW_SKIP_CHANNELS=1 para que sondagens live do gateway não iniciem
workers de canal reais de Telegram/Discord/etc. dentro do contêiner.
test:docker:live-models ainda executa pnpm test:live, então repasse também
OPENCLAW_LIVE_GATEWAY_* quando você precisar restringir ou excluir a cobertura live do gateway
dessa lane Docker.
test:docker:openwebui é um smoke de compatibilidade de nível mais alto: ele inicia um
contêiner do gateway OpenClaw com os endpoints HTTP compatíveis com OpenAI habilitados,
inicia um contêiner fixado do Open WebUI contra esse gateway, faz login pelo
Open WebUI, verifica se /api/models expõe openclaw/default e então envia uma
solicitação de chat real pelo proxy /api/chat/completions do Open WebUI.
A primeira execução pode ser visivelmente mais lenta porque o Docker pode precisar baixar a
imagem do Open WebUI e o Open WebUI pode precisar concluir sua própria configuração de inicialização a frio.
Essa lane espera uma chave de modelo live utilizável, e OPENCLAW_PROFILE_FILE
(~/.profile por padrão) é a principal forma de fornecê-la em execuções dockerizadas.
Execuções bem-sucedidas imprimem um pequeno payload JSON como { "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels é intencionalmente determinístico e não precisa de uma
conta real de Telegram, Discord ou iMessage. Ele inicializa um contêiner Gateway
semeado, inicia um segundo contêiner que cria openclaw mcp serve e então
verifica descoberta de conversas roteadas, leituras de transcrições, metadados de anexos,
comportamento da fila de eventos live, roteamento de envio de saída e notificações de canal +
permissão no estilo Claude pela ponte MCP stdio real. A verificação de notificações
inspeciona diretamente os frames MCP stdio brutos, para que o smoke valide o que a
ponte realmente emite, não apenas o que um SDK de cliente específico por acaso expõe.
test:docker:pi-bundle-mcp-tools é determinístico e não precisa de uma chave de modelo live.
Ele constrói a imagem Docker do repositório, inicia um servidor de sonda MCP stdio real
dentro do contêiner, materializa esse servidor pelo runtime MCP do pacote Pi embutido,
executa a ferramenta e então verifica se coding e messaging mantêm
ferramentas bundle-mcp, enquanto minimal e tools.deny: ["bundle-mcp"] as filtram.
test:docker:cron-mcp-cleanup é determinístico e não precisa de uma chave de modelo live.
Ele inicia um Gateway semeado com um servidor de sonda MCP stdio real, executa um
turno cron isolado e um turno filho único de /subagents spawn, e então verifica se
o processo filho MCP termina após cada execução.
Smoke manual de thread ACP em linguagem simples (não CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Mantenha este script para fluxos de regressão/debug. Ele pode ser necessário novamente para validação de roteamento de threads ACP, então não o exclua.
Variáveis de ambiente úteis:
OPENCLAW_CONFIG_DIR=...(padrão:~/.openclaw) montado em/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(padrão:~/.openclaw/workspace) montado em/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...(padrão:~/.profile) montado em/home/node/.profilee carregado antes de executar os testesOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1para verificar somente variáveis de ambiente carregadas deOPENCLAW_PROFILE_FILE, usando diretórios temporários de configuração/workspace e sem montagens externas de autenticação da CLIOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(padrão:~/.cache/openclaw/docker-cli-tools) montado em/home/node/.npm-globalpara instalações de CLI em cache dentro do Docker- Diretórios/arquivos externos de autenticação de CLI em
$HOMEsão montados como somente leitura em/host-auth...e então copiados para/home/node/...antes do início dos testes- Diretórios padrão:
.minimax - Arquivos padrão:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Execuções restritas por provedor montam somente os diretórios/arquivos necessários inferidos de
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Sobrescreva manualmente com
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=noneou uma lista separada por vírgulas comoOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Diretórios padrão:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...para restringir a execuçãoOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...para filtrar provedores dentro do contêinerOPENCLAW_SKIP_DOCKER_BUILD=1para reutilizar uma imagemopenclaw:local-liveexistente em novas execuções que não precisam de rebuildOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1para garantir que as credenciais venham do armazenamento de perfil (não do env)OPENCLAW_OPENWEBUI_MODEL=...para escolher o modelo exposto pelo gateway para o smoke do Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...para sobrescrever o prompt de verificação de nonce usado pelo smoke do Open WebUIOPENWEBUI_IMAGE=...para sobrescrever a tag fixada da imagem do Open WebUI
Sanidade da documentação
Execute verificações da documentação após edições em docs: pnpm check:docs.
Execute a validação completa de âncoras do Mintlify quando também precisar de verificações de headings na página: pnpm docs:check-links:anchors.
Regressão offline (segura para CI)
Estas são regressões de "pipeline real" sem provedores reais:
- Chamada de ferramenta do Gateway (OpenAI mock, gateway real + loop de agente):
src/gateway/gateway.test.ts(caso: "runs a mock OpenAI tool call end-to-end via gateway agent loop") - Assistente de configuração do Gateway (WS
wizard.start/wizard.next, grava configuração + autenticação aplicada):src/gateway/gateway.test.ts(caso: "runs wizard over ws and writes auth token config")
Avaliações de confiabilidade de agentes (skills)
Já temos alguns testes seguros para CI que se comportam como "avaliações de confiabilidade de agentes":
- Chamada de ferramenta mock pelo gateway real + loop de agente (
src/gateway/gateway.test.ts). - Fluxos de assistente de configuração de ponta a ponta que validam a fiação de sessão e os efeitos de configuração (
src/gateway/gateway.test.ts).
O que ainda falta para Skills (consulte Skills):
- Tomada de decisão: quando skills são listadas no prompt, o agente escolhe a skill certa (ou evita as irrelevantes)?
- Conformidade: o agente lê
SKILL.mdantes do uso e segue as etapas/args obrigatórios? - Contratos de fluxo de trabalho: cenários multi-turno que verificam ordem de ferramentas, preservação de histórico de sessão e limites de sandbox.
Avaliações futuras devem continuar priorizando determinismo:
- Um executor de cenários usando provedores mock para verificar chamadas de ferramentas + ordem, leituras de arquivos de skill e fiação de sessão.
- Uma pequena suíte de cenários focados em skills (usar vs evitar, gating, injeção de prompt).
- Avaliações live opcionais (opt-in, protegidas por env) somente depois que a suíte segura para CI estiver implementada.
Testes de contrato (forma de plugin e canal)
Testes de contrato verificam se todo plugin e canal registrado está em conformidade com seu
contrato de interface. Eles iteram por todos os plugins descobertos e executam uma suíte de
asserções de forma e comportamento. A lane unitária padrão de pnpm test intencionalmente
ignora esses arquivos de smoke e de seam compartilhada; execute os comandos de contrato explicitamente
quando tocar em superfícies compartilhadas de canal ou provedor.
Comandos
- Todos os contratos:
pnpm test:contracts - Somente contratos de canal:
pnpm test:contracts:channels - Somente contratos de provedor:
pnpm test:contracts:plugins
Contratos de canal
Localizados em src/channels/plugins/contracts/*.contract.test.ts:
- plugin - Forma básica do plugin (id, nome, capacidades)
- setup - Contrato do assistente de configuração
- session-binding - Comportamento de vinculação de sessão
- outbound-payload - Estrutura do payload de mensagem
- inbound - Tratamento de mensagens de entrada
- actions - Handlers de ações de canal
- threading - Tratamento de ID de thread
- directory - API de diretório/lista
- group-policy - Aplicação de política de grupo
Contratos de status de provedor
Localizados em src/plugins/contracts/*.contract.test.ts.
- status - Sondagens de status de canal
- registry - Forma do registro de plugins
Contratos de provedor
Localizados em src/plugins/contracts/*.contract.test.ts:
- auth - Contrato de fluxo de autenticação
- auth-choice - Escolha/seleção de autenticação
- catalog - API de catálogo de modelos
- discovery - Descoberta de plugins
- loader - Carregamento de plugins
- runtime - Runtime do provedor
- shape - Forma/interface do plugin
- wizard - Assistente de configuração
Quando executar
- Depois de alterar exports ou subpaths do plugin-sdk
- Depois de adicionar ou modificar um plugin de canal ou provedor
- Depois de refatorar registro ou descoberta de plugins
Testes de contrato executam em CI e não exigem chaves de API reais.
Adicionando regressões (orientação)
Quando você corrige um problema de provedor/modelo descoberto em live:
- Adicione uma regressão segura para CI se possível (provedor mock/stub ou capture a transformação exata do formato da solicitação)
- Se for inerentemente apenas live (limites de taxa, políticas de autenticação), mantenha o teste live restrito e opt-in via variáveis de ambiente
- Prefira mirar na menor camada que detecta o bug:
- bug de conversão/replay de solicitação do provedor → teste direto de modelos
- bug de sessão/histórico/pipeline de ferramentas do gateway → smoke live do gateway ou teste mock do gateway seguro para CI
- Guardrail de travessia de SecretRef:
src/secrets/exec-secret-ref-id-parity.test.tsderiva um alvo amostrado por classe de SecretRef a partir dos metadados do registro (listSecretTargetRegistryEntries()) e então verifica se ids de exec com segmento de travessia são rejeitados.- Se você adicionar uma nova família de alvos SecretRef
includeInPlanemsrc/secrets/target-registry-data.ts, atualizeclassifyTargetClassnesse teste. O teste falha intencionalmente em ids de alvo não classificados para que novas classes não possam ser ignoradas silenciosamente.