Plugin SDK reference
Testes de Plugin
Referência de utilitários, padrões e aplicação de lint para testes de plugins do OpenClaw.
Utilitários de teste
Esses subcaminhos são pontos de entrada de código-fonte locais do repositório para os testes dos
plugins integrados do próprio OpenClaw. Eles não são exportações publicadas no package.json para
plugins de terceiros e podem importar o Vitest ou outras dependências de teste exclusivas do repositório.
shouldAckReaction, removeAckReactionAfterReply,} from "openclaw/plugin-sdk/channel-feedback"; bundledPluginRoot, createCliRuntimeCapture, typedCases,} from "openclaw/plugin-sdk/test-fixtures"; Prefira esses subcaminhos específicos para novos testes de plugins integrados. O barrel amplo
openclaw/plugin-sdk/testing e o alias openclaw/plugin-sdk/test-utils
existem apenas para compatibilidade legada: pnpm run lint:plugins:no-extension-test-core-imports
(scripts/check-no-extension-test-core-imports.ts) rejeita novas importações de
qualquer um deles em arquivos de teste de extensões, e ambos permanecem exclusivamente para
testes de registro de compatibilidade.
Exportações disponíveis
| Exportação | Finalidade |
|---|---|
createTestPluginApi |
Cria um mock mínimo da API de Plugin para testes unitários de registro direto. Importe de plugin-sdk/plugin-test-api |
AUTH_PROFILE_RUNTIME_CONTRACT |
Fixture compartilhada do contrato de perfil de autenticação para adaptadores nativos de runtime de agente. Importe de plugin-sdk/agent-runtime-test-contracts |
DELIVERY_NO_REPLY_RUNTIME_CONTRACT |
Fixture compartilhada do contrato de supressão de entrega para adaptadores nativos de runtime de agente. Importe de plugin-sdk/agent-runtime-test-contracts |
OUTCOME_FALLBACK_RUNTIME_CONTRACT |
Fixture compartilhada do contrato de classificação de fallback para adaptadores nativos de runtime de agente. Importe de plugin-sdk/agent-runtime-test-contracts |
createParameterFreeTool |
Cria fixtures de esquema de ferramenta dinâmica para testes de contrato de runtime nativo. Importe de plugin-sdk/agent-runtime-test-contracts |
expectChannelInboundContextContract |
Verifica o formato do contexto de entrada do canal. Importe de plugin-sdk/channel-contract-testing |
installChannelOutboundPayloadContractSuite |
Instala casos de contrato de payload de saída do canal. Importe de plugin-sdk/channel-contract-testing |
createStartAccountContext |
Cria contextos de ciclo de vida da conta do canal. Importe de plugin-sdk/channel-test-helpers |
installChannelActionsContractSuite |
Instala casos genéricos de contrato de ações de mensagem do canal. Importe de plugin-sdk/channel-test-helpers |
installChannelSetupContractSuite |
Instala casos genéricos de contrato de configuração do canal. Importe de plugin-sdk/channel-test-helpers |
installChannelStatusContractSuite |
Instala casos genéricos de contrato de status do canal. Importe de plugin-sdk/channel-test-helpers |
expectDirectoryIds |
Verifica os IDs do diretório do canal retornados por uma função de listagem de diretório. Importe de plugin-sdk/channel-test-helpers |
assertBundledChannelEntries |
Verifica se os pontos de entrada dos canais incluídos expõem o contrato público esperado. Importe de plugin-sdk/channel-test-helpers |
formatEnvelopeTimestamp |
Formata timestamps determinísticos de envelopes. Importe de plugin-sdk/channel-test-helpers |
expectPairingReplyText |
Verifica o texto da resposta de pareamento do canal e extrai seu código. Importe de plugin-sdk/channel-test-helpers |
describePluginRegistrationContract |
Instala verificações do contrato de registro de Plugin. Importe de plugin-sdk/plugin-test-contracts |
registerSingleProviderPlugin |
Registra um Plugin de provedor nos testes de fumaça do carregador. Importe de plugin-sdk/plugin-test-runtime |
registerProviderPlugin |
Captura todos os tipos de provedor de um único Plugin. Importe de plugin-sdk/plugin-test-runtime |
registerProviderPlugins |
Captura registros de provedores em vários Plugins. Importe de plugin-sdk/plugin-test-runtime |
requireRegisteredProvider |
Verifica se uma coleção de provedores contém um ID. Importe de plugin-sdk/plugin-test-runtime |
createRuntimeEnv |
Cria um ambiente simulado de runtime da CLI/do Plugin. Importe de plugin-sdk/plugin-test-runtime |
createPluginRuntimeMock |
Cria uma superfície simulada de runtime do Plugin. Importe de plugin-sdk/plugin-test-runtime |
createPluginSetupWizardStatus |
Cria auxiliares de status de configuração para Plugins de canal. Importe de plugin-sdk/plugin-test-runtime |
createTestWizardPrompter |
Cria um solicitador simulado do assistente de configuração. Importe de plugin-sdk/plugin-test-runtime |
createRuntimeTaskFlow |
Cria um estado isolado do fluxo de tarefas do runtime. Importe de plugin-sdk/plugin-test-runtime |
runProviderCatalog |
Executa um hook de catálogo de provedores com dependências de teste. Importe de plugin-sdk/plugin-test-runtime |
resolveProviderWizardOptions |
Resolve as opções do assistente de configuração do provedor em testes de contrato. Importe de plugin-sdk/plugin-test-runtime |
resolveProviderModelPickerEntries |
Resolve as entradas do seletor de modelos do provedor em testes de contrato. Importe de plugin-sdk/plugin-test-runtime |
buildProviderPluginMethodChoice |
Cria IDs de opções do assistente do provedor para verificações. Importe de plugin-sdk/plugin-test-runtime |
setProviderWizardProvidersResolverForTest |
Injeta provedores do assistente de configuração do provedor para testes isolados. Importe de plugin-sdk/plugin-test-runtime |
describeOpenAIProviderRuntimeContract |
Instala verificações do contrato de runtime da família de provedores. Importe de plugin-sdk/provider-test-contracts |
expectPassthroughReplayPolicy |
Verifica se as políticas de repetição do provedor repassam ferramentas e metadados pertencentes ao provedor. Importe de plugin-sdk/provider-test-contracts |
runRealtimeSttLiveTest |
Executa um teste ao vivo de um provedor de STT em tempo real com fixtures de áudio compartilhadas. Importe de plugin-sdk/provider-test-contracts |
normalizeTranscriptForMatch |
Normaliza a saída da transcrição ao vivo antes de verificações aproximadas. Importe de plugin-sdk/provider-test-contracts |
expectExplicitVideoGenerationCapabilities |
Verifica se os provedores de vídeo declaram explicitamente os recursos do modo de geração. Importe de plugin-sdk/provider-test-contracts |
expectExplicitMusicGenerationCapabilities |
Verifica se os provedores de música declaram explicitamente os recursos de geração/edição. Importe de plugin-sdk/provider-test-contracts |
mockSuccessfulDashscopeVideoTask |
Instala uma resposta bem-sucedida de tarefa de vídeo compatível com o DashScope. Importe de plugin-sdk/provider-test-contracts |
getProviderHttpMocks |
Acessa mocks Vitest opcionais de HTTP/autenticação do provedor. Importe de plugin-sdk/provider-http-test-mocks |
installProviderHttpMockCleanup |
Redefine os mocks de HTTP/autenticação do provedor após cada teste. Importe de plugin-sdk/provider-http-test-mocks |
installCommonResolveTargetErrorCases |
Casos de teste compartilhados para tratamento de erros de resolução de destino. Importe de plugin-sdk/channel-target-testing |
shouldAckReaction |
Verifica se um canal deve adicionar uma reação de confirmação. Importe de plugin-sdk/channel-feedback |
removeAckReactionAfterReply |
Remove a reação de confirmação após a entrega da resposta. Importe de plugin-sdk/channel-feedback |
createTestRegistry |
Cria uma fixture de registro de Plugins de canal. Importe de plugin-sdk/plugin-test-runtime ou plugin-sdk/channel-test-helpers |
createEmptyPluginRegistry |
Cria uma fixture de registro de Plugins vazio. Importe de plugin-sdk/plugin-test-runtime ou plugin-sdk/channel-test-helpers |
setActivePluginRegistry |
Instala uma fixture de registro para testes de runtime do Plugin. Importe de plugin-sdk/plugin-test-runtime ou plugin-sdk/channel-test-helpers |
createRequestCaptureJsonFetch |
Captura solicitações fetch JSON em testes de auxiliares de mídia. Importe de plugin-sdk/test-env |
withServer |
Executa testes em um servidor HTTP local descartável. Importe de plugin-sdk/test-env |
createMockIncomingRequest |
Cria um objeto mínimo de solicitação HTTP recebida. Importe de plugin-sdk/test-env |
withFetchPreconnect |
Executa testes de fetch com hooks de pré-conexão instalados. Importe de plugin-sdk/test-env |
withEnv / withEnvAsync |
Modifica temporariamente variáveis de ambiente. Importe de plugin-sdk/test-env |
createTempHomeEnv / withTempHome / withTempDir |
Cria fixtures isoladas de teste do sistema de arquivos. Importe de plugin-sdk/test-env |
createMockServerResponse |
Cria um mock mínimo de resposta de servidor HTTP. Importe de plugin-sdk/test-env |
createProviderUsageFetch |
Cria fixtures de fetch de uso do provedor. Importe de plugin-sdk/test-env |
useFrozenTime / useRealTime |
Congela e restaura temporizadores para testes sensíveis ao tempo. Importe de plugin-sdk/test-env |
createCliRuntimeCapture |
Captura a saída do runtime da CLI em testes. Importe de plugin-sdk/test-fixtures |
importFreshModule |
Importa um módulo ESM com um token de consulta novo para ignorar o cache de módulos. Importe de plugin-sdk/test-fixtures |
bundledPluginRoot / bundledPluginFile |
Resolve caminhos de fixtures de código-fonte ou distribuição de Plugins incluídos. Importe de plugin-sdk/test-fixtures |
mockNodeBuiltinModule |
Instala mocks Vitest específicos de módulos integrados do Node. Importe de plugin-sdk/test-node-mocks |
createSandboxTestContext |
Cria contextos de teste de sandbox. Importe de plugin-sdk/test-fixtures |
writeSkill |
Grave fixtures de skill. Importe de plugin-sdk/test-fixtures |
makeAgentAssistantMessage |
Crie fixtures de mensagens de transcrição do agente. Importe de plugin-sdk/test-fixtures |
peekSystemEvents / resetSystemEventsForTest |
Inspecione e redefina fixtures de eventos do sistema. Importe de plugin-sdk/test-fixtures |
sanitizeTerminalText |
Higienize a saída do terminal para as asserções. Importe de plugin-sdk/test-fixtures |
countLines / hasBalancedFences |
Verifique o formato da saída da divisão em blocos. Importe de plugin-sdk/test-fixtures |
typedCases |
Preserve tipos literais para testes orientados por tabelas. Importe de plugin-sdk/test-fixtures |
Os conjuntos de testes de contrato de plugins integrados também usam esses subcaminhos de teste do SDK para
auxiliares de fixtures de registro, manifesto, artefato público e runtime usados somente em testes.
Os conjuntos exclusivos do núcleo que dependem do inventário integrado do OpenClaw permanecem em
src/plugins/contracts.
Tipos
Os subcaminhos de teste específicos também reexportam tipos úteis em arquivos de teste:
ChannelAccountSnapshot, ChannelGatewayContext,} from "openclaw/plugin-sdk/channel-contract"; Teste da resolução de destino
Use installCommonResolveTargetErrorCases para adicionar casos de erro padrão à
resolução de destino do canal:
describe("my-channel target resolution", () => { installCommonResolveTargetErrorCases({ resolveTarget: ({ to, mode, allowFrom }) => { // Your channel's target resolution logic return myChannelResolveTarget({ to, mode, allowFrom }); }, implicitAllowFrom: ["user1", "user2"], }); // Add channel-specific test cases it("should resolve @username targets", () => { // ... });});Padrões de teste
Teste de contratos de registro
Testes unitários que passam um mock de api escrito manualmente para register(api) não
exercitam as verificações de aceitação do carregador do OpenClaw. Adicione pelo menos um teste
de fumaça apoiado pelo carregador para cada superfície de registro da qual seu plugin depende, especialmente
hooks e recursos exclusivos, como memória.
O carregador real falha ao registrar o plugin quando metadados obrigatórios estão ausentes ou
um plugin chama uma API de recurso que não possui. Por exemplo,
api.registerHook(...) exige um nome de hook, e
api.registerMemoryCapability(...) exige que o manifesto do plugin ou a entrada exportada
declare kind: "memory".
Teste do acesso à configuração do runtime
Prefira o mock compartilhado do runtime do plugin de openclaw/plugin-sdk/plugin-test-runtime.
Os mocks de runtime.config.loadConfig() e runtime.config.writeConfigFile(...)
lançam erros por padrão para que os testes detectem novos usos de APIs de compatibilidade
obsoletas. Sobrescreva esses mocks somente quando o teste cobrir explicitamente um comportamento
de compatibilidade legado.
Teste unitário de um plugin de canal
describe("my-channel plugin", () => { it("should resolve account from config", () => { const cfg = { channels: { "my-channel": { token: "test-token", allowFrom: ["user1"], }, }, }; const account = myPlugin.setup.resolveAccount(cfg, undefined); expect(account.token).toBe("test-token"); }); it("should inspect account without materializing secrets", () => { const cfg = { channels: { "my-channel": { token: "test-token" }, }, }; const inspection = myPlugin.setup.inspectAccount(cfg, undefined); expect(inspection.configured).toBe(true); expect(inspection.tokenStatus).toBe("available"); // No token value exposed expect(inspection).not.toHaveProperty("token"); });});Teste unitário de um plugin de provedor
describe("my-provider plugin", () => { it("should resolve dynamic models", () => { const model = myProvider.resolveDynamicModel({ modelId: "custom-model-v2", // ... context }); expect(model.id).toBe("custom-model-v2"); expect(model.provider).toBe("my-provider"); expect(model.api).toBe("openai-completions"); }); it("should return catalog when API key is available", async () => { const result = await myProvider.catalog.run({ resolveProviderApiKey: () => ({ apiKey: "test-key" }), // ... context }); expect(result?.provider?.models).toHaveLength(2); });});Simulação do runtime do plugin
Para código que usa createPluginRuntimeStore, simule o runtime nos testes:
const store = createPluginRuntimeStore<PluginRuntime>({ pluginId: "test-plugin", errorMessage: "test runtime not set",}); // In test setupconst mockRuntime = { agent: { resolveAgentDir: vi.fn().mockReturnValue("/tmp/agent"), // ... other mocks }, config: { current: vi.fn(() => ({}) as const), mutateConfigFile: vi.fn(), replaceConfigFile: vi.fn(), }, // ... other namespaces} as unknown as PluginRuntime; store.setRuntime(mockRuntime); // After testsstore.clearRuntime();Teste com stubs por instância
Prefira stubs por instância em vez de modificar o protótipo:
// Preferred: per-instance stubconst client = new MyChannelClient();client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" }); // Avoid: prototype mutation// MyChannelClient.prototype.sendMessage = vi.fn();Testes de contrato (plugins do repositório)
Os plugins integrados têm testes de contrato que verificam a propriedade do registro:
pnpm test src/plugins/contracts/Esses testes verificam:
- Quais plugins registram quais provedores
- Quais plugins registram quais provedores de fala
- Correção do formato do registro
- Conformidade com o contrato do runtime
Execução de testes específicos
Para um plugin específico:
pnpm test <bundled-plugin-root>/my-channel/Somente para testes de contrato:
pnpm test src/plugins/contracts/shape.contract.test.tspnpm test src/plugins/contracts/auth-choice.contract.test.tspnpm test src/plugins/contracts/runtime-seams.contract.test.tsAplicação das regras de lint (plugins do repositório)
scripts/run-additional-boundary-checks.mjs executa um conjunto de verificações de limites
de importação lint:plugins:* na CI; cada uma também pode ser executada isoladamente no ambiente local:
| Comando | O que impõe |
|---|---|
pnpm run lint:plugins:no-monolithic-plugin-sdk-entry-imports |
Plugins integrados não podem importar o barrel raiz monolítico openclaw/plugin-sdk. |
pnpm run lint:plugins:no-extension-src-imports |
Arquivos de extensão de produção não podem importar diretamente a árvore src/** do repositório (../../src/...). |
pnpm run lint:plugins:no-extension-test-core-imports |
Arquivos de teste de extensão não podem importar openclaw/plugin-sdk/testing, plugin-sdk/test-utils nem outros auxiliares de teste exclusivos do núcleo. |
Plugins externos não estão sujeitos a essas regras de lint, mas recomenda-se seguir os mesmos padrões.
Configuração de testes
O OpenClaw usa o Vitest 4 com relatórios informativos de cobertura V8. Para testes de plugins:
# Run all testspnpm test # Run specific plugin testspnpm test <bundled-plugin-root>/my-channel/src/channel.test.ts # Run with a specific test name filterpnpm test <bundled-plugin-root>/my-channel/ -t "resolves account" # Run with coveragepnpm test:coverageSe as execuções locais causarem pressão de memória:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testRelacionado
- Visão geral do SDK -- convenções de importação
- Plugins de canal do SDK -- interface de plugin de canal
- Plugins de provedor do SDK -- hooks de plugin de provedor
- Criação de plugins -- guia de primeiros passos