Plugin SDK reference
Kiểm thử Plugin
Tài liệu tham khảo về các tiện ích kiểm thử, mẫu và quy tắc thực thi lint cho các Plugin OpenClaw.
Tiện ích kiểm thử
Các đường dẫn con này là những điểm vào mã nguồn cục bộ trong kho lưu trữ dành cho
các bài kiểm thử Plugin đi kèm của chính OpenClaw. Chúng không phải là các export
package.json được phát hành cho Plugin bên thứ ba và có thể nhập Vitest hoặc
các phần phụ thuộc kiểm thử khác chỉ có trong kho lưu trữ.
shouldAckReaction, removeAckReactionAfterReply,} from "openclaw/plugin-sdk/channel-feedback"; bundledPluginRoot, createCliRuntimeCapture, typedCases,} from "openclaw/plugin-sdk/test-fixtures"; Ưu tiên các đường dẫn con chuyên biệt này cho bài kiểm thử Plugin đi kèm mới. Barrel
openclaw/plugin-sdk/testing tổng quát và bí danh openclaw/plugin-sdk/test-utils
chỉ dành cho khả năng tương thích cũ: pnpm run lint:plugins:no-extension-test-core-imports
(scripts/check-no-extension-test-core-imports.ts) từ chối các lệnh nhập mới
của một trong hai đường dẫn này từ các tệp kiểm thử phần mở rộng, và cả hai chỉ
được giữ lại cho các bài kiểm thử ghi nhận khả năng tương thích.
Các export có sẵn
| Thành phần xuất | Mục đích |
|---|---|
createTestPluginApi |
Tạo bản mô phỏng API Plugin tối thiểu cho các bài kiểm thử đơn vị đăng ký trực tiếp. Nhập từ plugin-sdk/plugin-test-api |
AUTH_PROFILE_RUNTIME_CONTRACT |
Fixture hợp đồng hồ sơ xác thực dùng chung cho các bộ điều hợp môi trường chạy tác nhân gốc. Nhập từ plugin-sdk/agent-runtime-test-contracts |
DELIVERY_NO_REPLY_RUNTIME_CONTRACT |
Fixture hợp đồng chặn gửi dùng chung cho các bộ điều hợp môi trường chạy tác nhân gốc. Nhập từ plugin-sdk/agent-runtime-test-contracts |
OUTCOME_FALLBACK_RUNTIME_CONTRACT |
Fixture hợp đồng phân loại dự phòng dùng chung cho các bộ điều hợp môi trường chạy tác nhân gốc. Nhập từ plugin-sdk/agent-runtime-test-contracts |
createParameterFreeTool |
Tạo fixture lược đồ công cụ động cho các bài kiểm thử hợp đồng môi trường chạy gốc. Nhập từ plugin-sdk/agent-runtime-test-contracts |
expectChannelInboundContextContract |
Xác nhận cấu trúc ngữ cảnh đầu vào của kênh. Nhập từ plugin-sdk/channel-contract-testing |
installChannelOutboundPayloadContractSuite |
Cài đặt các trường hợp hợp đồng tải trọng đầu ra của kênh. Nhập từ plugin-sdk/channel-contract-testing |
createStartAccountContext |
Tạo ngữ cảnh vòng đời tài khoản kênh. Nhập từ plugin-sdk/channel-test-helpers |
installChannelActionsContractSuite |
Cài đặt các trường hợp hợp đồng thao tác tin nhắn kênh dùng chung. Nhập từ plugin-sdk/channel-test-helpers |
installChannelSetupContractSuite |
Cài đặt các trường hợp hợp đồng thiết lập kênh dùng chung. Nhập từ plugin-sdk/channel-test-helpers |
installChannelStatusContractSuite |
Cài đặt các trường hợp hợp đồng trạng thái kênh dùng chung. Nhập từ plugin-sdk/channel-test-helpers |
expectDirectoryIds |
Xác nhận các mã định danh thư mục kênh từ một hàm liệt kê thư mục. Nhập từ plugin-sdk/channel-test-helpers |
assertBundledChannelEntries |
Xác nhận các điểm vào của kênh đi kèm cung cấp hợp đồng công khai như mong đợi. Nhập từ plugin-sdk/channel-test-helpers |
formatEnvelopeTimestamp |
Định dạng dấu thời gian phong bì theo cách xác định. Nhập từ plugin-sdk/channel-test-helpers |
expectPairingReplyText |
Xác nhận văn bản trả lời ghép nối kênh và trích xuất mã của văn bản đó. Nhập từ plugin-sdk/channel-test-helpers |
describePluginRegistrationContract |
Cài đặt các bước kiểm tra hợp đồng đăng ký Plugin. Nhập từ plugin-sdk/plugin-test-contracts |
registerSingleProviderPlugin |
Đăng ký một Plugin nhà cung cấp trong các bài kiểm thử khói của trình tải. Nhập từ plugin-sdk/plugin-test-runtime |
registerProviderPlugin |
Thu thập tất cả loại nhà cung cấp từ một Plugin. Nhập từ plugin-sdk/plugin-test-runtime |
registerProviderPlugins |
Thu thập các lượt đăng ký nhà cung cấp trên nhiều Plugin. Nhập từ plugin-sdk/plugin-test-runtime |
requireRegisteredProvider |
Xác nhận rằng một tập hợp nhà cung cấp chứa một mã định danh. Nhập từ plugin-sdk/plugin-test-runtime |
createRuntimeEnv |
Tạo môi trường chạy CLI/Plugin được mô phỏng. Nhập từ plugin-sdk/plugin-test-runtime |
createPluginRuntimeMock |
Tạo bề mặt môi trường chạy Plugin được mô phỏng. Nhập từ plugin-sdk/plugin-test-runtime |
createPluginSetupWizardStatus |
Tạo các trình trợ giúp trạng thái thiết lập cho Plugin kênh. Nhập từ plugin-sdk/plugin-test-runtime |
createTestWizardPrompter |
Tạo trình nhắc của trình hướng dẫn thiết lập được mô phỏng. Nhập từ plugin-sdk/plugin-test-runtime |
createRuntimeTaskFlow |
Tạo trạng thái luồng tác vụ môi trường chạy biệt lập. Nhập từ plugin-sdk/plugin-test-runtime |
runProviderCatalog |
Thực thi hook danh mục nhà cung cấp với các phần phụ thuộc kiểm thử. Nhập từ plugin-sdk/plugin-test-runtime |
resolveProviderWizardOptions |
Phân giải các lựa chọn của trình hướng dẫn thiết lập nhà cung cấp trong các bài kiểm thử hợp đồng. Nhập từ plugin-sdk/plugin-test-runtime |
resolveProviderModelPickerEntries |
Phân giải các mục của bộ chọn mô hình nhà cung cấp trong các bài kiểm thử hợp đồng. Nhập từ plugin-sdk/plugin-test-runtime |
buildProviderPluginMethodChoice |
Tạo mã định danh lựa chọn của trình hướng dẫn nhà cung cấp để xác nhận. Nhập từ plugin-sdk/plugin-test-runtime |
setProviderWizardProvidersResolverForTest |
Chèn các nhà cung cấp của trình hướng dẫn nhà cung cấp cho các bài kiểm thử biệt lập. Nhập từ plugin-sdk/plugin-test-runtime |
describeOpenAIProviderRuntimeContract |
Cài đặt các bước kiểm tra hợp đồng môi trường chạy của họ nhà cung cấp. Nhập từ plugin-sdk/provider-test-contracts |
expectPassthroughReplayPolicy |
Xác nhận các chính sách phát lại của nhà cung cấp chuyển nguyên trạng các công cụ và siêu dữ liệu do nhà cung cấp sở hữu. Nhập từ plugin-sdk/provider-test-contracts |
runRealtimeSttLiveTest |
Chạy bài kiểm thử trực tiếp nhà cung cấp STT thời gian thực với các fixture âm thanh dùng chung. Nhập từ plugin-sdk/provider-test-contracts |
normalizeTranscriptForMatch |
Chuẩn hóa đầu ra bản chép lời trực tiếp trước khi thực hiện các phép xác nhận gần đúng. Nhập từ plugin-sdk/provider-test-contracts |
expectExplicitVideoGenerationCapabilities |
Xác nhận các nhà cung cấp video khai báo rõ ràng khả năng của chế độ tạo sinh. Nhập từ plugin-sdk/provider-test-contracts |
expectExplicitMusicGenerationCapabilities |
Xác nhận các nhà cung cấp nhạc khai báo rõ ràng khả năng tạo sinh/chỉnh sửa. Nhập từ plugin-sdk/provider-test-contracts |
mockSuccessfulDashscopeVideoTask |
Cài đặt phản hồi tác vụ video tương thích với DashScope thành công. Nhập từ plugin-sdk/provider-test-contracts |
getProviderHttpMocks |
Truy cập các bản mô phỏng Vitest HTTP/xác thực của nhà cung cấp theo cơ chế chủ động bật. Nhập từ plugin-sdk/provider-http-test-mocks |
installProviderHttpMockCleanup |
Đặt lại các bản mô phỏng HTTP/xác thực của nhà cung cấp sau mỗi bài kiểm thử. Nhập từ plugin-sdk/provider-http-test-mocks |
installCommonResolveTargetErrorCases |
Các trường hợp kiểm thử dùng chung cho việc xử lý lỗi phân giải đích. Nhập từ plugin-sdk/channel-target-testing |
shouldAckReaction |
Kiểm tra xem một kênh có nên thêm phản ứng xác nhận hay không. Nhập từ plugin-sdk/channel-feedback |
removeAckReactionAfterReply |
Xóa phản ứng xác nhận sau khi gửi câu trả lời. Nhập từ plugin-sdk/channel-feedback |
createTestRegistry |
Tạo fixture sổ đăng ký Plugin kênh. Nhập từ plugin-sdk/plugin-test-runtime hoặc plugin-sdk/channel-test-helpers |
createEmptyPluginRegistry |
Tạo fixture sổ đăng ký Plugin trống. Nhập từ plugin-sdk/plugin-test-runtime hoặc plugin-sdk/channel-test-helpers |
setActivePluginRegistry |
Cài đặt fixture sổ đăng ký cho các bài kiểm thử môi trường chạy Plugin. Nhập từ plugin-sdk/plugin-test-runtime hoặc plugin-sdk/channel-test-helpers |
createRequestCaptureJsonFetch |
Thu thập các yêu cầu tìm nạp JSON trong các bài kiểm thử trình trợ giúp phương tiện. Nhập từ plugin-sdk/test-env |
withServer |
Chạy các bài kiểm thử với một máy chủ HTTP cục bộ dùng một lần. Nhập từ plugin-sdk/test-env |
createMockIncomingRequest |
Tạo đối tượng yêu cầu HTTP đến tối thiểu. Nhập từ plugin-sdk/test-env |
withFetchPreconnect |
Chạy các bài kiểm thử tìm nạp khi đã cài đặt hook kết nối trước. Nhập từ plugin-sdk/test-env |
withEnv / withEnvAsync |
Tạm thời sửa các biến môi trường. Nhập từ plugin-sdk/test-env |
createTempHomeEnv / withTempHome / withTempDir |
Tạo các fixture kiểm thử hệ thống tệp biệt lập. Nhập từ plugin-sdk/test-env |
createMockServerResponse |
Tạo bản mô phỏng phản hồi máy chủ HTTP tối thiểu. Nhập từ plugin-sdk/test-env |
createProviderUsageFetch |
Tạo các fixture tìm nạp mức sử dụng của nhà cung cấp. Nhập từ plugin-sdk/test-env |
useFrozenTime / useRealTime |
Đóng băng và khôi phục bộ hẹn giờ cho các bài kiểm thử nhạy cảm với thời gian. Nhập từ plugin-sdk/test-env |
createCliRuntimeCapture |
Thu thập đầu ra môi trường chạy CLI trong các bài kiểm thử. Nhập từ plugin-sdk/test-fixtures |
importFreshModule |
Nhập một mô-đun ESM với mã truy vấn mới để bỏ qua bộ nhớ đệm mô-đun. Nhập từ plugin-sdk/test-fixtures |
bundledPluginRoot / bundledPluginFile |
Phân giải đường dẫn fixture mã nguồn hoặc bản phân phối của Plugin đi kèm. Nhập từ plugin-sdk/test-fixtures |
mockNodeBuiltinModule |
Cài đặt các bản mô phỏng Vitest có phạm vi hẹp cho mô-đun tích hợp sẵn của Node. Nhập từ plugin-sdk/test-node-mocks |
createSandboxTestContext |
Tạo các ngữ cảnh kiểm thử hộp cát. Nhập từ plugin-sdk/test-fixtures |
writeSkill |
Ghi các fixture của skill. Nhập từ plugin-sdk/test-fixtures |
makeAgentAssistantMessage |
Tạo các fixture thông báo bản ghi hội thoại của tác tử. Nhập từ plugin-sdk/test-fixtures |
peekSystemEvents / resetSystemEventsForTest |
Kiểm tra và đặt lại các fixture sự kiện hệ thống. Nhập từ plugin-sdk/test-fixtures |
sanitizeTerminalText |
Làm sạch đầu ra terminal để dùng trong các phép xác nhận. Nhập từ plugin-sdk/test-fixtures |
countLines / hasBalancedFences |
Xác nhận hình dạng đầu ra phân đoạn. Nhập từ plugin-sdk/test-fixtures |
typedCases |
Giữ nguyên các kiểu literal cho kiểm thử dựa trên bảng. Nhập từ plugin-sdk/test-fixtures |
Các bộ kiểm thử hợp đồng cho Plugin đi kèm cũng sử dụng các đường dẫn con kiểm thử SDK này cho các trình trợ giúp fixture dành riêng cho kiểm thử về registry, manifest, tạo phẩm công khai và runtime.
Thay vào đó, các bộ kiểm thử chỉ dành cho lõi phụ thuộc vào danh mục OpenClaw đi kèm vẫn nằm trong
src/plugins/contracts.
Kiểu
Các đường dẫn con kiểm thử chuyên biệt cũng tái xuất các kiểu hữu ích trong tệp kiểm thử:
ChannelAccountSnapshot, ChannelGatewayContext,} from "openclaw/plugin-sdk/channel-contract"; Phân giải đích kiểm thử
Sử dụng installCommonResolveTargetErrorCases để thêm các trường hợp lỗi tiêu chuẩn cho việc phân giải đích của kênh:
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", () => { // ... });});Mẫu kiểm thử
Kiểm thử hợp đồng đăng ký
Các kiểm thử đơn vị truyền mô phỏng api viết thủ công vào register(api) không
thực thi các cổng chấp nhận của trình tải OpenClaw. Hãy thêm ít nhất một kiểm thử nhanh
dựa trên trình tải cho mỗi bề mặt đăng ký mà Plugin của bạn phụ thuộc, đặc biệt là
các hook và khả năng độc quyền như bộ nhớ.
Trình tải thực tế sẽ không đăng ký được Plugin khi thiếu siêu dữ liệu bắt buộc hoặc
Plugin gọi API khả năng mà nó không sở hữu. Ví dụ:
api.registerHook(...) yêu cầu tên hook, còn
api.registerMemoryCapability(...) yêu cầu manifest của Plugin hoặc mục nhập được xuất
khai báo kind: "memory".
Kiểm thử quyền truy cập cấu hình runtime
Ưu tiên mô phỏng runtime Plugin dùng chung từ openclaw/plugin-sdk/plugin-test-runtime.
Các mô phỏng runtime.config.loadConfig() và runtime.config.writeConfigFile(...)
của nó mặc định sẽ phát sinh lỗi để kiểm thử phát hiện việc sử dụng mới các API tương thích
đã lỗi thời. Chỉ ghi đè các mô phỏng đó khi kiểm thử rõ ràng bao phủ hành vi tương thích
cũ.
Kiểm thử đơn vị Plugin kênh
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"); });});Kiểm thử đơn vị Plugin nhà cung cấp
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); });});Mô phỏng runtime Plugin
Đối với mã sử dụng createPluginRuntimeStore, hãy mô phỏng runtime trong các kiểm thử:
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();Kiểm thử bằng stub theo từng thực thể
Ưu tiên stub theo từng thực thể thay vì sửa đổi prototype:
// Preferred: per-instance stubconst client = new MyChannelClient();client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" }); // Avoid: prototype mutation// MyChannelClient.prototype.sendMessage = vi.fn();Kiểm thử hợp đồng (Plugin trong kho mã)
Các Plugin đi kèm có kiểm thử hợp đồng xác minh quyền sở hữu đăng ký:
pnpm test src/plugins/contracts/Các kiểm thử này xác nhận:
- Plugin nào đăng ký nhà cung cấp nào
- Plugin nào đăng ký nhà cung cấp giọng nói nào
- Tính chính xác của cấu trúc đăng ký
- Tuân thủ hợp đồng runtime
Chạy kiểm thử theo phạm vi
Đối với một Plugin cụ thể:
pnpm test <bundled-plugin-root>/my-channel/Chỉ đối với kiểm thử hợp đồng:
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.tsThực thi lint (Plugin trong kho mã)
scripts/run-additional-boundary-checks.mjs chạy một tập hợp kiểm tra ranh giới nhập
lint:plugins:* trong CI; mỗi kiểm tra cũng có thể được chạy độc lập cục bộ:
| Lệnh | Thực thi |
|---|---|
pnpm run lint:plugins:no-monolithic-plugin-sdk-entry-imports |
Các Plugin đi kèm không được nhập barrel gốc nguyên khối openclaw/plugin-sdk. |
pnpm run lint:plugins:no-extension-src-imports |
Các tệp tiện ích mở rộng dùng trong môi trường sản xuất không được nhập trực tiếp cây src/** của kho mã (../../src/...). |
pnpm run lint:plugins:no-extension-test-core-imports |
Các tệp kiểm thử tiện ích mở rộng không được nhập openclaw/plugin-sdk/testing, plugin-sdk/test-utils hoặc trình trợ giúp kiểm thử chỉ dành cho lõi khác. |
Các Plugin bên ngoài không phải tuân theo các quy tắc lint này, nhưng nên làm theo cùng các mẫu.
Cấu hình kiểm thử
OpenClaw sử dụng Vitest 4 với báo cáo độ bao phủ V8 mang tính cung cấp thông tin. Đối với kiểm thử 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:coverageNếu chạy cục bộ gây áp lực bộ nhớ:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testLiên quan
- Tổng quan về SDK -- quy ước nhập
- Plugin kênh SDK -- giao diện Plugin kênh
- Plugin nhà cung cấp SDK -- các hook của Plugin nhà cung cấp
- Xây dựng Plugin -- hướng dẫn bắt đầu