Plugins

Testowanie Plugin

Materiały referencyjne dotyczące narzędzi testowych, wzorców i egzekwowania lint dla Plugin OpenClaw.

Narzędzia testowe

Import mocka API Plugin: openclaw/plugin-sdk/plugin-test-api

Import kontraktu środowiska uruchomieniowego agenta: openclaw/plugin-sdk/agent-runtime-test-contracts

Import kontraktu kanału: openclaw/plugin-sdk/channel-contract-testing

Import helpera testowego kanału: openclaw/plugin-sdk/channel-test-helpers

Import testów celu kanału: openclaw/plugin-sdk/channel-target-testing

Import kontraktu Plugin: openclaw/plugin-sdk/plugin-test-contracts

Import testów środowiska uruchomieniowego Plugin: openclaw/plugin-sdk/plugin-test-runtime

Import kontraktu dostawcy: openclaw/plugin-sdk/provider-test-contracts

Import mocka HTTP dostawcy: openclaw/plugin-sdk/provider-http-test-mocks

Import testów środowiska/sieci: openclaw/plugin-sdk/test-env

Import ogólnych fikstur: openclaw/plugin-sdk/test-fixtures

Import mocka wbudowanego modułu Node: openclaw/plugin-sdk/test-node-mocks

W przypadku nowych testów Plugin preferuj poniższe wyspecjalizowane podścieżki. Szeroki barrel openclaw/plugin-sdk/testing służy wyłącznie do zgodności ze starszym kodem. Zabezpieczenia repozytorium odrzucają nowe rzeczywiste importy z plugin-sdk/testing i plugin-sdk/test-utils; te nazwy pozostają tylko jako przestarzałe powierzchnie zgodności dla zewnętrznych Plugin i testów zapisów zgodności.


  shouldAckReaction,
  removeAckReactionAfterReply,
} from "openclaw/plugin-sdk/channel-feedback";











  bundledPluginRoot,
  createCliRuntimeCapture,
  typedCases,
} from "openclaw/plugin-sdk/test-fixtures";

Dostępne eksporty

Eksport Cel
createTestPluginApi Zbuduj minimalną atrapę API Plugin do bezpośrednich testów jednostkowych rejestracji. Importuj z plugin-sdk/plugin-test-api
AUTH_PROFILE_RUNTIME_CONTRACT Wspólna kontraktowa fixture profilu uwierzytelniania dla natywnych adapterów środowiska uruchomieniowego agentów. Importuj z plugin-sdk/agent-runtime-test-contracts
DELIVERY_NO_REPLY_RUNTIME_CONTRACT Wspólna kontraktowa fixture wyciszania dostarczania dla natywnych adapterów środowiska uruchomieniowego agentów. Importuj z plugin-sdk/agent-runtime-test-contracts
OUTCOME_FALLBACK_RUNTIME_CONTRACT Wspólna kontraktowa fixture klasyfikacji awaryjnej dla natywnych adapterów środowiska uruchomieniowego agentów. Importuj z plugin-sdk/agent-runtime-test-contracts
createParameterFreeTool Zbuduj fixture schematów narzędzi dynamicznych dla testów kontraktu natywnego środowiska uruchomieniowego. Importuj z plugin-sdk/agent-runtime-test-contracts
expectChannelInboundContextContract Sprawdź kształt kontekstu przychodzącego kanału. Importuj z plugin-sdk/channel-contract-testing
installChannelOutboundPayloadContractSuite Zainstaluj przypadki kontraktu ładunku wychodzącego kanału. Importuj z plugin-sdk/channel-contract-testing
createStartAccountContext Zbuduj konteksty cyklu życia konta kanału. Importuj z plugin-sdk/channel-test-helpers
installChannelActionsContractSuite Zainstaluj ogólne przypadki kontraktu akcji wiadomości kanału. Importuj z plugin-sdk/channel-test-helpers
installChannelSetupContractSuite Zainstaluj ogólne przypadki kontraktu konfiguracji kanału. Importuj z plugin-sdk/channel-test-helpers
installChannelStatusContractSuite Zainstaluj ogólne przypadki kontraktu statusu kanału. Importuj z plugin-sdk/channel-test-helpers
expectDirectoryIds Sprawdź identyfikatory katalogu kanałów z funkcji listy katalogu. Importuj z plugin-sdk/channel-test-helpers
assertBundledChannelEntries Sprawdź, czy dołączone punkty wejścia kanałów udostępniają oczekiwany kontrakt publiczny. Importuj z plugin-sdk/channel-test-helpers
formatEnvelopeTimestamp Formatuj deterministyczne znaczniki czasu koperty. Importuj z plugin-sdk/channel-test-helpers
expectPairingReplyText Sprawdź tekst odpowiedzi parowania kanału i wyodrębnij jego kod. Importuj z plugin-sdk/channel-test-helpers
describePluginRegistrationContract Zainstaluj kontrole kontraktu rejestracji Plugin. Importuj z plugin-sdk/plugin-test-contracts
registerSingleProviderPlugin Zarejestruj jeden Plugin dostawcy w testach smoke loadera. Importuj z plugin-sdk/plugin-test-runtime
registerProviderPlugin Przechwyć wszystkie rodzaje dostawców z jednego Plugin. Importuj z plugin-sdk/plugin-test-runtime
registerProviderPlugins Przechwyć rejestracje dostawców w wielu Plugin. Importuj z plugin-sdk/plugin-test-runtime
requireRegisteredProvider Sprawdź, czy kolekcja dostawców zawiera identyfikator. Importuj z plugin-sdk/plugin-test-runtime
createRuntimeEnv Zbuduj atrapę środowiska uruchomieniowego CLI/Plugin. Importuj z plugin-sdk/plugin-test-runtime
createPluginSetupWizardStatus Zbuduj pomocniki statusu konfiguracji dla Plugin kanałów. Importuj z plugin-sdk/plugin-test-runtime
describeOpenAIProviderRuntimeContract Zainstaluj kontrole kontraktu środowiska uruchomieniowego rodziny dostawców. Importuj z plugin-sdk/provider-test-contracts
expectPassthroughReplayPolicy Sprawdź, czy zasady odtwarzania dostawcy przepuszczają narzędzia i metadane należące do dostawcy. Importuj z plugin-sdk/provider-test-contracts
runRealtimeSttLiveTest Uruchom test na żywo dostawcy STT czasu rzeczywistego ze wspólnymi fixture audio. Importuj z plugin-sdk/provider-test-contracts
normalizeTranscriptForMatch Normalizuj wynik transkrypcji na żywo przed asercjami rozmytymi. Importuj z plugin-sdk/provider-test-contracts
expectExplicitVideoGenerationCapabilities Sprawdź, czy dostawcy wideo deklarują jawne możliwości trybu generowania. Importuj z plugin-sdk/provider-test-contracts
expectExplicitMusicGenerationCapabilities Sprawdź, czy dostawcy muzyki deklarują jawne możliwości generowania/edycji. Importuj z plugin-sdk/provider-test-contracts
mockSuccessfulDashscopeVideoTask Zainstaluj udaną odpowiedź zadania wideo zgodną z DashScope. Importuj z plugin-sdk/provider-test-contracts
getProviderHttpMocks Uzyskaj dostęp do opcjonalnych atrap HTTP/auth dostawcy w Vitest. Importuj z plugin-sdk/provider-http-test-mocks
installProviderHttpMockCleanup Resetuj atrapy HTTP/auth dostawcy po każdym teście. Importuj z plugin-sdk/provider-http-test-mocks
installCommonResolveTargetErrorCases Wspólne przypadki testowe dla obsługi błędów rozpoznawania celu. Importuj z plugin-sdk/channel-target-testing
shouldAckReaction Sprawdź, czy kanał powinien dodać reakcję potwierdzenia. Importuj z plugin-sdk/channel-feedback
removeAckReactionAfterReply Usuń reakcję potwierdzenia po dostarczeniu odpowiedzi. Importuj z plugin-sdk/channel-feedback
createTestRegistry Zbuduj fixture rejestru Plugin kanału. Importuj z plugin-sdk/plugin-test-runtime lub plugin-sdk/channel-test-helpers
createEmptyPluginRegistry Zbuduj fixture pustego rejestru Plugin. Importuj z plugin-sdk/plugin-test-runtime lub plugin-sdk/channel-test-helpers
setActivePluginRegistry Zainstaluj fixture rejestru dla testów środowiska uruchomieniowego Plugin. Importuj z plugin-sdk/plugin-test-runtime lub plugin-sdk/channel-test-helpers
createRequestCaptureJsonFetch Przechwytuj żądania pobierania JSON w testach pomocników multimediów. Importuj z plugin-sdk/test-env
withServer Uruchamiaj testy względem jednorazowego lokalnego serwera HTTP. Importuj z plugin-sdk/test-env
createMockIncomingRequest Zbuduj minimalny obiekt przychodzącego żądania HTTP. Importuj z plugin-sdk/test-env
withFetchPreconnect Uruchamiaj testy fetch z zainstalowanymi hookami wstępnego połączenia. Importuj z plugin-sdk/test-env
withEnv / withEnvAsync Tymczasowo modyfikuj zmienne środowiskowe. Importuj z plugin-sdk/test-env
createTempHomeEnv / withTempHome / withTempDir Twórz izolowane fixture testowe systemu plików. Importuj z plugin-sdk/test-env
createMockServerResponse Utwórz minimalną atrapę odpowiedzi serwera HTTP. Importuj z plugin-sdk/test-env
createCliRuntimeCapture Przechwytuj wyjście środowiska uruchomieniowego CLI w testach. Importuj z plugin-sdk/test-fixtures
importFreshModule Importuj moduł ESM ze świeżym tokenem zapytania, aby ominąć pamięć podręczną modułów. Importuj z plugin-sdk/test-fixtures
bundledPluginRoot / bundledPluginFile Rozpoznawaj ścieżki fixture źródła lub dist dołączonego Plugin. Importuj z plugin-sdk/test-fixtures
mockNodeBuiltinModule Zainstaluj wąskie atrapy Vitest wbudowanych modułów Node. Importuj z plugin-sdk/test-node-mocks
createSandboxTestContext Zbuduj konteksty testowe piaskownicy. Importuj z plugin-sdk/test-fixtures
writeSkill Zapisz fixture Skills. Importuj z plugin-sdk/test-fixtures
makeAgentAssistantMessage Zbuduj fixture wiadomości transkryptu agenta. Importuj z plugin-sdk/test-fixtures
peekSystemEvents / resetSystemEventsForTest Sprawdzaj i resetuj fixture zdarzeń systemowych. Importuj z plugin-sdk/test-fixtures
sanitizeTerminalText Oczyść wyjście terminala na potrzeby asercji. Importuj z plugin-sdk/test-fixtures
countLines / hasBalancedFences Sprawdź kształt wyniku dzielenia na fragmenty. Importuj z plugin-sdk/test-fixtures
runProviderCatalog Wykonaj hook katalogu dostawcy z zależnościami testowymi
resolveProviderWizardOptions Rozpoznaj wybory kreatora konfiguracji dostawcy w testach kontraktu
resolveProviderModelPickerEntries Rozpoznaj wpisy wyboru modelu dostawcy w testach kontraktu
buildProviderPluginMethodChoice Zbuduj identyfikatory wyboru metody kreatora dostawcy na potrzeby asercji
setProviderWizardProvidersResolverForTest Wstrzyknij dostawców kreatora dostawcy dla izolowanych testów
createProviderUsageFetch Tworzy fikstury pobierania użycia dostawcy
useFrozenTime / useRealTime Zamraża i przywraca liczniki czasu dla testów zależnych od czasu. Importuj z plugin-sdk/test-env
createTestWizardPrompter Tworzy zamockowany prompter kreatora konfiguracji
createRuntimeTaskFlow Tworzy izolowany stan przepływu zadań środowiska uruchomieniowego
typedCases Zachowuje typy literałów dla testów sterowanych tabelą. Importuj z plugin-sdk/test-fixtures

Pakiety testów kontraktów bundled-plugin używają również podścieżek testowych SDK dla pomocników używanych tylko w testach: rejestru, manifestu, publicznych artefaktów i fixture środowiska uruchomieniowego. Pakiety testów wyłącznie dla core, które zależą od inwentarza bundled OpenClaw, pozostają w src/plugins/contracts. Nowe testy extension umieszczaj na udokumentowanej, ukierunkowanej podścieżce SDK, takiej jak 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 lub plugin-sdk/test-fixtures, zamiast importować bezpośrednio szeroki barrel kompatybilności plugin-sdk/testing, pliki repozytorium src/** albo mostki repozytorium test/helpers/*.

Typy

Ukierunkowane podścieżki testowe ponownie eksportują też typy przydatne w plikach testowych:


  ChannelAccountSnapshot,
  ChannelGatewayContext,
} from "openclaw/plugin-sdk/channel-contract";


Testowanie rozwiązywania celów

Użyj installCommonResolveTargetErrorCases, aby dodać standardowe przypadki błędów dla rozwiązywania celu kanału:



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

Wzorce testowania

Testowanie kontraktów rejestracji

Testy jednostkowe, które przekazują ręcznie napisany mock api do register(api), nie sprawdzają bramek akceptacji loadera OpenClaw. Dodaj co najmniej jeden test smoke oparty na loaderze dla każdej powierzchni rejestracji, od której zależy twój plugin, szczególnie dla hooków i wyłącznych capability, takich jak pamięć.

Rzeczywisty loader kończy rejestrację Plugin niepowodzeniem, gdy brakuje wymaganych metadanych albo plugin wywołuje API capability, którego nie jest właścicielem. Na przykład api.registerHook(...) wymaga nazwy hooka, a api.registerMemoryCapability(...) wymaga, aby manifest Plugin lub eksportowany punkt wejścia deklarował kind: "memory".

Testowanie dostępu do konfiguracji środowiska uruchomieniowego

Przy testowaniu bundled pluginów kanałów preferuj współdzielony mock środowiska uruchomieniowego Plugin z openclaw/plugin-sdk/channel-test-helpers. Jego przestarzałe mocki runtime.config.loadConfig() i runtime.config.writeConfigFile(...) domyślnie rzucają wyjątek, aby testy wykrywały nowe użycia API kompatybilności. Nadpisuj te mocki tylko wtedy, gdy test jawnie obejmuje starsze zachowanie kompatybilności.

Testowanie jednostkowe Plugin kanału


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

Testowanie jednostkowe Plugin providera


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

Mockowanie środowiska uruchomieniowego Plugin

Dla kodu, który używa createPluginRuntimeStore, mockuj środowisko uruchomieniowe w testach:



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

Testowanie ze stubami per instancja

Preferuj stuby per instancja zamiast mutacji prototypu:

// Preferred: per-instance stub
const client = new MyChannelClient();
client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" });

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

Testy kontraktowe (pluginy w repozytorium)

Bundled pluginy mają testy kontraktowe, które weryfikują własność rejestracji:

pnpm test -- src/plugins/contracts/

Te testy sprawdzają:

  • Które pluginy rejestrują których providerów
  • Które pluginy rejestrują których providerów mowy
  • Poprawność kształtu rejestracji
  • Zgodność z kontraktem środowiska uruchomieniowego

Uruchamianie testów o ograniczonym zakresie

Dla konkretnego Plugin:

pnpm test -- <bundled-plugin-root>/my-channel/

Tylko dla testów kontraktowych:

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

Egzekwowanie lintingu (pluginy w repozytorium)

pnpm check egzekwuje trzy reguły dla pluginów w repozytorium:

  1. Bez monolitycznych importów z roota -- barrel roota openclaw/plugin-sdk jest odrzucany
  2. Bez bezpośrednich importów z src/ -- pluginy nie mogą importować bezpośrednio ../../src/
  3. Bez samoimportów -- pluginy nie mogą importować własnej podścieżki plugin-sdk/<name>

Zewnętrzne pluginy nie podlegają tym regułom lintingu, ale zaleca się stosowanie tych samych wzorców.

Konfiguracja testów

OpenClaw używa Vitest z progami pokrycia V8. Dla testów pluginów:

# 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

Jeśli lokalne uruchomienia powodują presję na pamięć:

OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test

Powiązane