Plugin SDK reference
Test dei Plugin
Riferimento per utilità di test, pattern e applicazione del lint per i Plugin OpenClaw.
Utilità di test
Questi sottopercorsi di helper di test sono entrypoint sorgente locali del repo per i test dei Plugin inclusi di OpenClaw. Non sono esportazioni del pacchetto per Plugin di terze parti e possono importare Vitest o altre dipendenze di test solo del repo.
Import mock dell'API Plugin: openclaw/plugin-sdk/plugin-test-api
Import del contratto del runtime agente: openclaw/plugin-sdk/agent-runtime-test-contracts
Import del contratto di canale: openclaw/plugin-sdk/channel-contract-testing
Import dell'helper di test di canale: openclaw/plugin-sdk/channel-test-helpers
Import del test target di canale: openclaw/plugin-sdk/channel-target-testing
Import del contratto Plugin: openclaw/plugin-sdk/plugin-test-contracts
Import del test runtime Plugin: openclaw/plugin-sdk/plugin-test-runtime
Import del contratto provider: openclaw/plugin-sdk/provider-test-contracts
Import del mock HTTP provider: openclaw/plugin-sdk/provider-http-test-mocks
Import del test ambiente/rete: openclaw/plugin-sdk/test-env
Import della fixture generica: openclaw/plugin-sdk/test-fixtures
Import del mock builtin Node: openclaw/plugin-sdk/test-node-mocks
All'interno del repo OpenClaw, per i nuovi test dei Plugin inclusi preferisci i sottopercorsi mirati
qui sotto. Il barrel ampio
openclaw/plugin-sdk/testing è solo per compatibilità legacy.
Le protezioni del repo rifiutano nuovi import reali da plugin-sdk/testing e
plugin-sdk/test-utils; quei nomi rimangono solo come superfici di compatibilità deprecate
per i test dei record di compatibilità.
shouldAckReaction, removeAckReactionAfterReply,} from "openclaw/plugin-sdk/channel-feedback"; bundledPluginRoot, createCliRuntimeCapture, typedCases,} from "openclaw/plugin-sdk/test-fixtures"; Esportazioni disponibili
| Esportazione | Scopo |
|---|---|
createTestPluginApi |
Crea un mock minimo dell'API Plugin per i test unitari di registrazione diretta. Importa da plugin-sdk/plugin-test-api |
AUTH_PROFILE_RUNTIME_CONTRACT |
Fixture condivisa del contratto del profilo di autenticazione per gli adattatori runtime degli agenti nativi. Importa da plugin-sdk/agent-runtime-test-contracts |
DELIVERY_NO_REPLY_RUNTIME_CONTRACT |
Fixture condivisa del contratto di soppressione della consegna per gli adattatori runtime degli agenti nativi. Importa da plugin-sdk/agent-runtime-test-contracts |
OUTCOME_FALLBACK_RUNTIME_CONTRACT |
Fixture condivisa del contratto di classificazione fallback per gli adattatori runtime degli agenti nativi. Importa da plugin-sdk/agent-runtime-test-contracts |
createParameterFreeTool |
Crea fixture di schema per strumenti dinamici per i test del contratto del runtime nativo. Importa da plugin-sdk/agent-runtime-test-contracts |
expectChannelInboundContextContract |
Verifica la forma del contesto in ingresso del canale. Importa da plugin-sdk/channel-contract-testing |
installChannelOutboundPayloadContractSuite |
Installa i casi di contratto del payload in uscita del canale. Importa da plugin-sdk/channel-contract-testing |
createStartAccountContext |
Crea contesti del ciclo di vita dell'account del canale. Importa da plugin-sdk/channel-test-helpers |
installChannelActionsContractSuite |
Installa i casi generici di contratto delle azioni dei messaggi del canale. Importa da plugin-sdk/channel-test-helpers |
installChannelSetupContractSuite |
Installa i casi generici di contratto della configurazione del canale. Importa da plugin-sdk/channel-test-helpers |
installChannelStatusContractSuite |
Installa i casi generici di contratto dello stato del canale. Importa da plugin-sdk/channel-test-helpers |
expectDirectoryIds |
Verifica gli ID di directory del canale da una funzione di elenco directory. Importa da plugin-sdk/channel-test-helpers |
assertBundledChannelEntries |
Verifica che gli entrypoint dei canali inclusi espongano il contratto pubblico previsto. Importa da plugin-sdk/channel-test-helpers |
formatEnvelopeTimestamp |
Formatta timestamp deterministici dell'envelope. Importa da plugin-sdk/channel-test-helpers |
expectPairingReplyText |
Verifica il testo della risposta di abbinamento del canale ed estrae il relativo codice. Importa da plugin-sdk/channel-test-helpers |
describePluginRegistrationContract |
Installa i controlli del contratto di registrazione del Plugin. Importa da plugin-sdk/plugin-test-contracts |
registerSingleProviderPlugin |
Registra un Plugin provider nei test smoke del loader. Importa da plugin-sdk/plugin-test-runtime |
registerProviderPlugin |
Acquisisce tutti i tipi di provider da un Plugin. Importa da plugin-sdk/plugin-test-runtime |
registerProviderPlugins |
Acquisisce le registrazioni dei provider tra più Plugin. Importa da plugin-sdk/plugin-test-runtime |
requireRegisteredProvider |
Verifica che una raccolta di provider contenga un ID. Importa da plugin-sdk/plugin-test-runtime |
createRuntimeEnv |
Crea un ambiente runtime CLI/Plugin simulato. Importa da plugin-sdk/plugin-test-runtime |
createPluginRuntimeMock |
Crea una superficie runtime Plugin simulata. Importa da plugin-sdk/plugin-test-runtime |
createPluginSetupWizardStatus |
Crea helper di stato della configurazione per i Plugin di canale. Importa da plugin-sdk/plugin-test-runtime |
describeOpenAIProviderRuntimeContract |
Installa i controlli del contratto runtime della famiglia di provider. Importa da plugin-sdk/provider-test-contracts |
expectPassthroughReplayPolicy |
Verifica che le policy di replay del provider lascino passare strumenti e metadati di proprietà del provider. Importa da plugin-sdk/provider-test-contracts |
runRealtimeSttLiveTest |
Esegue un test live del provider STT in tempo reale con fixture audio condivise. Importa da plugin-sdk/provider-test-contracts |
normalizeTranscriptForMatch |
Normalizza l'output della trascrizione live prima delle asserzioni fuzzy. Importa da plugin-sdk/provider-test-contracts |
expectExplicitVideoGenerationCapabilities |
Verifica che i provider video dichiarino capacità esplicite della modalità di generazione. Importa da plugin-sdk/provider-test-contracts |
expectExplicitMusicGenerationCapabilities |
Verifica che i provider musicali dichiarino capacità esplicite di generazione/modifica. Importa da plugin-sdk/provider-test-contracts |
mockSuccessfulDashscopeVideoTask |
Installa una risposta riuscita di task video compatibile con DashScope. Importa da plugin-sdk/provider-test-contracts |
getProviderHttpMocks |
Accedi ai mock Vitest HTTP/auth opt-in dei provider. Importa da plugin-sdk/provider-http-test-mocks |
installProviderHttpMockCleanup |
Reimposta i mock HTTP/auth dei provider dopo ogni test. Importa da plugin-sdk/provider-http-test-mocks |
installCommonResolveTargetErrorCases |
Casi di test condivisi per la gestione degli errori di risoluzione del target. Importa da plugin-sdk/channel-target-testing |
shouldAckReaction |
Controlla se un canale deve aggiungere una reazione di conferma. Importa da plugin-sdk/channel-feedback |
removeAckReactionAfterReply |
Rimuove la reazione di conferma dopo la consegna della risposta. Importa da plugin-sdk/channel-feedback |
createTestRegistry |
Crea una fixture del registro dei Plugin di canale. Importa da plugin-sdk/plugin-test-runtime o plugin-sdk/channel-test-helpers |
createEmptyPluginRegistry |
Crea una fixture vuota del registro dei Plugin. Importa da plugin-sdk/plugin-test-runtime o plugin-sdk/channel-test-helpers |
setActivePluginRegistry |
Installa una fixture del registro per i test del runtime Plugin. Importa da plugin-sdk/plugin-test-runtime o plugin-sdk/channel-test-helpers |
createRequestCaptureJsonFetch |
Acquisisce richieste fetch JSON nei test degli helper multimediali. Importa da plugin-sdk/test-env |
withServer |
Esegue test contro un server HTTP locale usa e getta. Importa da plugin-sdk/test-env |
createMockIncomingRequest |
Crea un oggetto minimo di richiesta HTTP in ingresso. Importa da plugin-sdk/test-env |
withFetchPreconnect |
Esegue test fetch con hook di preconnessione installati. Importa da plugin-sdk/test-env |
withEnv / withEnvAsync |
Modifica temporaneamente le variabili d'ambiente. Importa da plugin-sdk/test-env |
createTempHomeEnv / withTempHome / withTempDir |
Crea fixture di test del filesystem isolate. Importa da plugin-sdk/test-env |
createMockServerResponse |
Crea un mock minimo di risposta del server HTTP. Importa da plugin-sdk/test-env |
createCliRuntimeCapture |
Acquisisce l'output del runtime CLI nei test. Importa da plugin-sdk/test-fixtures |
importFreshModule |
Importa un modulo ESM con un nuovo token di query per aggirare la cache dei moduli. Importa da plugin-sdk/test-fixtures |
bundledPluginRoot / bundledPluginFile |
Risolve i percorsi delle fixture sorgente o dist dei Plugin inclusi. Importa da plugin-sdk/test-fixtures |
mockNodeBuiltinModule |
Installa mock Vitest ristretti dei moduli integrati di Node. Importa da plugin-sdk/test-node-mocks |
createSandboxTestContext |
Crea contesti di test sandbox. Importa da plugin-sdk/test-fixtures |
writeSkill |
Scrive fixture di skill. Importa da plugin-sdk/test-fixtures |
makeAgentAssistantMessage |
Crea fixture di messaggi della trascrizione agente. Importa da plugin-sdk/test-fixtures |
peekSystemEvents / resetSystemEventsForTest |
Ispeziona e reimposta le fixture degli eventi di sistema. Importa da plugin-sdk/test-fixtures |
sanitizeTerminalText |
Sanitizza l'output del terminale per le asserzioni. Importa da plugin-sdk/test-fixtures |
countLines / hasBalancedFences |
Verifica la forma dell'output di suddivisione in blocchi. Importa da plugin-sdk/test-fixtures |
runProviderCatalog |
Esegue un hook del catalogo provider con dipendenze di test |
resolveProviderWizardOptions |
Risolve le scelte della procedura guidata di configurazione del provider nei test di contratto |
resolveProviderModelPickerEntries |
Risolve le voci del selettore di modelli del provider nei test di contratto |
buildProviderPluginMethodChoice |
Crea gli ID delle scelte della procedura guidata del provider per le asserzioni |
setProviderWizardProvidersResolverForTest |
Inietta i provider wizard per test isolati |
createProviderUsageFetch |
Crea fixture di recupero dell'utilizzo dei provider |
useFrozenTime / useRealTime |
Blocca e ripristina i timer per test sensibili al tempo. Importa da plugin-sdk/test-env |
createTestWizardPrompter |
Crea un prompter del wizard di configurazione simulato |
createRuntimeTaskFlow |
Crea lo stato task-flow runtime isolato |
typedCases |
Preserva i tipi letterali per test table-driven. Importa da plugin-sdk/test-fixtures |
Le suite di contratto dei Plugin integrati usano anche sottopercorsi di test dell'SDK per helper di fixture solo per test per registro, manifesto, artefatti pubblici e runtime. Le suite solo core che dipendono dall'inventario OpenClaw integrato restano sotto src/plugins/contracts.
Mantieni i nuovi test delle estensioni su un sottopercorso SDK focalizzato e documentato, come
plugin-sdk/plugin-test-api, plugin-sdk/channel-contract-testing,
plugin-sdk/agent-runtime-test-contracts, plugin-sdk/channel-test-helpers,
plugin-sdk/plugin-test-contracts, plugin-sdk/plugin-test-runtime,
plugin-sdk/provider-test-contracts, plugin-sdk/provider-http-test-mocks,
plugin-sdk/test-env o plugin-sdk/test-fixtures, invece di importare direttamente il
barrel di compatibilità ampio plugin-sdk/testing, i file src/** del repository o i bridge
test/helpers/* del repository.
Tipi
I sottopercorsi di test focalizzati riesportano anche tipi utili nei file di test:
ChannelAccountSnapshot, ChannelGatewayContext,} from "openclaw/plugin-sdk/channel-contract"; Test della risoluzione dei target
Usa installCommonResolveTargetErrorCases per aggiungere casi di errore standard per
la risoluzione dei target di canale:
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", () => { // ... });});Pattern di test
Test dei contratti di registrazione
I test unitari che passano un mock api scritto a mano a register(api) non esercitano
i gate di accettazione del loader di OpenClaw. Aggiungi almeno uno smoke test basato sul loader
per ogni superficie di registrazione da cui dipende il tuo Plugin, soprattutto hook e
capacità esclusive come la memoria.
Il loader reale fa fallire la registrazione del Plugin quando mancano metadati obbligatori o un
Plugin chiama un'API di capacità che non possiede. Per esempio,
api.registerHook(...) richiede un nome di hook e
api.registerMemoryCapability(...) richiede che il manifesto del Plugin o l'entry esportata
dichiari kind: "memory".
Test dell'accesso alla configurazione di runtime
Preferisci il mock condiviso del runtime del Plugin da openclaw/plugin-sdk/plugin-test-runtime.
I suoi mock deprecati runtime.config.loadConfig() e runtime.config.writeConfigFile(...)
generano un errore per impostazione predefinita, così i test intercettano nuovi usi delle API di compatibilità. Sovrascrivi
quei mock solo quando il test copre esplicitamente il comportamento di compatibilità legacy.
Test unitario di un Plugin di canale
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"); });});Test unitario di un Plugin provider
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); });});Mock del runtime del Plugin
Per il codice che usa createPluginRuntimeStore, crea un mock del runtime nei test:
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();Test con stub per istanza
Preferisci stub per istanza invece della mutazione del prototipo:
// Preferred: per-instance stubconst client = new MyChannelClient();client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" }); // Avoid: prototype mutation// MyChannelClient.prototype.sendMessage = vi.fn();Test di contratto (Plugin nel repository)
I Plugin integrati hanno test di contratto che verificano la proprietà della registrazione:
pnpm test -- src/plugins/contracts/Questi test verificano:
- Quali Plugin registrano quali provider
- Quali Plugin registrano quali provider vocali
- La correttezza della forma della registrazione
- La conformità al contratto di runtime
Esecuzione di test con ambito limitato
Per un Plugin specifico:
pnpm test -- <bundled-plugin-root>/my-channel/Solo per i test di contratto:
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.tsApplicazione del lint (Plugin nel repository)
Tre regole sono applicate da pnpm check per i Plugin nel repository:
- Nessun import monolitico dalla radice -- il barrel radice
openclaw/plugin-sdkviene rifiutato - Nessun import diretto da
src/-- i Plugin non possono importare direttamente../../src/ - Nessun auto-import -- i Plugin non possono importare il proprio sottopercorso
plugin-sdk/<name>
I Plugin esterni non sono soggetti a queste regole di lint, ma si consiglia di seguire gli stessi pattern.
Configurazione dei test
OpenClaw usa Vitest con soglie di copertura V8. Per i test dei Plugin:
# 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 le esecuzioni locali causano pressione sulla memoria:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testCorrelati
- Panoramica dell'SDK -- convenzioni di importazione
- Plugin di canale SDK -- interfaccia dei Plugin di canale
- Plugin provider SDK -- hook dei Plugin provider
- Creazione di Plugin -- guida introduttiva