Testing
Testes: atualizações e plugins
Esta é a lista de verificação dedicada para validação de atualizações e plugins. O objetivo é simples: provar que o pacote instalável consegue atualizar o estado real do usuário, reparar estado legado obsoleto por meio de doctor e ainda instalar, carregar, atualizar e desinstalar plugins a partir das origens compatíveis.
Para o mapa mais amplo do executor de testes, consulte Testes. Para chaves de provedores ao vivo e suítes que tocam a rede, consulte Testes ao vivo.
O que protegemos
Os testes de atualização e plugin protegem estes contratos:
- Um tarball de pacote está completo, tem um
dist/postinstall-inventory.jsonválido e não depende de arquivos do repositório descompactados. - Um usuário pode migrar de um pacote publicado mais antigo para o pacote candidato sem perder configuração, agentes, sessões, workspaces, listas de permissões de plugins ou configuração de canal.
openclaw doctor --fix --non-interactiveé responsável por caminhos de limpeza e reparo legados. A inicialização não deve ganhar migrações de compatibilidade ocultas para estado obsoleto de plugin.- Instalações de plugins funcionam a partir de diretórios locais, repositórios git, pacotes npm e o caminho do registro ClawHub.
- Dependências npm de plugins são instaladas na raiz npm gerenciada, verificadas antes da confiança e removidas por meio do npm durante a desinstalação para que dependências içadas não permaneçam.
- A atualização de plugin é estável quando nada mudou: registros de instalação, origem resolvida, layout de dependências instaladas e estado habilitado permanecem intactos.
Prova local durante o desenvolvimento
Comece de forma restrita:
pnpm changed:lanes --json
pnpm check:changed
pnpm test:changed
Para alterações em instalação, desinstalação, dependências ou inventário de pacote de plugins, execute também os testes focados que cobrem a interface editada:
pnpm test src/plugins/uninstall.test.ts src/infra/package-dist-inventory.test.ts test/scripts/package-acceptance-workflow.test.ts
Antes que qualquer faixa Docker de pacote consuma um tarball, prove o artefato do pacote:
pnpm release:check
release:check executa verificações de desvio de configuração/docs/API, grava o inventário de distribuição do pacote, executa npm pack --dry-run, rejeita arquivos empacotados proibidos, instala o tarball em um prefixo temporário, executa postinstall e faz smoke test dos pontos de entrada dos canais empacotados.
Faixas Docker
As faixas Docker são a prova em nível de produto. Elas instalam ou atualizam um pacote real dentro de contêineres Linux e validam o comportamento por meio de comandos da CLI, inicialização do Gateway, sondagens HTTP, status RPC e estado do sistema de arquivos.
Use faixas focadas durante a iteração:
pnpm test:docker:plugins
pnpm test:docker:plugin-lifecycle-matrix
pnpm test:docker:plugin-update
pnpm test:docker:upgrade-survivor
pnpm test:docker:published-upgrade-survivor
pnpm test:docker:update-restart-auth
pnpm test:docker:update-migration
Faixas importantes:
test:docker:pluginsvalida smoke test de instalação de plugin, instalações de pasta local, comportamento de pular atualização de pasta local, pastas locais com dependências pré-instaladas, instalações de pacotefile:, instalações git com execução da CLI, atualizações git com referência móvel, instalações de registro npm com dependências transitivas içadas, no-ops de atualização npm, instalações de fixture local ClawHub e no-ops de atualização, comportamento de atualização de marketplace e habilitação/inspeção do pacote Claude. DefinaOPENCLAW_PLUGINS_E2E_CLAWHUB=0para manter o bloco ClawHub hermético/offline.test:docker:plugin-lifecycle-matrixinstala o pacote candidato em um contêiner limpo, executa um plugin npm por instalação, inspeção, desabilitação, habilitação, upgrade explícito, downgrade explícito e desinstalação depois de excluir o código do plugin. Ela registra métricas de RSS e CPU para cada fase.test:docker:plugin-updatevalida que um plugin instalado sem alterações não é reinstalado nem perde metadados de instalação duranteopenclaw plugins update.test:docker:upgrade-survivorinstala o tarball candidato sobre uma fixture suja de usuário antigo, executa atualização de pacote mais doctor não interativo, depois inicia um Gateway de loopback e verifica a preservação de estado.test:docker:published-upgrade-survivorprimeiro instala uma baseline publicada, configura-a por meio de uma receitaopenclaw config setembutida, atualiza-a para o tarball candidato, executa doctor, verifica limpeza legada, inicia o Gateway e sonda/healthz,/readyze status RPC.test:docker:update-restart-authinstala o pacote candidato, inicia um Gateway gerenciado com autenticação por token, remove do ambiente do chamador a autenticação do gateway paraopenclaw update --yes --jsone exige que o comando de atualização candidato reinicie o Gateway antes das sondagens normais.test:docker:update-migrationé a faixa de atualização publicada com limpeza pesada. Ela começa de um estado de usuário configurado no estilo Discord/Telegram, executa doctor da baseline para que dependências de plugin configuradas tenham chance de se materializar, semeia resíduos de dependência de plugin legado para um plugin empacotado configurado, atualiza para o tarball candidato e exige que o doctor pós-atualização remova as raízes de dependência legadas.
Variantes úteis de sobrevivente de upgrade publicado:
[email protected] \
OPENCLAW_UPGRADE_SURVIVOR_SCENARIO=versioned-runtime-deps \
pnpm test:docker:published-upgrade-survivor
OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC=openclaw@latest \
OPENCLAW_UPGRADE_SURVIVOR_SCENARIO=bootstrap-persona \
pnpm test:docker:published-upgrade-survivor
Os cenários disponíveis são base, feishu-channel, bootstrap-persona, plugin-deps-cleanup, configured-plugin-installs, stale-source-plugin-shadow, tilde-log-path e versioned-runtime-deps. Em execuções agregadas, OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues expande para todos os cenários com formato de problema relatado, incluindo a migração de instalação de plugin configurado.
A migração completa de atualização é intencionalmente separada do Full Release CI. Use o workflow manual Update Migration quando a pergunta de release for "todas as releases estáveis publicadas de 2026.4.23 em diante conseguem atualizar para este candidato e limpar resíduos de dependências de plugin?":
gh workflow run update-migration.yml \
--ref main \
-f workflow_ref=main \
-f package_ref=main \
-f baselines=all-since-2026.4.23 \
-f scenarios=plugin-deps-cleanup
Package Acceptance
Package Acceptance é o gate de pacote nativo do GitHub. Ele resolve um pacote candidato em um tarball package-under-test, registra versão e SHA-256, depois executa faixas Docker E2E reutilizáveis contra exatamente esse tarball. A ref do harness do workflow é separada da ref da origem do pacote, então a lógica de teste atual pode validar releases confiáveis mais antigas.
Origens candidatas:
source=npm: validaopenclaw@beta,openclaw@latestou uma versão publicada exata.source=ref: empacota uma branch, tag ou commit confiável com o harness atual selecionado.source=url: valida um tarball HTTPS compackage_sha256obrigatório.source=artifact: reutiliza um tarball enviado por outra execução do Actions.
Full Release Validation usa source=artifact por padrão, criado a partir do SHA de release resolvido. Para prova pós-publicação, passe [email protected] para que a mesma matriz de upgrade mire o pacote npm entregue.
As verificações de release chamam Package Acceptance com o conjunto de pacote/atualização/reinicialização/plugin:
doctor-switch update-channel-switch update-corrupt-plugin upgrade-survivor published-upgrade-survivor update-restart-auth plugins-offline plugin-update
Quando o soak de release está habilitado, elas também passam:
published_upgrade_survivor_baselines=last-stable-4 2026.4.23 2026.5.2 2026.4.15
published_upgrade_survivor_scenarios=reported-issues
telegram_mode=mock-openai
Isso mantém migração de pacote, alternância de canal de atualização, tolerância a plugin gerenciado corrompido, limpeza de dependências obsoletas de plugin, cobertura de plugin offline, comportamento de atualização de plugin e QA de pacote Telegram no mesmo artefato resolvido sem fazer o gate padrão de pacote de release percorrer todas as releases publicadas.
last-stable-4 resolve para as quatro releases OpenClaw estáveis mais recentes publicadas no npm. A aceitação de pacote de release fixa 2026.4.23 como a primeira fronteira de compatibilidade de atualização de plugin, 2026.5.2 como uma fronteira de churn de arquitetura de plugin e 2026.4.15 como uma baseline mais antiga de atualização publicada de 2026.4.1x; o resolvedor remove duplicatas de pins que já estão entre as quatro mais recentes. Para cobertura exaustiva de migração de atualização publicada, use all-since-2026.4.23 no workflow Update Migration separado em vez do Full Release CI. release-history continua disponível para amostragem manual mais ampla quando você também quiser a âncora legada anterior à data.
Quando várias baselines de sobrevivente de upgrade publicado são selecionadas, o workflow Docker reutilizável divide cada baseline em seu próprio job de executor direcionado. Cada shard de baseline ainda executa o conjunto de cenários selecionado, mas logs e artefatos ficam por baseline e o tempo de execução fica limitado ao shard mais lento em vez de um grande job serial.
Execute manualmente um perfil de pacote ao validar um candidato antes da release:
gh workflow run package-acceptance.yml \
--ref main \
-f workflow_ref=main \
-f source=npm \
-f package_spec=openclaw@beta \
-f suite_profile=package \
-f published_upgrade_survivor_baselines="last-stable-4 2026.4.23 2026.5.2 2026.4.15" \
-f published_upgrade_survivor_scenarios=reported-issues \
-f telegram_mode=mock-openai
Use suite_profile=product quando a pergunta de release incluir canais MCP, limpeza de cron/subagente, pesquisa web OpenAI ou OpenWebUI. Use suite_profile=full somente quando precisar de cobertura Docker completa do caminho de release.
Padrão de release
Para candidatos de release, a pilha de prova padrão é:
pnpm check:changedepnpm test:changedpara regressões em nível de código-fonte.pnpm release:checkpara integridade do artefato de pacote.- Perfil
packagedo Package Acceptance ou as faixas de pacote personalizadas de release-check para contratos de instalação/atualização/reinicialização/plugin. - Verificações de release entre sistemas operacionais para instalador, onboarding e comportamento de plataforma específicos de SO.
- Suítes ao vivo somente quando a superfície alterada toca comportamento de provedor ou serviço hospedado.
Em máquinas de mantenedores, gates amplos e prova Docker/pacote de produto devem rodar no Testbox, salvo quando se estiver fazendo prova local explicitamente.
Compatibilidade legada
A tolerância de compatibilidade é estreita e com prazo definido:
- Pacotes até
2026.4.25, incluindo2026.4.25-beta.*, podem tolerar lacunas de metadados de pacote já entregues no Package Acceptance. - O pacote
2026.4.26publicado pode avisar sobre arquivos de carimbo de metadados de build local já entregues. - Pacotes posteriores devem satisfazer os contratos modernos. As mesmas lacunas falham em vez de avisar ou pular.
Não adicione novas migrações de inicialização para esses formatos antigos. Adicione ou estenda um reparo de doctor, depois prove-o com upgrade-survivor, published-upgrade-survivor ou update-restart-auth quando o comando de atualização for responsável pela reinicialização.
Adicionando cobertura
Ao alterar comportamento de atualização ou plugin, adicione cobertura na camada mais baixa que possa falhar pelo motivo correto:
- Lógica pura de caminho ou metadados: teste unitário ao lado da origem.
- Comportamento de inventário de pacote ou arquivo empacotado: teste
package-dist-inventoryou verificador de tarball. - Comportamento de instalação/atualização da CLI: asserção ou fixture de faixa Docker.
- Comportamento de migração de release publicada: cenário
published-upgrade-survivor. - Comportamento de reinicialização pertencente à atualização:
update-restart-auth. - Comportamento de registro/origem de pacote: fixture
test:docker:pluginsou servidor de fixture ClawHub. - Comportamento de layout ou limpeza de dependências: valide tanto a execução em runtime quanto a fronteira do sistema de arquivos. Dependências npm podem ser içadas sob a raiz npm gerenciada, então os testes devem provar que a raiz é verificada/limpa em vez de assumir uma árvore
node_moduleslocal ao pacote.
Mantenha novas fixtures Docker herméticas por padrão. Use registros de fixture locais e pacotes falsos, a menos que o objetivo do teste seja comportamento de registro ao vivo.
Triagem de falhas
Comece pela identidade do artefato:
- Resumo de Aceitação de Pacote
resolve_package: origem, versão, SHA-256 e nome do artefato. - Artefatos do Docker:
.artifacts/docker-tests/**/summary.json,failures.json, logs da lane e comandos de nova execução. - Resumo do sobrevivente de upgrade:
.artifacts/upgrade-survivor/summary.json, incluindo versão de baseline, versão candidata, cenário, tempos das fases e etapas da receita.
Prefira executar novamente a lane exata que falhou com o mesmo artefato de pacote em vez de executar novamente todo o guarda-chuva de lançamento.