Ana içeriğe atla
OpenClaw Plugin’leri için test yardımcıları, kalıplar ve lint uygulaması başvurusu.
Test örnekleri mi arıyorsunuz? Nasıl yapılır kılavuzları çalışılmış test örnekleri içerir: Kanal Plugin testleri ve Sağlayıcı Plugin testleri.

Test yardımcıları

Bu test yardımcısı alt yolları, OpenClaw’ın kendi birlikte gelen Plugin testleri için depo yerelindeki kaynak giriş noktalarıdır. Üçüncü taraf Plugin’ler için paket dışa aktarımları değildir ve Vitest veya yalnızca depoya özgü diğer test bağımlılıklarını içe aktarabilirler. Plugin API sahte içe aktarması: openclaw/plugin-sdk/plugin-test-api Ajan çalışma zamanı sözleşmesi içe aktarması: openclaw/plugin-sdk/agent-runtime-test-contracts Kanal sözleşmesi içe aktarması: openclaw/plugin-sdk/channel-contract-testing Kanal test yardımcısı içe aktarması: openclaw/plugin-sdk/channel-test-helpers Kanal hedefi testi içe aktarması: openclaw/plugin-sdk/channel-target-testing Plugin sözleşmesi içe aktarması: openclaw/plugin-sdk/plugin-test-contracts Plugin çalışma zamanı testi içe aktarması: openclaw/plugin-sdk/plugin-test-runtime Sağlayıcı sözleşmesi içe aktarması: openclaw/plugin-sdk/provider-test-contracts Sağlayıcı HTTP sahte içe aktarması: openclaw/plugin-sdk/provider-http-test-mocks Ortam/ağ testi içe aktarması: openclaw/plugin-sdk/test-env Genel fikstür içe aktarması: openclaw/plugin-sdk/test-fixtures Node yerleşik sahte içe aktarması: openclaw/plugin-sdk/test-node-mocks OpenClaw deposu içinde, yeni birlikte gelen Plugin testleri için aşağıdaki odaklı alt yolları tercih edin. Geniş openclaw/plugin-sdk/testing barrel dışa aktarımı yalnızca eski uyumluluk içindir. Depo koruma kuralları, plugin-sdk/testing ve plugin-sdk/test-utils üzerinden yeni gerçek içe aktarmaları reddeder; bu adlar yalnızca uyumluluk kaydı testleri için kullanımdan kaldırılmış uyumluluk yüzeyleri olarak kalır.
import {
  shouldAckReaction,
  removeAckReactionAfterReply,
} from "openclaw/plugin-sdk/channel-feedback";
import { installCommonResolveTargetErrorCases } from "openclaw/plugin-sdk/channel-target-testing";
import { AUTH_PROFILE_RUNTIME_CONTRACT } from "openclaw/plugin-sdk/agent-runtime-test-contracts";
import { createTestPluginApi } from "openclaw/plugin-sdk/plugin-test-api";
import { expectChannelInboundContextContract } from "openclaw/plugin-sdk/channel-contract-testing";
import { createStartAccountContext } from "openclaw/plugin-sdk/channel-test-helpers";
import { describePluginRegistrationContract } from "openclaw/plugin-sdk/plugin-test-contracts";
import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime";
import { describeOpenAIProviderRuntimeContract } from "openclaw/plugin-sdk/provider-test-contracts";
import { getProviderHttpMocks } from "openclaw/plugin-sdk/provider-http-test-mocks";
import { withEnv, withFetchPreconnect, withServer } from "openclaw/plugin-sdk/test-env";
import {
  bundledPluginRoot,
  createCliRuntimeCapture,
  typedCases,
} from "openclaw/plugin-sdk/test-fixtures";
import { mockNodeBuiltinModule } from "openclaw/plugin-sdk/test-node-mocks";

Kullanılabilir dışa aktarımlar

Dışa AktarımAmaç
createTestPluginApiDoğrudan kayıt birim testleri için minimal bir Plugin API mock’u oluşturun. plugin-sdk/plugin-test-api konumundan içe aktarın
AUTH_PROFILE_RUNTIME_CONTRACTYerel ajan çalışma zamanı bağdaştırıcıları için paylaşılan kimlik doğrulama profili sözleşme fixture’ı. plugin-sdk/agent-runtime-test-contracts konumundan içe aktarın
DELIVERY_NO_REPLY_RUNTIME_CONTRACTYerel ajan çalışma zamanı bağdaştırıcıları için paylaşılan teslim bastırma sözleşme fixture’ı. plugin-sdk/agent-runtime-test-contracts konumundan içe aktarın
OUTCOME_FALLBACK_RUNTIME_CONTRACTYerel ajan çalışma zamanı bağdaştırıcıları için paylaşılan fallback sınıflandırma sözleşme fixture’ı. plugin-sdk/agent-runtime-test-contracts konumundan içe aktarın
createParameterFreeToolYerel çalışma zamanı sözleşme testleri için dinamik araç şema fixture’ları oluşturun. plugin-sdk/agent-runtime-test-contracts konumundan içe aktarın
expectChannelInboundContextContractKanal gelen bağlam şeklini doğrulayın. plugin-sdk/channel-contract-testing konumundan içe aktarın
installChannelOutboundPayloadContractSuiteKanal giden payload sözleşme durumlarını yükleyin. plugin-sdk/channel-contract-testing konumundan içe aktarın
createStartAccountContextKanal hesabı yaşam döngüsü bağlamları oluşturun. plugin-sdk/channel-test-helpers konumundan içe aktarın
installChannelActionsContractSuiteGenel kanal mesaj eylemi sözleşme durumlarını yükleyin. plugin-sdk/channel-test-helpers konumundan içe aktarın
installChannelSetupContractSuiteGenel kanal kurulum sözleşme durumlarını yükleyin. plugin-sdk/channel-test-helpers konumundan içe aktarın
installChannelStatusContractSuiteGenel kanal durum sözleşme durumlarını yükleyin. plugin-sdk/channel-test-helpers konumundan içe aktarın
expectDirectoryIdsBir dizin listeleme işlevinden gelen kanal dizin kimliklerini doğrulayın. plugin-sdk/channel-test-helpers konumundan içe aktarın
assertBundledChannelEntriesPaketli kanal giriş noktalarının beklenen genel sözleşmeyi sunduğunu doğrulayın. plugin-sdk/channel-test-helpers konumundan içe aktarın
formatEnvelopeTimestampDeterministik zarf zaman damgalarını biçimlendirin. plugin-sdk/channel-test-helpers konumundan içe aktarın
expectPairingReplyTextKanal eşleştirme yanıt metnini doğrulayın ve kodunu çıkarın. plugin-sdk/channel-test-helpers konumundan içe aktarın
describePluginRegistrationContractPlugin kayıt sözleşmesi denetimlerini yükleyin. plugin-sdk/plugin-test-contracts konumundan içe aktarın
registerSingleProviderPluginYükleyici smoke testlerinde tek bir sağlayıcı Plugin’i kaydedin. plugin-sdk/plugin-test-runtime konumundan içe aktarın
registerProviderPluginTek bir Plugin’den tüm sağlayıcı türlerini yakalayın. plugin-sdk/plugin-test-runtime konumundan içe aktarın
registerProviderPluginsBirden çok Plugin genelinde sağlayıcı kayıtlarını yakalayın. plugin-sdk/plugin-test-runtime konumundan içe aktarın
requireRegisteredProviderBir sağlayıcı koleksiyonunun bir kimlik içerdiğini doğrulayın. plugin-sdk/plugin-test-runtime konumundan içe aktarın
createRuntimeEnvMock’lanmış bir CLI/Plugin çalışma zamanı ortamı oluşturun. plugin-sdk/plugin-test-runtime konumundan içe aktarın
createPluginRuntimeMockMock’lanmış bir Plugin çalışma zamanı yüzeyi oluşturun. plugin-sdk/plugin-test-runtime konumundan içe aktarın
createPluginSetupWizardStatusKanal Plugin’leri için kurulum durumu yardımcıları oluşturun. plugin-sdk/plugin-test-runtime konumundan içe aktarın
describeOpenAIProviderRuntimeContractSağlayıcı ailesi çalışma zamanı sözleşme denetimlerini yükleyin. plugin-sdk/provider-test-contracts konumundan içe aktarın
expectPassthroughReplayPolicySağlayıcı tekrar yürütme ilkelerinin sağlayıcıya ait araçları ve meta verileri aynen geçirdiğini doğrulayın. plugin-sdk/provider-test-contracts konumundan içe aktarın
runRealtimeSttLiveTestPaylaşılan ses fixture’larıyla canlı bir gerçek zamanlı STT sağlayıcı testi çalıştırın. plugin-sdk/provider-test-contracts konumundan içe aktarın
normalizeTranscriptForMatchYaklaşık eşleştirme doğrulamalarından önce canlı transkript çıktısını normalleştirin. plugin-sdk/provider-test-contracts konumundan içe aktarın
expectExplicitVideoGenerationCapabilitiesVideo sağlayıcılarının açık üretim modu yetenekleri bildirdiğini doğrulayın. plugin-sdk/provider-test-contracts konumundan içe aktarın
expectExplicitMusicGenerationCapabilitiesMüzik sağlayıcılarının açık üretim/düzenleme yetenekleri bildirdiğini doğrulayın. plugin-sdk/provider-test-contracts konumundan içe aktarın
mockSuccessfulDashscopeVideoTaskBaşarılı bir DashScope uyumlu video görevi yanıtı yükleyin. plugin-sdk/provider-test-contracts konumundan içe aktarın
getProviderHttpMocksOpt-in sağlayıcı HTTP/kimlik doğrulama Vitest mock’larına erişin. plugin-sdk/provider-http-test-mocks konumundan içe aktarın
installProviderHttpMockCleanupHer testten sonra sağlayıcı HTTP/kimlik doğrulama mock’larını sıfırlayın. plugin-sdk/provider-http-test-mocks konumundan içe aktarın
installCommonResolveTargetErrorCasesHedef çözümleme hata işleme için paylaşılan test durumları. plugin-sdk/channel-target-testing konumundan içe aktarın
shouldAckReactionBir kanalın onay tepkisi ekleyip eklemeyeceğini denetleyin. plugin-sdk/channel-feedback konumundan içe aktarın
removeAckReactionAfterReplyYanıt tesliminden sonra onay tepkisini kaldırın. plugin-sdk/channel-feedback konumundan içe aktarın
createTestRegistryBir kanal Plugin kayıt defteri fixture’ı oluşturun. plugin-sdk/plugin-test-runtime veya plugin-sdk/channel-test-helpers konumundan içe aktarın
createEmptyPluginRegistryBoş bir Plugin kayıt defteri fixture’ı oluşturun. plugin-sdk/plugin-test-runtime veya plugin-sdk/channel-test-helpers konumundan içe aktarın
setActivePluginRegistryPlugin çalışma zamanı testleri için bir kayıt defteri fixture’ı yükleyin. plugin-sdk/plugin-test-runtime veya plugin-sdk/channel-test-helpers konumundan içe aktarın
createRequestCaptureJsonFetchMedya yardımcı testlerinde JSON fetch isteklerini yakalayın. plugin-sdk/test-env konumundan içe aktarın
withServerTestleri tek kullanımlık yerel HTTP sunucusuna karşı çalıştırın. plugin-sdk/test-env konumundan içe aktarın
createMockIncomingRequestMinimal bir gelen HTTP isteği nesnesi oluşturun. plugin-sdk/test-env konumundan içe aktarın
withFetchPreconnectFetch testlerini ön bağlantı kancaları yüklü şekilde çalıştırın. plugin-sdk/test-env konumundan içe aktarın
withEnv / withEnvAsyncOrtam değişkenlerini geçici olarak yamalayın. plugin-sdk/test-env konumundan içe aktarın
createTempHomeEnv / withTempHome / withTempDirYalıtılmış dosya sistemi test fixture’ları oluşturun. plugin-sdk/test-env konumundan içe aktarın
createMockServerResponseMinimal bir HTTP sunucusu yanıt mock’u oluşturun. plugin-sdk/test-env konumundan içe aktarın
createCliRuntimeCaptureTestlerde CLI çalışma zamanı çıktısını yakalayın. plugin-sdk/test-fixtures konumundan içe aktarın
importFreshModuleModül önbelleğini atlamak için yeni bir sorgu belirteciyle bir ESM modülünü içe aktarın. plugin-sdk/test-fixtures konumundan içe aktarın
bundledPluginRoot / bundledPluginFilePaketli Plugin kaynak veya dağıtım fixture yollarını çözümleyin. plugin-sdk/test-fixtures konumundan içe aktarın
mockNodeBuiltinModuleDar kapsamlı Node yerleşik Vitest mock’larını yükleyin. plugin-sdk/test-node-mocks konumundan içe aktarın
createSandboxTestContextSandbox test bağlamları oluşturun. plugin-sdk/test-fixtures konumundan içe aktarın
writeSkillSkill fixture’ları yazın. plugin-sdk/test-fixtures konumundan içe aktarın
makeAgentAssistantMessageAjan transkript mesajı fixture’ları oluşturun. plugin-sdk/test-fixtures konumundan içe aktarın
peekSystemEvents / resetSystemEventsForTestSistem olayı fixture’larını inceleyin ve sıfırlayın. plugin-sdk/test-fixtures konumundan içe aktarın
sanitizeTerminalTextDoğrulamalar için terminal çıktısını temizleyin. plugin-sdk/test-fixtures konumundan içe aktarın
countLines / hasBalancedFencesParçalama çıktısının şeklini doğrulayın. plugin-sdk/test-fixtures konumundan içe aktarın
runProviderCatalogTest bağımlılıklarıyla bir sağlayıcı katalog kancasını çalıştırın
resolveProviderWizardOptionsSözleşme testlerinde sağlayıcı kurulum sihirbazı seçeneklerini çözümleyin
resolveProviderModelPickerEntriesSözleşme testlerinde sağlayıcı model seçici girişlerini çözümleyin
buildProviderPluginMethodChoiceDoğrulamalar için sağlayıcı sihirbazı seçim kimlikleri oluşturun
setProviderWizardProvidersResolverForTestYalıtılmış testler için sağlayıcı sihirbazı sağlayıcılarını enjekte et
createProviderUsageFetchSağlayıcı kullanım getirme fixture’larını oluştur
useFrozenTime / useRealTimeZamana duyarlı testler için zamanlayıcıları dondur ve geri yükle. plugin-sdk/test-env içinden içe aktar
createTestWizardPrompterMock’lanmış bir kurulum sihirbazı prompter’ı oluştur
createRuntimeTaskFlowYalıtılmış çalışma zamanı görev akışı durumunu oluştur
typedCasesTablo güdümlü testler için literal türleri koru. plugin-sdk/test-fixtures içinden içe aktar
Birlikte gelen plugin sözleşme paketleri, yalnızca test amaçlı kayıt defteri, manifest, herkese açık yapıt ve çalışma zamanı fixture yardımcıları için SDK test alt yollarını da kullanır. Birlikte gelen OpenClaw envanterine bağlı yalnızca çekirdek paketler src/plugins/contracts altında kalır. Yeni uzantı testlerini, geniş plugin-sdk/testing uyumluluk barrel’ını, repo src/** dosyalarını veya repo test/helpers/* köprülerini doğrudan içe aktarmak yerine 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 ya da plugin-sdk/test-fixtures gibi belgelenmiş, odaklı bir SDK alt yolunda tutun.

Türler

Odaklı test alt yolları, test dosyalarında yararlı olan türleri de yeniden dışa aktarır:
import type {
  ChannelAccountSnapshot,
  ChannelGatewayContext,
} from "openclaw/plugin-sdk/channel-contract";
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
import type { MockFn, PluginRuntime, RuntimeEnv } from "openclaw/plugin-sdk/plugin-test-runtime";

Test hedefi çözümleme

Kanal hedefi çözümleme için standart hata durumları eklemek üzere installCommonResolveTargetErrorCases kullanın:
import { describe } from "vitest";
import { installCommonResolveTargetErrorCases } from "openclaw/plugin-sdk/channel-target-testing";

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", () => {
    // ...
  });
});

Test kalıpları

Kayıt sözleşmelerini test etme

register(api) işlevine elle yazılmış bir api mock’u geçiren birim testleri, OpenClaw’ın yükleyici kabul kapılarını çalıştırmaz. Plugin’inizin bağlı olduğu her kayıt yüzeyi için, özellikle hook’lar ve bellek gibi özel yetenekler için en az bir yükleyici destekli smoke testi ekleyin. Gerçek yükleyici, gerekli meta veriler eksik olduğunda veya bir plugin sahip olmadığı bir yetenek API’sini çağırdığında plugin kaydını başarısız yapar. Örneğin, api.registerHook(...) bir hook adı gerektirir ve api.registerMemoryCapability(...), plugin manifestinin veya dışa aktarılan girdinin kind: "memory" bildirmesini gerektirir.

Çalışma zamanı yapılandırma erişimini test etme

openclaw/plugin-sdk/plugin-test-runtime içindeki paylaşılan plugin çalışma zamanı mock’unu tercih edin. Kullanımdan kaldırılmış runtime.config.loadConfig() ve runtime.config.writeConfigFile(...) mock’ları varsayılan olarak hata fırlatır; böylece testler uyumluluk API’lerinin yeni kullanımlarını yakalar. Bu mock’ları yalnızca test açıkça eski uyumluluk davranışını kapsıyorsa geçersiz kılın.

Bir kanal plugin’ini birim test etme

import { describe, it, expect, vi } from "vitest";

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");
  });
});

Bir sağlayıcı plugin’ini birim test etme

import { describe, it, expect } from "vitest";

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);
  });
});

Plugin çalışma zamanını mock’lama

createPluginRuntimeStore kullanan kod için, testlerde çalışma zamanını mock’layın:
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store";

const store = createPluginRuntimeStore<PluginRuntime>({
  pluginId: "test-plugin",
  errorMessage: "test runtime not set",
});

// In test setup
const 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 tests
store.clearRuntime();

Örnek başına stub’larla test etme

Prototip mutasyonu yerine örnek başına stub’ları tercih edin:
// Preferred: per-instance stub
const client = new MyChannelClient();
client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" });

// Avoid: prototype mutation
// MyChannelClient.prototype.sendMessage = vi.fn();

Sözleşme testleri (repo içi plugin’ler)

Birlikte gelen plugin’lerin kayıt sahipliğini doğrulayan sözleşme testleri vardır:
pnpm test -- src/plugins/contracts/
Bu testler şunları doğrular:
  • Hangi plugin’lerin hangi sağlayıcıları kaydettiği
  • Hangi plugin’lerin hangi konuşma sağlayıcılarını kaydettiği
  • Kayıt şeklinin doğruluğu
  • Çalışma zamanı sözleşmesine uyumluluk

Kapsamlı testleri çalıştırma

Belirli bir plugin için:
pnpm test -- <bundled-plugin-root>/my-channel/
Yalnızca sözleşme testleri için:
pnpm test -- src/plugins/contracts/shape.contract.test.ts
pnpm test -- src/plugins/contracts/auth-choice.contract.test.ts
pnpm test -- src/plugins/contracts/runtime-seams.contract.test.ts

Lint zorlaması (repo içi plugin’ler)

Repo içi plugin’ler için pnpm check tarafından üç kural zorlanır:
  1. Monolitik kök içe aktarmalar yokopenclaw/plugin-sdk kök barrel’ı reddedilir
  2. Doğrudan src/ içe aktarmaları yok — plugin’ler ../../src/ yolunu doğrudan içe aktaramaz
  3. Kendi kendini içe aktarma yok — plugin’ler kendi plugin-sdk/<name> alt yolunu içe aktaramaz
Harici plugin’ler bu lint kurallarına tabi değildir, ancak aynı kalıpları izlemek önerilir.

Test yapılandırması

OpenClaw, V8 kapsam eşikleriyle Vitest kullanır. Plugin testleri için:
# Run all tests
pnpm test

# Run specific plugin tests
pnpm test -- <bundled-plugin-root>/my-channel/src/channel.test.ts

# Run with a specific test name filter
pnpm test -- <bundled-plugin-root>/my-channel/ -t "resolves account"

# Run with coverage
pnpm test:coverage
Yerel çalıştırmalar bellek baskısına neden oluyorsa:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test

İlgili