Plugin SDK reference
Tests des Plugins
Référence des utilitaires, modèles et règles de lint pour les tests des plugins OpenClaw.
Utilitaires de test
Ces sous-chemins sont des points d’entrée vers le code source local au dépôt pour les tests des
plugins intégrés d’OpenClaw. Ils ne sont pas publiés en tant qu’exports package.json pour les
plugins tiers et peuvent importer Vitest ou d’autres dépendances de test propres au dépôt.
shouldAckReaction, removeAckReactionAfterReply,} from "openclaw/plugin-sdk/channel-feedback"; bundledPluginRoot, createCliRuntimeCapture, typedCases,} from "openclaw/plugin-sdk/test-fixtures"; Privilégiez ces sous-chemins ciblés pour les nouveaux tests de plugins intégrés. Le point d’entrée
général openclaw/plugin-sdk/testing et l’alias openclaw/plugin-sdk/test-utils
ne servent qu’à la compatibilité héritée : pnpm run lint:plugins:no-extension-test-core-imports
(scripts/check-no-extension-test-core-imports.ts) rejette tout nouvel import de
l’un ou l’autre dans les fichiers de test des extensions, et tous deux sont conservés uniquement pour les
tests de vérification de la compatibilité.
Exports disponibles
| Export | Objectif |
|---|---|
createTestPluginApi |
Créer un mock minimal de l’API de Plugin pour les tests unitaires d’enregistrement direct. Importer depuis plugin-sdk/plugin-test-api |
AUTH_PROFILE_RUNTIME_CONTRACT |
Fixture de contrat partagé de profil d’authentification pour les adaptateurs d’exécution d’agent natifs. Importer depuis plugin-sdk/agent-runtime-test-contracts |
DELIVERY_NO_REPLY_RUNTIME_CONTRACT |
Fixture de contrat partagé de suppression de livraison pour les adaptateurs d’exécution d’agent natifs. Importer depuis plugin-sdk/agent-runtime-test-contracts |
OUTCOME_FALLBACK_RUNTIME_CONTRACT |
Fixture de contrat partagé de classification de repli pour les adaptateurs d’exécution d’agent natifs. Importer depuis plugin-sdk/agent-runtime-test-contracts |
createParameterFreeTool |
Créer des fixtures de schéma d’outil dynamique pour les tests de contrat d’exécution natif. Importer depuis plugin-sdk/agent-runtime-test-contracts |
expectChannelInboundContextContract |
Vérifier la structure du contexte entrant du canal. Importer depuis plugin-sdk/channel-contract-testing |
installChannelOutboundPayloadContractSuite |
Installer les cas de contrat de charge utile sortante du canal. Importer depuis plugin-sdk/channel-contract-testing |
createStartAccountContext |
Créer des contextes de cycle de vie de compte de canal. Importer depuis plugin-sdk/channel-test-helpers |
installChannelActionsContractSuite |
Installer les cas génériques de contrat d’actions sur les messages du canal. Importer depuis plugin-sdk/channel-test-helpers |
installChannelSetupContractSuite |
Installer les cas génériques de contrat de configuration du canal. Importer depuis plugin-sdk/channel-test-helpers |
installChannelStatusContractSuite |
Installer les cas génériques de contrat d’état du canal. Importer depuis plugin-sdk/channel-test-helpers |
expectDirectoryIds |
Vérifier les identifiants d’annuaire du canal produits par une fonction de listage d’annuaire. Importer depuis plugin-sdk/channel-test-helpers |
assertBundledChannelEntries |
Vérifier que les points d’entrée des canaux intégrés exposent le contrat public attendu. Importer depuis plugin-sdk/channel-test-helpers |
formatEnvelopeTimestamp |
Formater des horodatages d’enveloppe déterministes. Importer depuis plugin-sdk/channel-test-helpers |
expectPairingReplyText |
Vérifier le texte de réponse d’association du canal et en extraire le code. Importer depuis plugin-sdk/channel-test-helpers |
describePluginRegistrationContract |
Installer les vérifications du contrat d’enregistrement de Plugin. Importer depuis plugin-sdk/plugin-test-contracts |
registerSingleProviderPlugin |
Enregistrer un Plugin de fournisseur dans les tests de contrôle rapide du chargeur. Importer depuis plugin-sdk/plugin-test-runtime |
registerProviderPlugin |
Capturer tous les types de fournisseurs d’un Plugin. Importer depuis plugin-sdk/plugin-test-runtime |
registerProviderPlugins |
Capturer les enregistrements de fournisseurs de plusieurs Plugins. Importer depuis plugin-sdk/plugin-test-runtime |
requireRegisteredProvider |
Vérifier qu’une collection de fournisseurs contient un identifiant. Importer depuis plugin-sdk/plugin-test-runtime |
createRuntimeEnv |
Créer un environnement d’exécution CLI/Plugin simulé. Importer depuis plugin-sdk/plugin-test-runtime |
createPluginRuntimeMock |
Créer une surface d’exécution de Plugin simulée. Importer depuis plugin-sdk/plugin-test-runtime |
createPluginSetupWizardStatus |
Créer des assistants d’état de configuration pour les Plugins de canal. Importer depuis plugin-sdk/plugin-test-runtime |
createTestWizardPrompter |
Créer un gestionnaire d’invites simulé pour l’assistant de configuration. Importer depuis plugin-sdk/plugin-test-runtime |
createRuntimeTaskFlow |
Créer un état isolé de flux de tâches d’exécution. Importer depuis plugin-sdk/plugin-test-runtime |
runProviderCatalog |
Exécuter un hook de catalogue de fournisseur avec des dépendances de test. Importer depuis plugin-sdk/plugin-test-runtime |
resolveProviderWizardOptions |
Résoudre les choix de l’assistant de configuration du fournisseur dans les tests de contrat. Importer depuis plugin-sdk/plugin-test-runtime |
resolveProviderModelPickerEntries |
Résoudre les entrées du sélecteur de modèles du fournisseur dans les tests de contrat. Importer depuis plugin-sdk/plugin-test-runtime |
buildProviderPluginMethodChoice |
Créer les identifiants de choix de l’assistant du fournisseur pour les assertions. Importer depuis plugin-sdk/plugin-test-runtime |
setProviderWizardProvidersResolverForTest |
Injecter les fournisseurs de l’assistant du fournisseur pour les tests isolés. Importer depuis plugin-sdk/plugin-test-runtime |
describeOpenAIProviderRuntimeContract |
Installer les vérifications du contrat d’exécution de la famille de fournisseurs. Importer depuis plugin-sdk/provider-test-contracts |
expectPassthroughReplayPolicy |
Vérifier que les politiques de relecture du fournisseur transmettent les outils et métadonnées appartenant au fournisseur. Importer depuis plugin-sdk/provider-test-contracts |
runRealtimeSttLiveTest |
Exécuter un test en direct d’un fournisseur STT en temps réel avec des fixtures audio partagées. Importer depuis plugin-sdk/provider-test-contracts |
normalizeTranscriptForMatch |
Normaliser la sortie de transcription en direct avant les assertions approximatives. Importer depuis plugin-sdk/provider-test-contracts |
expectExplicitVideoGenerationCapabilities |
Vérifier que les fournisseurs vidéo déclarent explicitement les capacités de leurs modes de génération. Importer depuis plugin-sdk/provider-test-contracts |
expectExplicitMusicGenerationCapabilities |
Vérifier que les fournisseurs de musique déclarent explicitement leurs capacités de génération et d’édition. Importer depuis plugin-sdk/provider-test-contracts |
mockSuccessfulDashscopeVideoTask |
Installer une réponse réussie de tâche vidéo compatible avec DashScope. Importer depuis plugin-sdk/provider-test-contracts |
getProviderHttpMocks |
Accéder aux mocks Vitest HTTP/d’authentification facultatifs du fournisseur. Importer depuis plugin-sdk/provider-http-test-mocks |
installProviderHttpMockCleanup |
Réinitialiser les mocks HTTP/d’authentification du fournisseur après chaque test. Importer depuis plugin-sdk/provider-http-test-mocks |
installCommonResolveTargetErrorCases |
Cas de test partagés pour la gestion des erreurs de résolution de cible. Importer depuis plugin-sdk/channel-target-testing |
shouldAckReaction |
Vérifier si un canal doit ajouter une réaction d’accusé de réception. Importer depuis plugin-sdk/channel-feedback |
removeAckReactionAfterReply |
Supprimer la réaction d’accusé de réception après la livraison de la réponse. Importer depuis plugin-sdk/channel-feedback |
createTestRegistry |
Créer une fixture de registre de Plugins de canal. Importer depuis plugin-sdk/plugin-test-runtime ou plugin-sdk/channel-test-helpers |
createEmptyPluginRegistry |
Créer une fixture de registre de Plugins vide. Importer depuis plugin-sdk/plugin-test-runtime ou plugin-sdk/channel-test-helpers |
setActivePluginRegistry |
Installer une fixture de registre pour les tests d’exécution de Plugin. Importer depuis plugin-sdk/plugin-test-runtime ou plugin-sdk/channel-test-helpers |
createRequestCaptureJsonFetch |
Capturer les requêtes de récupération JSON dans les tests des assistants multimédias. Importer depuis plugin-sdk/test-env |
withServer |
Exécuter des tests sur un serveur HTTP local jetable. Importer depuis plugin-sdk/test-env |
createMockIncomingRequest |
Créer un objet minimal de requête HTTP entrante. Importer depuis plugin-sdk/test-env |
withFetchPreconnect |
Exécuter des tests de récupération avec les hooks de préconnexion installés. Importer depuis plugin-sdk/test-env |
withEnv / withEnvAsync |
Modifier temporairement les variables d’environnement. Importer depuis plugin-sdk/test-env |
createTempHomeEnv / withTempHome / withTempDir |
Créer des fixtures de test isolées du système de fichiers. Importer depuis plugin-sdk/test-env |
createMockServerResponse |
Créer un mock minimal de réponse de serveur HTTP. Importer depuis plugin-sdk/test-env |
createProviderUsageFetch |
Créer des fixtures de récupération de l’utilisation du fournisseur. Importer depuis plugin-sdk/test-env |
useFrozenTime / useRealTime |
Figer et restaurer les minuteurs pour les tests sensibles au temps. Importer depuis plugin-sdk/test-env |
createCliRuntimeCapture |
Capturer la sortie d’exécution de la CLI dans les tests. Importer depuis plugin-sdk/test-fixtures |
importFreshModule |
Importer un module ESM avec un nouveau jeton de requête pour contourner le cache des modules. Importer depuis plugin-sdk/test-fixtures |
bundledPluginRoot / bundledPluginFile |
Résoudre les chemins des fixtures de source ou de distribution des Plugins intégrés. Importer depuis plugin-sdk/test-fixtures |
mockNodeBuiltinModule |
Installer des mocks Vitest ciblés pour les modules intégrés de Node. Importer depuis plugin-sdk/test-node-mocks |
createSandboxTestContext |
Créer des contextes de test de bac à sable. Importer depuis plugin-sdk/test-fixtures |
writeSkill |
Écrire des jeux de données de test pour les Skills. Importer depuis plugin-sdk/test-fixtures |
makeAgentAssistantMessage |
Créer des messages de transcription d’agent pour les tests. Importer depuis plugin-sdk/test-fixtures |
peekSystemEvents / resetSystemEventsForTest |
Inspecter et réinitialiser les événements système de test. Importer depuis plugin-sdk/test-fixtures |
sanitizeTerminalText |
Nettoyer la sortie du terminal pour les assertions. Importer depuis plugin-sdk/test-fixtures |
countLines / hasBalancedFences |
Vérifier la structure de la sortie découpée en segments. Importer depuis plugin-sdk/test-fixtures |
typedCases |
Préserver les types littéraux pour les tests paramétrés par tableau. Importer depuis plugin-sdk/test-fixtures |
Les suites de contrats des plugins intégrés utilisent également ces sous-chemins de test du SDK pour les utilitaires de fixtures réservés aux tests concernant le registre, le manifeste, les artefacts publics et l’environnement d’exécution.
Les suites réservées au cœur qui dépendent de l’inventaire intégré d’OpenClaw restent plutôt sous
src/plugins/contracts.
Types
Les sous-chemins de test ciblés réexportent également des types utiles dans les fichiers de test :
ChannelAccountSnapshot, ChannelGatewayContext,} from "openclaw/plugin-sdk/channel-contract"; Résolution des cibles dans les tests
Utilisez installCommonResolveTargetErrorCases pour ajouter les cas d’erreur standard de résolution des cibles de 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", () => { // ... });});Modèles de test
Test des contrats d’enregistrement
Les tests unitaires qui transmettent une simulation api écrite manuellement à register(api) ne
mettent pas en œuvre les contrôles d’acceptation du chargeur d’OpenClaw. Ajoutez au moins un
test de bon fonctionnement reposant sur le chargeur pour chaque surface d’enregistrement dont dépend votre plugin, en particulier
les hooks et les fonctionnalités exclusives telles que la mémoire.
Le véritable chargeur fait échouer l’enregistrement du plugin lorsque des métadonnées requises sont absentes ou
qu’un plugin appelle une API de fonctionnalité dont il n’est pas propriétaire. Par exemple,
api.registerHook(...) nécessite un nom de hook, et
api.registerMemoryCapability(...) nécessite que le manifeste du plugin ou l’entrée exportée
déclare kind: "memory".
Test de l’accès à la configuration de l’environnement d’exécution
Préférez la simulation partagée de l’environnement d’exécution du plugin provenant de openclaw/plugin-sdk/plugin-test-runtime.
Ses simulations runtime.config.loadConfig() et runtime.config.writeConfigFile(...)
lèvent une exception par défaut afin que les tests détectent toute nouvelle utilisation d’API de compatibilité
obsolètes. Ne remplacez ces simulations que lorsque le test couvre explicitement
un comportement de compatibilité historique.
Test unitaire d’un 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"); });});Test unitaire d’un plugin de fournisseur
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); });});Simulation de l’environnement d’exécution du plugin
Pour le code qui utilise createPluginRuntimeStore, simulez l’environnement d’exécution dans les tests :
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();Tests avec des substituts propres à chaque instance
Préférez les substituts propres à chaque instance à la modification du prototype :
// Preferred: per-instance stubconst client = new MyChannelClient();client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" }); // Avoid: prototype mutation// MyChannelClient.prototype.sendMessage = vi.fn();Tests de contrats (plugins du dépôt)
Les plugins intégrés disposent de tests de contrats qui vérifient la propriété des enregistrements :
pnpm test src/plugins/contracts/Ces tests vérifient :
- Quels plugins enregistrent quels fournisseurs
- Quels plugins enregistrent quels fournisseurs vocaux
- La conformité de la structure d’enregistrement
- La conformité au contrat de l’environnement d’exécution
Exécution de tests ciblés
Pour un plugin spécifique :
pnpm test <bundled-plugin-root>/my-channel/Pour les tests de contrats uniquement :
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.tsContrôles du lint (plugins du dépôt)
scripts/run-additional-boundary-checks.mjs exécute dans la CI un ensemble de contrôles
lint:plugins:* portant sur les limites d’importation ; chacun peut également être exécuté séparément en local :
| Commande | Règle appliquée |
|---|---|
pnpm run lint:plugins:no-monolithic-plugin-sdk-entry-imports |
Les plugins intégrés ne peuvent pas importer le barrel racine monolithique openclaw/plugin-sdk. |
pnpm run lint:plugins:no-extension-src-imports |
Les fichiers d’extension de production ne peuvent pas importer directement l’arborescence src/** du dépôt (../../src/...). |
pnpm run lint:plugins:no-extension-test-core-imports |
Les fichiers de test des extensions ne peuvent pas importer openclaw/plugin-sdk/testing, plugin-sdk/test-utils ni d’autres utilitaires de test réservés au cœur. |
Les plugins externes ne sont pas soumis à ces règles de lint, mais il est recommandé de suivre les mêmes modèles.
Configuration des tests
OpenClaw utilise Vitest 4 avec des rapports informatifs de couverture V8. Pour les tests des 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:coverageSi les exécutions locales provoquent une pression sur la mémoire :
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testVoir aussi
- Vue d’ensemble du SDK -- conventions d’importation
- Plugins de canal du SDK -- interface des plugins de canal
- Plugins de fournisseur du SDK -- hooks des plugins de fournisseur
- Création de plugins -- guide de prise en main