Plugin SDK reference
Тестування Plugin
Довідка про тестові утиліти, шаблони та забезпечення дотримання правил лінтингу для плагінів OpenClaw.
Тестові утиліти
Ці підшляхи є локальними для репозиторію точками входу у вихідний код для тестів власних вбудованих плагінів OpenClaw. Вони не публікуються як експорти package.json для сторонніх плагінів і можуть імпортувати Vitest або інші тестові залежності, доступні лише в репозиторії.
shouldAckReaction, removeAckReactionAfterReply,} from "openclaw/plugin-sdk/channel-feedback"; bundledPluginRoot, createCliRuntimeCapture, typedCases,} from "openclaw/plugin-sdk/test-fixtures"; Для нових тестів вбудованих плагінів віддавайте перевагу цим спеціалізованим підшляхам. Загальний модуль реекспорту openclaw/plugin-sdk/testing і псевдонім openclaw/plugin-sdk/test-utils призначені лише для зворотної сумісності: pnpm run lint:plugins:no-extension-test-core-imports (scripts/check-no-extension-test-core-imports.ts) відхиляє нові імпорти будь-якого з них у тестових файлах розширень, а обидва надалі використовуються виключно для тестів, що фіксують сумісність.
Доступні експорти
| Експорт | Призначення |
|---|---|
createTestPluginApi |
Створює мінімальний макет API Plugin для модульних тестів безпосередньої реєстрації. Імпортуйте з plugin-sdk/plugin-test-api |
AUTH_PROFILE_RUNTIME_CONTRACT |
Спільна фікстура контракту профілю автентифікації для нативних адаптерів середовища виконання агента. Імпортуйте з plugin-sdk/agent-runtime-test-contracts |
DELIVERY_NO_REPLY_RUNTIME_CONTRACT |
Спільна фікстура контракту приглушення доставки для нативних адаптерів середовища виконання агента. Імпортуйте з plugin-sdk/agent-runtime-test-contracts |
OUTCOME_FALLBACK_RUNTIME_CONTRACT |
Спільна фікстура контракту класифікації резервного варіанта для нативних адаптерів середовища виконання агента. Імпортуйте з plugin-sdk/agent-runtime-test-contracts |
createParameterFreeTool |
Створює фікстури схем динамічних інструментів для тестів контрактів нативного середовища виконання. Імпортуйте з plugin-sdk/agent-runtime-test-contracts |
expectChannelInboundContextContract |
Перевіряє структуру вхідного контексту каналу. Імпортуйте з plugin-sdk/channel-contract-testing |
installChannelOutboundPayloadContractSuite |
Установлює випадки контракту вихідного корисного навантаження каналу. Імпортуйте з plugin-sdk/channel-contract-testing |
createStartAccountContext |
Створює контексти життєвого циклу облікового запису каналу. Імпортуйте з plugin-sdk/channel-test-helpers |
installChannelActionsContractSuite |
Установлює загальні випадки контракту дій із повідомленнями каналу. Імпортуйте з plugin-sdk/channel-test-helpers |
installChannelSetupContractSuite |
Установлює загальні випадки контракту налаштування каналу. Імпортуйте з plugin-sdk/channel-test-helpers |
installChannelStatusContractSuite |
Установлює загальні випадки контракту стану каналу. Імпортуйте з plugin-sdk/channel-test-helpers |
expectDirectoryIds |
Перевіряє ідентифікатори каталогу каналу, отримані від функції виведення списку каталогу. Імпортуйте з plugin-sdk/channel-test-helpers |
assertBundledChannelEntries |
Перевіряє, що точки входу вбудованих каналів надають очікуваний публічний контракт. Імпортуйте з plugin-sdk/channel-test-helpers |
formatEnvelopeTimestamp |
Форматує детерміновані часові мітки конвертів. Імпортуйте з plugin-sdk/channel-test-helpers |
expectPairingReplyText |
Перевіряє текст відповіді на сполучення каналу та видобуває з нього код. Імпортуйте з plugin-sdk/channel-test-helpers |
describePluginRegistrationContract |
Установлює перевірки контракту реєстрації Plugin. Імпортуйте з plugin-sdk/plugin-test-contracts |
registerSingleProviderPlugin |
Реєструє один Plugin постачальника в димових тестах завантажувача. Імпортуйте з plugin-sdk/plugin-test-runtime |
registerProviderPlugin |
Збирає всі типи постачальників з одного Plugin. Імпортуйте з plugin-sdk/plugin-test-runtime |
registerProviderPlugins |
Збирає реєстрації постачальників із кількох Plugin. Імпортуйте з plugin-sdk/plugin-test-runtime |
requireRegisteredProvider |
Перевіряє, що колекція постачальників містить ідентифікатор. Імпортуйте з plugin-sdk/plugin-test-runtime |
createRuntimeEnv |
Створює імітоване середовище виконання CLI/Plugin. Імпортуйте з plugin-sdk/plugin-test-runtime |
createPluginRuntimeMock |
Створює імітовану поверхню середовища виконання Plugin. Імпортуйте з plugin-sdk/plugin-test-runtime |
createPluginSetupWizardStatus |
Створює допоміжні засоби стану налаштування для Plugin каналів. Імпортуйте з plugin-sdk/plugin-test-runtime |
createTestWizardPrompter |
Створює імітований засіб запитів майстра налаштування. Імпортуйте з plugin-sdk/plugin-test-runtime |
createRuntimeTaskFlow |
Створює ізольований стан потоку завдань середовища виконання. Імпортуйте з plugin-sdk/plugin-test-runtime |
runProviderCatalog |
Виконує хук каталогу постачальника з тестовими залежностями. Імпортуйте з plugin-sdk/plugin-test-runtime |
resolveProviderWizardOptions |
Визначає варіанти вибору майстра налаштування постачальника в тестах контракту. Імпортуйте з plugin-sdk/plugin-test-runtime |
resolveProviderModelPickerEntries |
Визначає записи засобу вибору моделі постачальника в тестах контракту. Імпортуйте з plugin-sdk/plugin-test-runtime |
buildProviderPluginMethodChoice |
Створює ідентифікатори варіантів вибору майстра постачальника для перевірок. Імпортуйте з plugin-sdk/plugin-test-runtime |
setProviderWizardProvidersResolverForTest |
Впроваджує постачальників майстра постачальника для ізольованих тестів. Імпортуйте з plugin-sdk/plugin-test-runtime |
describeOpenAIProviderRuntimeContract |
Установлює перевірки контракту середовища виконання сімейства постачальників. Імпортуйте з plugin-sdk/provider-test-contracts |
expectPassthroughReplayPolicy |
Перевіряє, що політики повторного відтворення постачальника пропускають інструменти й метадані, якими володіє постачальник. Імпортуйте з plugin-sdk/provider-test-contracts |
runRealtimeSttLiveTest |
Запускає інтерактивний тест постачальника STT у реальному часі зі спільними аудіофікстурами. Імпортуйте з plugin-sdk/provider-test-contracts |
normalizeTranscriptForMatch |
Нормалізує вихідні дані інтерактивної транскрипції перед нечіткими перевірками. Імпортуйте з plugin-sdk/provider-test-contracts |
expectExplicitVideoGenerationCapabilities |
Перевіряє, що постачальники відео явно оголошують можливості режиму генерування. Імпортуйте з plugin-sdk/provider-test-contracts |
expectExplicitMusicGenerationCapabilities |
Перевіряє, що постачальники музики явно оголошують можливості генерування та редагування. Імпортуйте з plugin-sdk/provider-test-contracts |
mockSuccessfulDashscopeVideoTask |
Установлює успішну відповідь відеозавдання, сумісного з DashScope. Імпортуйте з plugin-sdk/provider-test-contracts |
getProviderHttpMocks |
Надає доступ до активованих за потреби макетів HTTP/автентифікації постачальника у Vitest. Імпортуйте з plugin-sdk/provider-http-test-mocks |
installProviderHttpMockCleanup |
Скидає макети HTTP/автентифікації постачальника після кожного тесту. Імпортуйте з plugin-sdk/provider-http-test-mocks |
installCommonResolveTargetErrorCases |
Спільні тестові випадки для обробки помилок визначення цілі. Імпортуйте з plugin-sdk/channel-target-testing |
shouldAckReaction |
Перевіряє, чи має канал додати реакцію-підтвердження. Імпортуйте з plugin-sdk/channel-feedback |
removeAckReactionAfterReply |
Видаляє реакцію-підтвердження після доставки відповіді. Імпортуйте з plugin-sdk/channel-feedback |
createTestRegistry |
Створює фікстуру реєстру Plugin каналів. Імпортуйте з plugin-sdk/plugin-test-runtime або plugin-sdk/channel-test-helpers |
createEmptyPluginRegistry |
Створює фікстуру порожнього реєстру Plugin. Імпортуйте з plugin-sdk/plugin-test-runtime або plugin-sdk/channel-test-helpers |
setActivePluginRegistry |
Установлює фікстуру реєстру для тестів середовища виконання Plugin. Імпортуйте з plugin-sdk/plugin-test-runtime або plugin-sdk/channel-test-helpers |
createRequestCaptureJsonFetch |
Перехоплює запити отримання JSON у тестах допоміжних засобів роботи з медіафайлами. Імпортуйте з plugin-sdk/test-env |
withServer |
Запускає тести з одноразовим локальним HTTP-сервером. Імпортуйте з plugin-sdk/test-env |
createMockIncomingRequest |
Створює мінімальний об’єкт вхідного HTTP-запиту. Імпортуйте з plugin-sdk/test-env |
withFetchPreconnect |
Запускає тести отримання з установленими хуками попереднього підключення. Імпортуйте з plugin-sdk/test-env |
withEnv / withEnvAsync |
Тимчасово змінює змінні середовища. Імпортуйте з plugin-sdk/test-env |
createTempHomeEnv / withTempHome / withTempDir |
Створює ізольовані фікстури файлової системи для тестів. Імпортуйте з plugin-sdk/test-env |
createMockServerResponse |
Створює мінімальний макет відповіді HTTP-сервера. Імпортуйте з plugin-sdk/test-env |
createProviderUsageFetch |
Створює фікстури отримання даних про використання постачальника. Імпортуйте з plugin-sdk/test-env |
useFrozenTime / useRealTime |
Заморожує та відновлює таймери для чутливих до часу тестів. Імпортуйте з plugin-sdk/test-env |
createCliRuntimeCapture |
Перехоплює вихідні дані середовища виконання CLI у тестах. Імпортуйте з plugin-sdk/test-fixtures |
importFreshModule |
Імпортує модуль ESM зі свіжим маркером запиту, щоб обійти кеш модулів. Імпортуйте з plugin-sdk/test-fixtures |
bundledPluginRoot / bundledPluginFile |
Визначає шляхи до фікстур вихідного коду або дистрибутива вбудованого Plugin. Імпортуйте з plugin-sdk/test-fixtures |
mockNodeBuiltinModule |
Установлює вузькоспеціалізовані макети вбудованих модулів Node у Vitest. Імпортуйте з plugin-sdk/test-node-mocks |
createSandboxTestContext |
Створює контексти тестування пісочниці. Імпортуйте з plugin-sdk/test-fixtures |
writeSkill |
Записує фікстури Skills. Імпортуйте з plugin-sdk/test-fixtures |
makeAgentAssistantMessage |
Створює фікстури повідомлень транскрипту агента. Імпортуйте з plugin-sdk/test-fixtures |
peekSystemEvents / resetSystemEventsForTest |
Перевіряє та скидає фікстури системних подій. Імпортуйте з plugin-sdk/test-fixtures |
sanitizeTerminalText |
Очищує виведення термінала для перевірок. Імпортуйте з plugin-sdk/test-fixtures |
countLines / hasBalancedFences |
Перевіряє структуру результату поділу на фрагменти. Імпортуйте з plugin-sdk/test-fixtures |
typedCases |
Зберігає літеральні типи для табличних тестів. Імпортуйте з plugin-sdk/test-fixtures |
Набори контрактних тестів для вбудованих плагінів також використовують ці підшляхи тестування SDK для
допоміжних засобів реєстру, маніфесту, публічних артефактів і фікстур середовища виконання, призначених лише для тестів.
Натомість набори тестів лише для ядра, що залежать від інвентарю вбудованих компонентів OpenClaw, залишаються в
src/plugins/contracts.
Типи
Спеціалізовані підшляхи тестування також повторно експортують типи, корисні в тестових файлах:
ChannelAccountSnapshot, ChannelGatewayContext,} from "openclaw/plugin-sdk/channel-contract"; Тестування визначення цільового об’єкта
Використовуйте installCommonResolveTargetErrorCases, щоб додати стандартні випадки помилок для
визначення цільового об’єкта каналу:
describe("my-channel target resolution", () => { installCommonResolveTargetErrorCases({ resolveTarget: ({ to, mode, allowFrom }) => { // Логіка визначення цільового об’єкта вашого каналу return myChannelResolveTarget({ to, mode, allowFrom }); }, implicitAllowFrom: ["user1", "user2"], }); // Додайте тестові випадки, специфічні для каналу it("should resolve @username targets", () => { // ... });});Шаблони тестування
Тестування контрактів реєстрації
Модульні тести, які передають написаний вручну макет api до register(api), не
перевіряють шлюзи прийняття завантажувача OpenClaw. Додайте принаймні один
димовий тест із використанням завантажувача для кожної поверхні реєстрації, від якої залежить ваш плагін, особливо
для хуків та ексклюзивних можливостей, як-от пам’ять.
Справжній завантажувач завершує реєстрацію плагіна помилкою, якщо відсутні обов’язкові метадані або
плагін викликає API можливості, якою він не володіє. Наприклад,
api.registerHook(...) потребує назви хука, а
api.registerMemoryCapability(...) потребує, щоб маніфест плагіна або експортований
запис оголошував kind: "memory".
Тестування доступу до конфігурації середовища виконання
Надавайте перевагу спільному макету середовища виконання плагіна з openclaw/plugin-sdk/plugin-test-runtime.
Його макети runtime.config.loadConfig() і runtime.config.writeConfigFile(...)
за замовчуванням викидають виняток, щоб тести виявляли нове використання застарілих API
сумісності. Перевизначайте ці макети лише тоді, коли тест явно перевіряє застарілу
поведінку сумісності.
Модульне тестування плагіна каналу
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"); // Значення токена не розкривається expect(inspection).not.toHaveProperty("token"); });});Модульне тестування плагіна постачальника
describe("my-provider plugin", () => { it("should resolve dynamic models", () => { const model = myProvider.resolveDynamicModel({ modelId: "custom-model-v2", // ... контекст }); 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" }), // ... контекст }); expect(result?.provider?.models).toHaveLength(2); });});Імітація середовища виконання плагіна
Для коду, що використовує createPluginRuntimeStore, імітуйте середовище виконання в тестах:
const store = createPluginRuntimeStore<PluginRuntime>({ pluginId: "test-plugin", errorMessage: "test runtime not set",}); // Під час налаштування тестуconst mockRuntime = { agent: { resolveAgentDir: vi.fn().mockReturnValue("/tmp/agent"), // ... інші макети }, config: { current: vi.fn(() => ({}) as const), mutateConfigFile: vi.fn(), replaceConfigFile: vi.fn(), }, // ... інші простори імен} as unknown as PluginRuntime; store.setRuntime(mockRuntime); // Після тестівstore.clearRuntime();Тестування із заглушками для окремих екземплярів
Надавайте перевагу заглушкам для окремих екземплярів замість зміни прототипу:
// Рекомендовано: заглушка для окремого екземпляраconst client = new MyChannelClient();client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" }); // Уникайте: зміна прототипу// MyChannelClient.prototype.sendMessage = vi.fn();Контрактні тести (плагіни в репозиторії)
Вбудовані плагіни мають контрактні тести, які перевіряють належність реєстрації:
pnpm test src/plugins/contracts/Ці тести перевіряють:
- Які плагіни реєструють яких постачальників
- Які плагіни реєструють яких постачальників мовлення
- Правильність форми реєстрації
- Відповідність контракту середовища виконання
Запуск тестів для обмеженої області
Для конкретного плагіна:
pnpm test <bundled-plugin-root>/my-channel/Лише для контрактних тестів:
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.tsПеревірки лінтером (плагіни в репозиторії)
scripts/run-additional-boundary-checks.mjs запускає в CI набір перевірок меж імпорту lint:plugins:*;
кожну з них також можна запускати окремо локально:
| Команда | Забезпечує дотримання |
|---|---|
pnpm run lint:plugins:no-monolithic-plugin-sdk-entry-imports |
Вбудовані плагіни не можуть імпортувати монолітний кореневий модуль експорту openclaw/plugin-sdk. |
pnpm run lint:plugins:no-extension-src-imports |
Робочі файли розширень не можуть безпосередньо імпортувати дерево репозиторію src/** (../../src/...). |
pnpm run lint:plugins:no-extension-test-core-imports |
Тестові файли розширень не можуть імпортувати openclaw/plugin-sdk/testing, plugin-sdk/test-utils або інші тестові допоміжні засоби лише для ядра. |
Зовнішні плагіни не підпадають під дію цих правил лінтера, але рекомендовано дотримуватися тих самих шаблонів.
Конфігурація тестів
OpenClaw використовує Vitest 4 з інформаційними звітами про покриття V8. Для тестів плагінів:
# Запустити всі тестиpnpm test # Запустити тести конкретного плагінаpnpm test <bundled-plugin-root>/my-channel/src/channel.test.ts # Запустити з фільтром за назвою конкретного тестуpnpm test <bundled-plugin-root>/my-channel/ -t "resolves account" # Запустити з покриттямpnpm test:coverageЯкщо локальні запуски спричиняють нестачу пам’яті:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testПов’язані матеріали
- Огляд SDK -- правила імпорту
- Плагіни каналів SDK -- інтерфейс плагіна каналу
- Плагіни постачальників SDK -- хуки плагіна постачальника
- Створення плагінів -- посібник із початку роботи