Testes
O OpenClaw tem três suítes Vitest (unit/integration, e2e, live) e um pequeno conjunto de runners Docker. Este documento é um guia de “como testamos”:- O que cada suíte cobre (e o que deliberadamente não cobre)
- Quais comandos executar para fluxos de trabalho comuns (local, pré-push, depuração)
- Como os testes live 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 test
- Gate de cobertura:
pnpm test:coverage - Suíte E2E:
pnpm test:e2e
- Suíte live (modelos + sondas de ferramenta/imagem do gateway):
pnpm test:live
Suítes de teste (o que roda onde)
Pense nas suítes como “realismo crescente” (e aumento de instabilidade/custo):Unit / integration (padrão)
- Comando:
pnpm test - Config:
scripts/test-parallel.mjs(executavitest.unit.config.ts,vitest.extensions.config.ts,vitest.gateway.config.ts) - Arquivos:
src/**/*.test.ts - Enquadramento:
- Testes unitários puros
- Testes de integração in-process (autenticação do gateway, roteamento, ferramentas, parsing, configuração)
- Regressões determinísticas para bugs conhecidos
- Expectativas:
- Roda em CI
- Não requer chaves reais
- Deve ser rápido e estável
- Observação sobre o pool:
- O OpenClaw usa Vitest
vmForksno Node 22/23 para shards de unidade mais rápidos. - No Node 24+, o OpenClaw volta automaticamente para
forksregulares para evitar erros de vinculação do Node VM (ERR_VM_MODULE_LINK_FAILURE/module is already linked). - Substitua manualmente com
OPENCLAW_TEST_VM_FORKS=0(forçarforks) ouOPENCLAW_TEST_VM_FORKS=1(forçarvmForks).
- O OpenClaw usa Vitest
E2E (gateway smoke)
- Comando:
pnpm test:e2e - Configuração:
vitest.e2e.config.ts - Arquivos:
src/**/*.e2e.test.ts - Padrões de execução:
- Usa Vitest
vmForkspara inicialização de arquivos mais rápida. - Usa workers adaptativos (CI: 2-4, local: 4-8).
- Executa em modo silencioso por padrão para reduzir a sobrecarga de I/O no console.
- Usa Vitest
- Substituições úteis:
OPENCLAW_E2E_WORKERS=<n>para forçar a quantidade de workers (limitado a 16).OPENCLAW_E2E_VERBOSE=1para reativar a saída detalhada no console.
- Enquadramento:
- Comportamento end-to-end do gateway com múltiplas instâncias
- Superfícies WebSocket/HTTP, pareamento de nós e networking mais pesado
- Expectativas:
- Roda em CI (quando habilitado no pipeline)
- Não requer chaves reais
- Mais partes móveis do que testes unitários (pode ser mais lento)
Live (provedores reais + modelos reais)
- Comando:
pnpm test:live - Configuração:
vitest.live.config.ts - Arquivos:
src/**/*.live.test.ts - Padrão: habilitado por
pnpm test:live(defineOPENCLAW_LIVE_TEST=1) - Enquadramento:
- “Este provedor/modelo realmente funciona hoje com credenciais reais?”
- Capturar mudanças de formato do provedor, peculiaridades de tool-calling, problemas de autenticação e comportamento de rate limit
- Expectativas:
- Não é estável para CI por design (redes reais, políticas reais do provedor, cotas, indisponibilidades)
- Custa dinheiro / usa rate limits
- Prefira rodar subconjuntos restritos em vez de “tudo”
- Execuções live buscarão
~/.profilepara obter chaves de API ausentes - Rotação de chaves Anthropic: defina
OPENCLAW_LIVE_ANTHROPIC_KEYS="sk-...,sk-..."(ouOPENCLAW_LIVE_ANTHROPIC_KEY=sk-...) ou múltiplas variáveisANTHROPIC_API_KEY*; os testes farão retry em rate limits
Qual suíte eu deveria correr?
Use esta tabela de decisão:- Editando lógica/testes: rode
pnpm test(epnpm test:coveragese você mudou bastante coisa) - Tocando em networking do gateway / protocolo WS / pareamento: adicione
pnpm test:e2e - Depurando “meu bot está fora do ar” / falhas específicas de provedor / tool calling: rode um
pnpm test:liverestrito
Live: smoke de modelos (chaves de perfil)
Os testes live são divididos em duas camadas para isolar falhas:- “Modelo direto” nos diz se o provedor/modelo responde com a chave fornecida.
- “Gateway smoke” nos diz se o pipeline completo gateway+agente funciona para esse modelo (sessões, histórico, ferramentas, política de sandbox, etc.).
Camada 1: conclusão direta do modelo (sem gateway)
- Teste:
src/agents/models.profiles.live.test.ts - Objetivo:
- Enumerar modelos descobertos
- Usar
getApiKeyForModelpara selecionar modelos para os quais você tem credenciais - Rodar uma pequena conclusão por modelo (e regressões direcionadas quando necessário)
- Como habilitar:
pnpm test:live(ouOPENCLAW_LIVE_TEST=1se chamar o Vitest diretamente)
- Defina
OPENCLAW_LIVE_MODELS=modern(ouall, alias moderno) para realmente rodar esta suíte; caso contrário, ela é pulada para manterpnpm test:livefocado no gateway smoke - Como selecionar modelos:
OPENCLAW_LIVE_MODELS=modernpara rodar a allowlist moderna (Opus/Sonnet/Haiku 4.5, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.1, Grok 4)OPENCLAW_LIVE_MODELS=allé um alias para a allowlist moderna- ou
OPENCLAW_LIVE_MODELS="openai/gpt-5.2,anthropic/claude-opus-4-6,..."(allowlist separada por vírgulas)
- Como selecionar provedores:
OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"(allowlist separada por vírgulas)
- De onde vêm as chaves:
- Por padrão: store de perfis e fallbacks de ambiente
- Defina
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1para impor apenas store de perfis
- Por que isso existe:
- Separa “API do provedor está quebrada / chave inválida” de “pipeline do agente do gateway está quebrado”
- Contém regressões pequenas e isoladas (exemplo: replay de reasoning + fluxos de tool-call do OpenAI Responses/Codex Responses)
Camada 2: Gateway + agente de desenvolvimento (o que “@openclaw” realmente faz)
- Teste:
src/gateway/gateway-models.profiles.live.test.ts - Objetivo:
- Subir um gateway in-process
- Criar/atualizar uma sessão
agent:dev:*(override de modelo por execução) - Iterar modelos-com-chaves e verificar:
- resposta “significativa” (sem ferramentas)
- uma invocação real de ferramenta funciona (sonda de leitura)
- sondas extras opcionais de ferramentas (sonda exec+read)
- caminhos de regressão do OpenAI (apenas tool-call → follow-up) continuam funcionando
- Detalhes das sondas (para explicar falhas rapidamente):
- Sonda
read: o teste escreve um arquivo nonce no workspace e pede ao agente pararead-lo e ecoar o nonce de volta. - Sonda
exec+read: o teste pede ao agente paraexec-escrever um nonce em um arquivo temporário e depoisread-lo de volta. - Sonda de imagem: o teste anexa um PNG gerado (gato + código aleatório) e espera que o modelo retorne
cat <CODE>. - Referência de implementação:
src/gateway/gateway-models.profiles.live.test.tsesrc/gateway/live-image-probe.ts.
- Sonda
- Como habilitar:
pnpm test:live(ouOPENCLAW_LIVE_TEST=1se chamar o Vitest diretamente)
- Como selecionar modelos:
- Padrão: allowlist moderna (Opus/Sonnet/Haiku 4.5, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.1, Grok 4)
OPENCLAW_LIVE_GATEWAY_MODELS=allé um alias para a allowlist moderna- Ou defina
OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"(ou lista separada por vírgulas) para restringir
- Como selecionar provedores (evite “OpenRouter tudo”):
OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"(allowlist separada por vírgulas)
- Sondas de ferramenta + imagem estão sempre ativas neste teste live:
- Sonda
read+ sondaexec+read(stress de ferramentas) - A sonda de imagem roda quando o modelo anuncia suporte a entrada de imagem
- Fluxo (alto nível):
- O teste gera um PNG minúsculo com “CAT” + código aleatório (
src/gateway/live-image-probe.ts) - Envia via
agentattachments: [{ mimeType: "image/png", content: "<base64>" }] - O Gateway faz parsing dos anexos em
images[](src/gateway/server-methods/agent.ts+src/gateway/chat-attachments.ts) - O agente embutido encaminha uma mensagem de usuário multimodal ao modelo
- Asserção: a resposta contém
cat+ o código (tolerância de OCR: pequenos erros permitidos)
- O teste gera um PNG minúsculo com “CAT” + código aleatório (
- Sonda
provider/model), execute:
Live: smoke de setup-token Anthropic
- Teste:
src/agents/anthropic.setup-token.live.test.ts - Objetivo: verificar se o setup-token do Claude Code CLI (ou um perfil de setup-token colado) consegue completar um prompt Anthropic.
- Habilitar:
pnpm test:live(ouOPENCLAW_LIVE_TEST=1se chamar o Vitest diretamente)OPENCLAW_LIVE_SETUP_TOKEN=1
- Fontes de token (escolha uma):
- Perfil:
OPENCLAW_LIVE_SETUP_TOKEN_PROFILE=anthropic:setup-token-test - Token bruto:
OPENCLAW_LIVE_SETUP_TOKEN_VALUE=sk-ant-oat01-...
- Perfil:
- Override de modelo (opcional):
OPENCLAW_LIVE_SETUP_TOKEN_MODEL=anthropic/claude-opus-4-6
Live: smoke de backend CLI (Claude Code CLI ou outros CLIs locais)
- Teste:
src/gateway/gateway-cli-backend.live.test.ts - Objetivo: validar o pipeline Gateway + agente usando um backend CLI local, sem tocar na sua configuração padrão.
- Habilitar:
pnpm test:live(ouOPENCLAW_LIVE_TEST=1se chamar o Vitest diretamente)OPENCLAW_LIVE_CLI_BACKEND=1
- Padrões:
- Modelo:
claude-cli/claude-sonnet-4-5 - Comando:
claude - Args:
["-p","--output-format","json","--dangerously-skip-permissions"]
- Modelo:
- Overrides (opcional):
OPENCLAW_LIVE_CLI_BACKEND_MODEL="claude-cli/claude-opus-4-6"OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.3-codex"OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/claude"OPENCLAW_LIVE_CLI_BACKEND_ARGS='["-p","--output-format","json","--permission-mode","bypassPermissions"]'OPENCLAW_LIVE_CLI_BACKEND_CLEAR_ENV='["ANTHROPIC_API_KEY","ANTHROPIC_API_KEY_OLD"]'OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1para enviar um anexo de imagem real (os caminhos são injetados no prompt).OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"para passar caminhos de arquivos de imagem como args da CLI em vez de injeção no prompt.OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"(ou"list") para controlar como os args de imagem são passados quandoIMAGE_ARGestá definido.OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1para enviar um segundo turno e validar o fluxo de retomada.
OPENCLAW_LIVE_CLI_BACKEND_DISABLE_MCP_CONFIG=0para manter a configuração MCP do Claude Code CLI habilitada (o padrão desabilita a config MCP com um arquivo temporário vazio).
Receitas live recomendadas
Allowlists explícitas e restritas são mais rápidas e menos instáveis:-
Modelo único, direto (sem gateway):
OPENCLAW_LIVE_MODELS="openai/gpt-5.2" pnpm test:live src/agents/models.profiles.live.test.ts
-
Modelo único, gateway smoke:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Tool calling em vários provedores:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,zai/glm-4.7,minimax/minimax-m2.1" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Foco Google (chave da API Gemini + Antigravity):
- Gemini (chave de API):
OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts - Antigravity (OAuth):
OPENCLAW_LIVE_GATEWAY_MODELS="google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-pro-high" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
- Gemini (chave de API):
google/...usa a API Gemini (chave de API).google-antigravity/...usa a ponte OAuth Antigravity (endpoint de agente no estilo Cloud Code Assist).google-gemini-cli/...usa a CLI Gemini local na sua máquina (autenticação separada + peculiaridades de ferramentas).- API Gemini vs CLI Gemini:
- API: o OpenClaw chama a API Gemini hospedada do Google via HTTP (chave de API / autenticação por perfil); é isso que a maioria dos usuários quer dizer por “Gemini”.
- CLI: o OpenClaw executa um binário
geminilocal; ele tem sua própria autenticação e pode se comportar de forma diferente (streaming/suporte a ferramentas/desalinhamento de versão).
Live: matriz de modelos (o que cobrimos)
Não há uma “lista fixa de modelos em CI” (live é opt-in), mas estes são os modelos recomendados para cobrir regularmente em uma máquina de desenvolvimento com chaves.Conjunto smoke moderno (tool calling + imagem)
Este é o conjunto de “modelos comuns” que esperamos manter funcionando:- OpenAI (não-Codex):
openai/gpt-5.2(opcional:openai/gpt-5.1) - OpenAI Codex:
openai-codex/gpt-5.3-codex(opcional:openai-codex/gpt-5.3-codex-codex) - Anthropic:
anthropic/claude-opus-4-6(ouanthropic/claude-sonnet-4-5) - Google (API Gemini):
google/gemini-3-pro-previewegoogle/gemini-3-flash-preview(evite modelos Gemini 2.x mais antigos) - Google (Antigravity):
google-antigravity/claude-opus-4-6-thinkingegoogle-antigravity/gemini-3-flash - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/minimax-m2.1
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2,openai-codex/gpt-5.3-codex,anthropic/claude-opus-4-6,google/gemini-3-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/minimax-m2.1" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
Baseline: tool calling (Read + Exec opcional)
Escolha pelo menos um por família de provedor:- OpenAI:
openai/gpt-5.2(ouopenai/gpt-5-mini) - Anthropic:
anthropic/claude-opus-4-6(ouanthropic/claude-sonnet-4-5) - Google:
google/gemini-3-flash-preview(ougoogle/gemini-3-pro-preview) - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/minimax-m2.1
- xAI:
xai/grok-4(ou o mais recente disponível) - Mistral:
mistral/… (escolha um modelo “tools” que você tenha habilitado) - Cerebras:
cerebras/… (se você tiver acesso) - LM Studio:
lmstudio/… (local; tool calling depende do modo da API)
Visão: envio de imagem (anexo → mensagem multimodal)
Inclua pelo menos um modelo com capacidade de imagem emOPENCLAW_LIVE_GATEWAY_MODELS (variantes do Claude/Gemini/OpenAI com visão, etc.) para exercitar a sonda de imagem.
Agregadores / gateways alternativos
Se você tiver chaves habilitadas, também suportamos testes via:- OpenRouter:
openrouter/...(centenas de modelos; useopenclaw models scanpara encontrar candidatos com ferramentas+imagem) - OpenCode Zen:
opencode/...(autenticação viaOPENCODE_API_KEY/OPENCODE_ZEN_API_KEY)
- Integrados:
openai,openai-codex,anthropic,google,google-vertex,google-antigravity,google-gemini-cli,zai,openrouter,opencode,xai,groq,cerebras,mistral,github-copilot - Via
models.providers(endpoints customizados):minimax(cloud/API), além de qualquer proxy compatível com OpenAI/Anthropic (LM Studio, vLLM, LiteLLM, etc.)
discoverModels(...) retorna na sua máquina + as chaves disponíveis.
Credenciais (nunca commitar)
Os testes live descobrem credenciais da mesma forma que a CLI. Implicações práticas:- Se a CLI funciona, os testes live devem encontrar as mesmas chaves.
-
Se um teste live disser “sem credenciais”, depure da mesma forma que você depuraria
openclaw models list/ seleção de modelo. -
Store de perfis:
~/.openclaw/credentials/(preferido; é o que “chaves de perfil” significa nos testes) -
Configuração:
~/.openclaw/openclaw.json(ouOPENCLAW_CONFIG_PATH)
~/.profile), execute testes locais após source ~/.profile, ou use os runners Docker abaixo (eles podem montar ~/.profile no container).
Deepgram live (transcrição de áudio)
- Teste:
src/media-understanding/providers/deepgram/audio.live.test.ts - Habilitar:
DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts
Runners Docker (checks opcionais “funciona no Linux”)
Eles executampnpm test:live dentro da imagem Docker do repo, montando seu diretório de configuração local e workspace (e fazendo source de ~/.profile se montado):
- Modelos diretos:
pnpm test:docker:live-models(script:scripts/test-live-models-docker.sh) - Gateway + agente de desenvolvimento:
pnpm test:docker:live-gateway(script:scripts/test-live-gateway-models-docker.sh) - Assistente de onboarding (TTY, scaffolding completo):
pnpm test:docker:onboard(script:scripts/e2e/onboard-docker.sh) - Networking do gateway (dois containers, auth WS + health):
pnpm test:docker:gateway-network(script:scripts/e2e/gateway-network-docker.sh) - Plugins (carregamento de extensão customizada + smoke do registry):
pnpm test:docker:plugins(script:scripts/e2e/plugins-docker.sh)
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 aplicado antes de rodar os testesOPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...para restringir a execuçãoOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1para garantir que as credenciais venham do store de perfis (não do ambiente)
Sanidade dos docs
Execute checagens de docs após edições:pnpm docs:list.
Regressão offline (segura para CI)
Estas são regressões de “pipeline real” sem provedores reais:- Tool calling do gateway (OpenAI mockado, gateway + loop do agente reais):
src/gateway/gateway.tool-calling.mock-openai.test.ts - Assistente do gateway (WS
wizard.start/wizard.next, grava configuração + autenticação aplicada):src/gateway/gateway.wizard.e2e.test.ts
Avaliações de confiabilidade do agente (skills)
Já temos alguns testes seguros para CI que se comportam como “avaliações de confiabilidade do agente”:- Tool-calling mockado através do loop real do gateway + agente (
src/gateway/gateway.tool-calling.mock-openai.test.ts). - Fluxos end-to-end do assistente que validam o encadeamento de sessões e efeitos de configuração (
src/gateway/gateway.wizard.e2e.test.ts).
- 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 de usar e segue os passos/args exigidos? - Contratos de workflow: cenários multi-turn que verificam ordem de ferramentas, carryover do histórico da sessão e limites de sandbox.
- Um runner de cenários usando provedores mock para verificar chamadas de ferramentas + ordem, leituras de arquivos de skill e encadeamento de sessões.
- Um pequeno conjunto de cenários focados em skills (usar vs evitar, gating, prompt injection).
- Avaliações live opcionais (opt-in, controladas por env) somente depois que a suíte segura para CI estiver pronta.
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 (mock/stub do provedor, ou capture a transformação exata do formato da requisição)
- Se for inerentemente apenas live (rate limits, políticas de auth), mantenha o teste live restrito e opt-in via variáveis de ambiente
- Prefira atingir a menor camada que captura o bug:
- bug de conversão/replay de requisição do provedor → teste de modelos diretos
- bug no pipeline de sessão/histórico/ferramentas do gateway → gateway live smoke ou teste mockado do gateway seguro para CI