Testing and CI
Testes
- Kit completo de testes (suítes, testes ao vivo, Docker): Testes
- Validação de atualizações e pacotes de plugins: Testes de atualizações e plugins
Padrão do agente
As sessões do agente executam um ou alguns testes focados e verificações estáticas de baixo custo localmente somente para fontes confiáveis e quando a instalação de dependências existente está pronta. Nunca execute localmente ferramentas de repositórios não confiáveis. Suítes maiores, gates de alterações com distribuição de verificação de tipos/lint, builds, Docker, lanes de pacotes, E2E, comprovação ao vivo e validação multiplataforma são executados remotamente pelo Crabbox. Comprovações pesadas de mantenedores confiáveis usam o Blacksmith Testbox por padrão. O fluxo de trabalho configurado do Testbox carrega credenciais, portanto código de colaboradores não confiáveis ou de forks deve usar CI de fork sem segredos ou, em vez disso, um Crabbox direto e sanitizado na AWS.
Não faça pré-aquecimento para trabalhos previstos. Adquira o backend sob demanda quando o
primeiro comando pesado estiver pronto, reutilize o id tbx_... retornado nos comandos pesados
posteriores, sincronize o checkout atual em cada execução e interrompa-o antes da entrega.
Após a primeira reutilização bem-sucedida, o wrapper registra a base, as dependências
e a impressão digital do fluxo de trabalho do Testbox da concessão em .crabbox/testbox-leases/.
Edições apenas no código-fonte continuam reutilizando a máquina aquecida. Uma alteração na base de mesclagem, no lockfile,
na entrada do gerenciador de pacotes, no wrapper ou no fluxo de trabalho do Testbox falha de forma segura e exige uma
nova concessão. Cada execução ainda sincroniza o checkout atual.
OPENCLAW_TESTBOX_ALLOW_STALE=1 destina-se somente a diagnósticos intencionais, não à
comprovação de versões.
Os comandos de teste local abaixo destinam-se a fluxos de trabalho humanos e comprovações limitadas de agentes. A indisponibilidade do provedor remoto deve ser informada; ela não concede permissão para executar silenciosamente um gate local abrangente.
Para comprovações pesadas não confiáveis, aqueça sob demanda com --provider aws. Cada execução deve definir
CRABBOX_ENV_ALLOW=CI, passar --provider aws --no-hydrate e usar
um HOME remoto temporário novo antes de instalar dependências ou executar
testes. Use uma concessão recém-aquecida dedicada a essa fonte não confiável; nunca reutilize
uma concessão confiável ou previamente carregada com credenciais. Inicie um binário Crabbox confiável instalado
a partir de um checkout main limpo e confiável e busque somente o PR remoto com
--fresh-pr; nunca execute localmente o wrapper ou a configuração do checkout não confiável.
Remova a definição de CRABBOX_AWS_INSTANCE_PROFILE e falhe de forma segura, a menos que o
aws.instanceProfile resolvido esteja vazio. Antes de qualquer instalação/teste, use ferramentas
confiáveis com caminho absoluto para exigir um token IMDSv2, comprovar que o endpoint de credenciais
IAM retorna 404 e verificar se o git rev-parse HEAD remoto é igual ao SHA completo
do head do PR revisado. Vincule a concessão a esse SHA e interrompa/reaqueça quando o head
mudar. Envie o scripts/crabbox-untrusted-bootstrap.sh confiável a partir do
main limpo junto com --fresh-pr; ele instala versões fixadas do Node/pnpm, verifica o SHA
e a versão fixada do gerenciador de pacotes, isola HOME, instala dependências e então executa
o teste solicitado. Se o broker não puder comprovar a ausência de uma função ou se não existir um PR remoto,
use CI de fork sem segredos. Não use hydrate-github, --no-sync nem um
fluxo de trabalho do Testbox carregado com credenciais.
Remova todas as substituições de CRABBOX_TAILSCALE*, force --network public --tailscale=false, limpe os sinalizadores de nó de saída/LAN e exija que crabbox inspect
informe rede pública sem estado do Tailscale antes de enviar qualquer script.
Ordem local de rotina
pnpm test:changedpara comprovação do Vitest no escopo alterado.pnpm test <path-or-filter>para um arquivo, diretório ou destino explícito.pnpm testsomente quando for necessário intencionalmente executar a suíte local completa do Vitest.
Em uma árvore de trabalho do Codex ou em um checkout vinculado/esparso, os agentes evitam executar diretamente e localmente
pnpm test* / pnpm check* / pnpm crabbox:run:
- Comprovação focada e limitada com dependências prontas:
node scripts/run-vitest.mjs <path-or-filter>. - Verificação de alterações com classificação primeiro:
node scripts/check-changed.mjs; planos somente de documentação, sem alterações e de metadados pequenos permanecem locais quando as dependências estão prontas, enquanto planos pesados ou com dependências ausentes são delegados ao Testbox. - Comprovação abrangente explícita com concessão mantida:
node scripts/crabbox-wrapper.mjs run --provider blacksmith-testbox ... -- env OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 corepack pnpm check:changed, para que o pnpm seja executado dentro do Testbox. - O
exitCodefinal do wrapper e o JSON de temporização são o resultado do comando. Uma execução delegada do Blacksmith GitHub Actions pode exibircancelledapós um comando SSH bem-sucedido porque o Testbox é interrompido fora da ação de keepalive; verifique o resumo do wrapper e a saída do comando antes de considerar isso uma falha. OPENCLAW_HEAVY_CHECK_LOCK_SCOPE=worktree <local-heavy-check command>: mantém a serialização de verificações pesadas dentro da árvore de trabalho atual, em vez do diretório comum do Git, para comandos comopnpm check:changedepnpm test ...direcionado. Use-o somente em hosts locais de alta capacidade quando executar intencionalmente verificações independentes em árvores de trabalho vinculadas.
Comandos principais
As execuções do wrapper de testes terminam com um breve resumo [test] passed|failed|skipped ... in ...; a linha de duração do próprio Vitest permanece como o detalhe por shard.
| Comando | O que faz |
|---|---|
pnpm test |
Destinos explícitos de arquivo/diretório são encaminhados por lanes do Vitest com escopo definido. Execuções sem destino são comprovações da suíte completa: grupos fixos de shards se expandem em configurações folha para execução paralela local, e a distribuição esperada de shards é exibida antes do início. O grupo de extensões sempre se expande em configurações de shard por extensão, em vez de um único processo gigante do projeto raiz. |
pnpm test:changed |
Execução inteligente e econômica de testes alterados: destinos precisos provenientes de edições diretas em testes, arquivos *.test.ts irmãos, mapeamentos explícitos de código-fonte e o grafo local de importações. Alterações abrangentes/de configuração/de pacote são ignoradas, a menos que sejam mapeadas para testes precisos. |
OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed |
Execução abrangente explícita de testes alterados; use quando uma edição no harness/configuração/pacote de testes precisar recorrer ao comportamento mais abrangente de testes alterados do Vitest. |
pnpm test:force |
Libera a porta configurada do Gateway do OpenClaw (padrão 18789) e então executa a suíte completa com uma porta isolada do Gateway, para que os testes de servidor não entrem em conflito com uma instância em execução. |
pnpm test:coverage |
Gera um relatório informativo de cobertura V8 para a lane de unidade padrão (vitest.unit.config.ts); nenhum limite de cobertura é imposto. |
pnpm test:coverage:changed |
Cobertura de unidade somente para arquivos alterados desde origin/main. |
pnpm changed:lanes |
Mostra as lanes arquiteturais acionadas pelo diff em relação a origin/main. |
pnpm check:changed |
Classifica as lanes alteradas antes de escolher a execução. Planos somente de documentação, sem alterações e de metadados pequenos permanecem locais quando as dependências estão prontas; planos com distribuição de verificação de tipos/lint, outras lanes pesadas ou dependências locais ausentes são delegados ao Crabbox/Testbox fora da CI. Não executa o Vitest; use pnpm test:changed ou pnpm test <target> para comprovação de testes. |
Estado de teste compartilhado e auxiliares de processo
src/test-utils/openclaw-test-state.ts: use no Vitest quando um teste precisar deHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH, fixture de configuração, espaço de trabalho, diretório do agente ou armazenamento de perfis de autenticação isolados.pnpm test:env-mutations:report: relatório não bloqueante de testes/harnesses que modificam diretamenteHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH,OPENCLAW_WORKSPACE_DIRou chaves de ambiente relacionadas. Use-o para encontrar candidatos à migração para o auxiliar de estado de teste compartilhado.test/helpers/openclaw-test-instance.ts: testes E2E no nível do processo que precisam de um Gateway em execução, ambiente da CLI, captura de logs e limpeza em um só lugar.- Lanes E2E de Docker/Bash que carregam
scripts/lib/docker-e2e-image.shpodem passardocker_e2e_test_state_shell_b64 <label> <scenario>para o contêiner e decodificá-lo comscripts/lib/openclaw-e2e-instance.sh; scripts com múltiplos diretórios pessoais podem passardocker_e2e_test_state_function_b64e chamaropenclaw_test_state_create <label> <scenario>em cada fluxo.node scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --jsongrava um arquivo de ambiente do host que pode ser carregado (o--antes decreateimpede que runtimes mais recentes do Node tratem--env-filecomo um sinalizador do Node). Lanes que iniciam um Gateway podem carregarscripts/lib/openclaw-e2e-instance.shpara resolução do ponto de entrada, inicialização simulada da OpenAI, execução em primeiro plano/segundo plano, sondagens de prontidão, exportação do ambiente de estado, despejos de logs e limpeza de processos.
Lanes da interface de controle, TUI e extensões
- E2E simulado da Control UI:
pnpm test:ui:e2eexecuta a faixa do Vitest + Playwright que inicia a Control UI do Vite e conduz uma página real do Chromium em relação a um WebSocket simulado do Gateway. Os testes ficam emui/src/**/*.e2e.test.ts; os controles e mocks compartilhados ficam emui/src/test-helpers/control-ui-e2e.ts.pnpm test:e2einclui essa faixa. As execuções de agentes usam Testbox/Crabbox por padrão, incluindo provas direcionadas; usenode scripts/run-vitest.mjs run --config test/vitest/vitest.ui-e2e.config.ts --configLoader runner ui/src/ui/e2e/chat-flow.e2e.test.tsapenas como fallback local explícito. - Testes PTY da TUI:
node scripts/run-vitest.mjs run --config test/vitest/vitest.tui-pty.config.tsexecuta a faixa PTY rápida com backend falso.OPENCLAW_TUI_PTY_INCLUDE_LOCAL=1oupnpm tui:pty:test:watch --mode localexecuta o smoke mais lento detui --local, que simula apenas o endpoint externo do modelo. Verifique texto visível estável ou chamadas de fixtures, não snapshots ANSI brutos. pnpm test:extensionsepnpm test extensionsexecutam todos os shards de extensões/plugins. Plugins de canal pesados, o plugin de navegador e a OpenAI são executados como shards dedicados; os demais grupos de plugins permanecem agrupados.pnpm test extensions/<id>executa uma faixa de plugin incluído.- Arquivos-fonte com testes irmãos são mapeados para esse teste irmão antes de recorrer a globs de diretório mais amplos. Edições de auxiliares em
src/channels/plugins/contracts/test-helpers,src/plugin-sdk/test-helpersesrc/plugins/contractsusam um grafo de importação local para executar os testes que os importam, em vez de executar amplamente todos os shards quando o caminho da dependência é preciso. - Alvos de diretórios de contratos se distribuem entre suas faixas de contrato:
pnpm test src/channels/plugins/contractsexecuta as quatro configurações de contrato de canal, epnpm test src/plugins/contractsexecuta a configuração de contratos de plugins, pois os projetos genéricoschannels/pluginsexcluemcontracts/**. auto-replyé dividido em três configurações dedicadas (core,top-level,reply) para que o harness de respostas não domine os testes mais leves de status/token/auxiliares de nível superior.- Arquivos de teste selecionados de
plugin-sdkecommandssão direcionados por faixas leves dedicadas que mantêm apenastest/setup.ts, deixando os casos pesados de runtime em suas faixas existentes. - A configuração básica do Vitest usa por padrão
pool: "threads"eisolate: false, com o executor compartilhado não isolado habilitado nas configurações do repositório. pnpm test:channelsexecutavitest.channels.config.ts.
Gateway e E2E
- A integração do Gateway é opcional:
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm testoupnpm test:gateway. pnpm test:e2e: agregado E2E do repositório =pnpm test:e2e:gateway && pnpm test:ui:e2e.pnpm test:e2e:gateway: testes smoke de ponta a ponta do Gateway (emparelhamento de várias instâncias de WS/HTTP/Node). Usa por padrãothreads+isolate: false, com workers adaptativos emvitest.e2e.config.ts; ajuste comOPENCLAW_E2E_WORKERS=<n>e habilite logs detalhados comOPENCLAW_E2E_VERBOSE=1.pnpm test:live: testes ao vivo de provedores (Claude/Minimax/DeepSeek/z.ai/etc., condicionados por*.live.test.ts). Requer chaves de API eLIVE=1(ouOPENCLAW_LIVE_TEST=1) para não serem ignorados; saída detalhada comOPENCLAW_LIVE_TEST_QUIET=0.
Suíte Docker completa (pnpm test:docker:all)
Compila a imagem compartilhada de testes ao vivo, empacota o OpenClaw uma vez como um tarball npm, compila/reutiliza uma imagem básica de executor Node/Git e uma imagem funcional que instala esse tarball em /app e, em seguida, executa faixas smoke do Docker por meio de um agendador ponderado. scripts/package-openclaw-for-docker.mjs é o único empacotador local/de CI e valida o tarball e dist/postinstall-inventory.json antes que o Docker os consuma.
- Imagem básica (
OPENCLAW_DOCKER_E2E_BARE_IMAGE): faixas de instalador/atualização/dependências de plugins; monta o tarball pré-compilado em vez de fontes copiadas do repositório. - Imagem funcional (
OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE): faixas normais de funcionalidade do aplicativo compilado. - Definições das faixas:
scripts/lib/docker-e2e-scenarios.mjs. Planejador:scripts/lib/docker-e2e-plan.mjs. Executor:scripts/test-docker-all.mjs. node scripts/test-docker-all.mjs --plan-jsonemite o plano de CI controlado pelo agendador (faixas, tipos de imagem, necessidades de pacote/imagem ao vivo, cenários de estado, verificações de credenciais) sem compilar nem executar o Docker.
Controles de agendamento (variáveis de ambiente, padrões entre parênteses):
| Variável de ambiente | Padrão | Finalidade |
|---|---|---|
OPENCLAW_DOCKER_ALL_PARALLELISM |
10 | Slots de processos. |
OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM |
10 | Pool final sensível a provedores. |
OPENCLAW_DOCKER_ALL_LIVE_LIMIT |
9 | Limite de faixas pesadas de provedores ao vivo. |
OPENCLAW_DOCKER_ALL_NPM_LIMIT |
5 | Limite de faixas de recursos npm. |
OPENCLAW_DOCKER_ALL_SERVICE_LIMIT |
7 | Limite de faixas de recursos de serviços. |
OPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT / _CODEX_LIMIT / _GEMINI_LIMIT / _DROID_LIMIT / _OPENCODE_LIMIT |
4 | Limites de faixas pesadas por provedor. |
OPENCLAW_DOCKER_ALL_LIVE_OPENAI_LIMIT / _TELEGRAM_LIMIT |
1 | Limites mais restritos por provedor. |
OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT / OPENCLAW_DOCKER_ALL_DOCKER_LIMIT |
- | Substituição para hosts maiores. |
OPENCLAW_DOCKER_ALL_START_STAGGER_MS |
2000 | Atraso entre os inícios das faixas, evitando tempestades de criação no daemon local do Docker. |
OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS |
7,200,000 (120 min) | Tempo limite de fallback por faixa; faixas selecionadas ao vivo/finais usam limites mais rígidos. |
OPENCLAW_DOCKER_ALL_LIVE_RETRIES |
1 | Novas tentativas para falhas transitórias de provedores ao vivo. |
OPENCLAW_DOCKER_ALL_DRY_RUN |
off | Imprime o manifesto das faixas sem executar o Docker. |
OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS |
30000 | Intervalo de impressão do status das faixas ativas. |
OPENCLAW_DOCKER_ALL_TIMINGS |
on | Reutiliza .artifacts/docker-tests/lane-timings.json para ordenar da mais longa para a mais curta; defina como 0 para desabilitar. |
OPENCLAW_DOCKER_ALL_LIVE_MODE |
- | skip apenas para faixas determinísticas/locais, only apenas para faixas de provedores ao vivo. Aliases: pnpm test:docker:local:all, pnpm test:docker:live:all. O modo somente ao vivo combina as faixas ao vivo principais e finais em um único pool ordenado da mais longa para a mais curta, para que os buckets de provedores agrupem trabalhos do Claude/Codex/Gemini. |
OPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS |
180 | Tempo limite de configuração do Docker no backend da CLI. |
O padrão de variável de ambiente para limites de recursos é OPENCLAW_DOCKER_ALL_<RESOURCE>_LIMIT (nome do recurso em maiúsculas, caracteres não alfanuméricos convertidos em _).
Outro comportamento: o executor realiza uma verificação preliminar do Docker por padrão, limpa contêineres E2E obsoletos do OpenClaw, compartilha caches das ferramentas CLI dos provedores entre lanes compatíveis e deixa de agendar novas lanes agrupadas após a primeira falha, a menos que OPENCLAW_DOCKER_ALL_FAIL_FAST=0 esteja definido. Se uma lane exceder o limite efetivo de peso/recursos em um host com baixo paralelismo, ela ainda poderá iniciar a partir de um pool vazio e ser executada sozinha até liberar capacidade. Os logs por lane, summary.json, failures.json e as durações das fases são gravados em .artifacts/docker-tests/<run-id>/; use pnpm test:docker:timings <summary.json> para inspecionar lanes lentas e pnpm test:docker:rerun <run-id|summary.json|failures.json> para exibir comandos econômicos de reexecução direcionada.
Lanes Docker relevantes
| Comando | Verifica |
|---|---|
pnpm test:docker:browser-cdp-snapshot |
Contêiner E2E de origem com Chromium, CDP bruto e Gateway isolado; os instantâneos de funções do CDP de browser doctor --deep incluem URLs de links, elementos clicáveis promovidos pelo cursor, referências de iframes e metadados de frames. |
pnpm test:docker:skill-install |
Instala o tarball empacotado em um executor Docker básico com skills.install.allowUploadedArchives: false, resolve um slug de skill atual por meio de uma pesquisa em tempo real no ClawHub, instala via openclaw skills install e verifica SKILL.md, .clawhub/origin.json, .clawhub/lock.json e skills info --json. |
pnpm test:docker:live-cli-backend:claude, :claude:resume, :claude:mcp |
Sondagens em tempo real direcionadas do backend da CLI; o Gemini tem os aliases correspondentes :resume e :mcp. |
pnpm test:docker:openwebui |
OpenClaw + Open WebUI em Docker: faz login, verifica /api/models e executa um chat real com proxy por meio de /api/chat/completions. Requer uma chave de modelo em tempo real utilizável e baixa uma imagem externa; não se espera que seja estável na CI como as suítes unitárias/E2E. |
pnpm test:docker:mcp-channels |
Contêiner do Gateway com dados iniciais e um contêiner cliente que inicia openclaw mcp serve: descoberta de conversas roteadas, leitura de transcrições, metadados de anexos, comportamento da fila de eventos em tempo real, roteamento de envios de saída e notificações de canal e permissão no estilo Claude pela ponte stdio real (a asserção lê diretamente os frames MCP brutos do stdio). |
pnpm test:docker:upgrade-survivor |
Instala o tarball empacotado sobre uma fixture antiga e modificada de usuário, executa a atualização do pacote e o doctor não interativo sem chaves ativas de provedores/canais, inicia um Gateway de loopback e verifica se agentes, configuração de canais, listas de permissões de plugins, arquivos de workspace/sessão, estado obsoleto de dependências de plugins legados, inicialização e status de RPC permanecem intactos. |
pnpm test:docker:published-upgrade-survivor |
Instala openclaw@latest por padrão, adiciona arquivos iniciais realistas de um usuário existente, configura por meio de uma receita incorporada de openclaw config set, atualiza para o tarball empacotado, executa o doctor não interativo, grava .artifacts/upgrade-survivor/summary.json e verifica /healthz, /readyz e o status de RPC. Substitua com OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, expanda uma matriz com OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS ou adicione fixtures de cenário com OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues (inclui configured-plugin-installs e stale-source-plugin-shadow). O Package Acceptance os disponibiliza como published_upgrade_survivor_baseline(s) / _scenarios e resolve metatokens como last-stable-4 ou all-since-2026.4.23. |
pnpm test:docker:update-migration |
Harness de sobrevivência à atualização publicada no cenário plugin-deps-cleanup, começando em openclaw@2026.4.23 por padrão. O fluxo de trabalho Update Migration expande isso com baselines=all-since-2026.4.23 para comprovar a limpeza das dependências de plugins configurados fora da CI de versão completa. |
pnpm test:docker:plugins |
Teste rápido de instalação/atualização para caminho local, file:, pacotes do registro npm com dependências elevadas, referências móveis do git, fixtures do ClawHub, atualizações do marketplace e ativação/inspeção do pacote Claude. |
Gate local de PR
Para verificações locais de gate/integração de PR, execute:
pnpm check:changedpnpm checkpnpm check:test-typespnpm buildpnpm testpnpm check:docs
Se pnpm test apresentar uma falha intermitente em um host sobrecarregado, execute-o novamente uma vez antes de tratar isso como uma regressão e, em seguida, isole com pnpm test <path/to/test>. Para hosts com restrição de memória:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed
Ferramentas de desempenho de testes
pnpm test:perf:imports: habilita relatórios de duração e detalhamento de importações do Vitest, mantendo o roteamento de lanes com escopo definido para destinos explícitos de arquivos/diretórios.pnpm test:perf:imports:changedrestringe o mesmo perfilamento aos arquivos alterados desdeorigin/main.pnpm test:perf:changed:bench -- --ref <git-ref>compara o desempenho do caminho roteado no modo de alterações com a execução nativa do projeto raiz para o mesmo diff do git confirmado;pnpm test:perf:changed:bench -- --worktreecompara o desempenho do conjunto atual de alterações da árvore de trabalho sem exigir um commit prévio.pnpm test:perf:profile:maingrava um perfil de CPU para a thread principal do Vitest (.artifacts/vitest-main-profile);pnpm test:perf:profile:runnergrava perfis de CPU e heap para o executor de testes unitários (.artifacts/vitest-runner-profile).pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json: executa em série cada configuração folha do Vitest da suíte completa e grava dados de duração agrupados, além de artefatos JSON/log por configuração. Por padrão, os relatórios da suíte completa isolam os arquivos para que grafos de módulos retidos e pausas de GC de arquivos anteriores não sejam atribuídos a asserções posteriores; passe-- --no-isolatesomente ao analisar intencionalmente o acúmulo em workers compartilhados. O agente de desempenho de testes usa isso como linha de base antes de tentar corrigir testes lentos.pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.jsoncompara relatórios agrupados após uma alteração voltada ao desempenho.- As execuções fragmentadas da suíte completa, das extensões e dos padrões de inclusão atualizam os dados de duração locais em
.artifacts/vitest-shard-timings.json; execuções posteriores de configurações completas usam essas durações para equilibrar fragmentos lentos e rápidos. Os fragmentos de CI com padrões de inclusão acrescentam o nome do fragmento à chave de duração, o que mantém visíveis as durações dos fragmentos filtrados sem substituir os dados de duração da configuração completa. DefinaOPENCLAW_TEST_PROJECTS_TIMINGS=0para ignorar o artefato de duração local.
Benchmarks
Latência do modelo (scripts/bench-model.ts)
pnpm tsx scripts/bench-model.ts --runs 10Variáveis de ambiente opcionais: MINIMAX_API_KEY, MINIMAX_BASE_URL, MINIMAX_MODEL, ANTHROPIC_API_KEY. Prompt padrão: "Responda com uma única palavra: ok. Sem pontuação ou texto adicional."
Inicialização da CLI (scripts/bench-cli-startup.ts)
pnpm test:startup:benchpnpm test:startup:bench:smokepnpm test:startup:bench:savepnpm test:startup:bench:updatepnpm test:startup:bench:checkpnpm tsx scripts/bench-cli-startup.ts --runs 12pnpm tsx scripts/bench-cli-startup.ts --preset real --case status --case gatewayStatus --runs 3pnpm tsx scripts/bench-cli-startup.ts --entry openclaw.mjs --entry-secondary dist/entry.js --preset allPredefinições:
startup:--version,--help,health,health --json,status --json,statusreal:health,status,status --json,sessions,sessions --json,tasks --json,tasks list --json,tasks audit --json,agents list --json,gateway status,gateway status --json,gateway health --json,config get gateway.portall: ambas as predefinições combinadas
A saída inclui sampleCount, média, p50, p95, mínimo/máximo, distribuição de códigos de saída/sinais e RSS máximo por comando. --cpu-prof-dir / --heap-prof-dir gravam perfis do V8 por execução.
Saída salva: pnpm test:startup:bench:smoke grava .artifacts/cli-startup-bench-smoke.json; pnpm test:startup:bench:save grava .artifacts/cli-startup-bench-all.json (runs=5 warmup=1). Fixture versionada: test/fixtures/cli-startup-bench.json, atualizada por pnpm test:startup:bench:update, comparada por pnpm test:startup:bench:check.
Inicialização do Gateway (scripts/bench-gateway-startup.ts)
Por padrão, usa o ponto de entrada compilado da CLI em dist/entry.js; execute pnpm build primeiro. Passe --entry scripts/run-node.mjs para medir o executor do código-fonte em vez disso e mantenha esses resultados separados das linhas de base do ponto de entrada compilado.
pnpm test:startup:gateway -- --runs 5 --warmup 1pnpm test:startup:gateway -- --case skipChannels --case fiftyPlugins --runs 5node --import tsx scripts/bench-gateway-startup.ts --case default --runs 5 --output .artifacts/gateway-startup.jsonIDs dos casos: default, skipChannels (inicialização dos canais ignorada), oneInternalHook, allInternalHooks, fiftyPlugins (50 plugins de manifesto), fiftyStartupLazyPlugins (50 plugins de manifesto com inicialização adiada).
A saída inclui a primeira saída do processo, /healthz, /readyz, tempo do log de escuta HTTP, tempo do log de prontidão do Gateway, tempo de CPU, proporção de núcleos de CPU, RSS máximo, heap, métricas de rastreamento da inicialização, atraso do loop de eventos e métricas detalhadas da tabela de consulta de plugins. O script define OPENCLAW_GATEWAY_STARTUP_TRACE=1 no ambiente do Gateway filho.
/healthz indica atividade (o servidor HTTP consegue responder). /readyz indica prontidão operacional (os processos auxiliares dos plugins de inicialização, os canais e o trabalho pós-anexação crítico para a prontidão foram concluídos). Os hooks de inicialização são despachados de forma assíncrona e não fazem parte da garantia de prontidão. O tempo do log de prontidão é o carimbo de data/hora interno do Gateway, útil para atribuição no lado do processo, mas não substitui a sondagem externa /readyz.
Use a saída JSON ou --output ao comparar alterações. Use --cpu-prof-dir somente depois que a saída de rastreamento indicar trabalho de importação, compilação ou limitado pela CPU que os tempos das fases, isoladamente, não conseguem explicar.
Reinicialização do Gateway (scripts/bench-gateway-restart.ts)
Somente macOS e Linux (usa SIGUSR1 para reinicializações dentro do processo; falha imediatamente no Windows). Usa o mesmo ponto de entrada compilado por padrão e a mesma substituição --entry scripts/run-node.mjs da inicialização do Gateway acima.
pnpm test:restart:gateway -- --case skipChannels --runs 1 --restarts 5pnpm test:restart:gateway -- --case default --runs 3 --restarts 3 --warmup 1IDs dos casos: skipChannels, skipChannelsAcpxProbe (sondagem de inicialização do ACPX ativada), skipChannelsNoAcpxProbe (sondagem desativada), default, fiftyPlugins.
A saída inclui o próximo /healthz, o próximo /readyz, tempo de inatividade, tempo de prontidão da reinicialização, CPU, RSS, métricas de rastreamento da inicialização do processo substituto e métricas de rastreamento da reinicialização para tratamento de sinais, drenagem do trabalho ativo, fases de fechamento, próxima inicialização, tempo de prontidão e snapshots de memória. O script define OPENCLAW_GATEWAY_STARTUP_TRACE=1 e OPENCLAW_GATEWAY_RESTART_TRACE=1.
Use este benchmark quando uma alteração afetar a sinalização de reinicialização, os manipuladores de fechamento, a inicialização após reinicialização, o encerramento de processos auxiliares, a transferência do serviço ou a prontidão após a reinicialização. Comece com skipChannels para isolar a mecânica do Gateway da inicialização dos canais; use default ou casos com muitos plugins somente depois que o caso restrito explicar o caminho da reinicialização. As métricas de rastreamento são indícios de atribuição, não vereditos — avalie uma alteração de reinicialização com base em várias amostras, no intervalo correspondente do componente proprietário, no comportamento de /healthz//readyz e no contrato de reinicialização visível ao usuário.
E2E de integração inicial (Docker)
Opcional; necessário apenas para testes de fumaça da integração inicial em contêineres. Fluxo completo de inicialização a frio em um contêiner Linux limpo:
scripts/e2e/onboard-docker.shConduz o assistente interativo por meio de um pseudo-TTY, verifica os arquivos de configuração, espaço de trabalho e sessão, depois inicia o Gateway e executa openclaw health.
Teste de fumaça da importação de QR (Docker)
Garante que o helper mantido de runtime de QR seja carregado nos runtimes Node compatíveis com Docker (Node 24 por padrão, compatível com Node 22):
pnpm test:docker:qr