OpenAICloudflare Developer Platform2026/07/27 0:00

Workers - Run integration tests against your Worker's production build

要点だけを先に読めるように短く再構成したセクションです。

元記事

Quick Digest

要約

要点だけを先に読めるように短く再構成したセクションです。

openaijamodel: gpt-5-mini-2025-08-07

createTestHarness()で本番ビルドの統合テストを実行

Key Points

  • createTestHarness() を追加
  • 本番ビルドでローカル起動可能
  • MSW 等で outbound fetch をモック

Summary

WranglerにcreateTestHarness()が追加され、WranglerまたはCloudflare ViteプラグインでビルドしたWorkerの“本番ビルド”を対象にローカルで統合テストを実行できます。ローカルのWorkerサーバーを起動し、リクエスト発行、ストレージリセット、ランタイムログ確認などのユーティリティを提供します。Cloudflareは従来のunstable_startWorker()/unstable_dev()よりもcreateTestHarness()を推奨します。開発目的でプログラム的にサーバーを立ち上げる場合はViteのcreateServer()とCloudflare Viteプラグインを使います。

Key Points

  • 使い方(概要)
    • import { createTestHarness } from "wrangler" でハーネスを作成
    • workers に各Workerの wrangler.jsonc のパスを指定して起動
    • server.listen(), server.fetch(url), server.reset(), server.close() をテストフローで呼び出す
  • よくある用途
    • 複数Worker間のルーティングテスト
    • 外部 fetch() を MSW 等でモックして振る舞いを検証
    • Playwright などでエンドツーエンド的にWorkerをテスト
  • 実践的な注意点
    • テストランナー(Vitest/Jestなど)からネットワークモック(msw/node)と組み合わせると効果的
    • 各テストで server.reset() とネットワークモックのリセットを忘れない
    • 本番ビルドを対象とするため、ビルド設定(wrangler.jsonc)を本番に近い構成にする

参照: Integration test harness guide(詳細は公式ドキュメントを確認)

Full Translation

翻訳

原文の流れを保ったまま読める翻訳セクションです。

openaijamodel: gpt-5-mini-2025-08-07

Workers - Worker の本番ビルドに対して統合テストを実行する

2026年7月27日

Wrangler は createTestHarness() を提供するようになりました。これは、Wrangler または Cloudflare Vite plugin でビルドした Worker に対して、任意の Node.js テストランナーから統合テストを実行するための API です。テストハーネスは、リクエストの送信、ストレージのリセット、ランタイムログの検査用のヘルパーを備えたローカル Worker サーバを起動します。これは次のようなテストに便利です:

  • 複数の Worker 間でリクエストをルーティングするテスト
  • MSW のような Node.js リクエストモッキングライブラリを使って outbound fetch() をモックするテスト
  • Worker に対して Playwright テストを実行する場合

例えば、次のテストは 2 つの Worker を起動し、上流 API をモックします。

tests/vitest.test.js

import { afterAll, afterEach, beforeAll, test } from "vitest" ;
import { http, HttpResponse } from "msw" ;
import { setupServer } from "msw/node" ;
import { createTestHarness } from "wrangler" ;
const network = setupServer ();
const server = createTestHarness ({
  workers: [
    /** Includes `"routes": ["example.com/*"]` */
    { configPath: "./workers/web/wrangler.jsonc" },
    /** Includes `"routes": ["api.example.com/v1/*"]` */
    { configPath: "./workers/api/wrangler.jsonc" },
  ],
});

beforeAll ( async () => {
  network. listen ({ onUnhandledRequest: "error" });
  await server. listen (); 
});

afterEach ( async () => {
  network. resetHandlers ();
  await server. reset ();
});

afterAll ( async () => {
  network. close ();
  await server. close ();
});

test ( "routes requests to each Worker" , async ({ expect }) => {
  // Mock the outbound fetch used to load user profiles.
  network. use ( http. get ( "http://identity.example.com/profile/123" , ({ params }) => {
    return HttpResponse. json ({ id: 123 , name: "Ada" });
  }), );

  const apiWorkerResponse = await server. fetch ( "http://api.example.com/v1/users/123" , );
  expect ( await apiWorkerResponse. json ()). toEqual ({ id: 123 , name: "Ada" , });

  const webWorkerResponse = await server. fetch ( "http://example.com/users/123" );
  expect ( await webWorkerResponse. text ()). toBe ( "Profile: Ada" );
});

tests/vitest.test.ts

import { afterAll, afterEach, beforeAll, test } from "vitest" ;
import { http, HttpResponse } from "msw" ;
import { setupServer } from "msw/node" ;
import { createTestHarness } from "wrangler" ;
const network = setupServer ();
const server = createTestHarness ({
  workers: [
    /** Includes `"routes": ["example.com/*"]` */
    { configPath: "./workers/web/wrangler.jsonc" },
    /** Includes `"routes": ["api.example.com/v1/*"]` */
    { configPath: "./workers/api/wrangler.jsonc" },
  ],
});

beforeAll ( async () => {
  network. listen ({ onUnhandledRequest: "error" });
  await server. listen (); 
});

afterEach ( async () => {
  network. resetHandlers ();
  await server. reset ();
});

afterAll ( async () => {
  network. close ();
  await server. close ();
});

test ( "routes requests to each Worker" , async ({ expect }) => {
  // Mock the outbound fetch used to load user profiles.
  network. use ( http. get ( "http://identity.example.com/profile/123" , ({ params }) => {
    return HttpResponse. json ({ id: 123 , name: "Ada" });
  }), );

  const apiWorkerResponse = await server. fetch ( "http://api.example.com/v1/users/123" , );
  expect ( await apiWorkerResponse. json ()). toEqual ({ id: 123 , name: "Ada" , });

  const webWorkerResponse = await server. fetch ( "http://example.com/users/123" );
  expect ( await webWorkerResponse. text ()). toBe ( "Profile: Ada" );
});

Cloudflare は統合テストにおいて、unstable_startWorker()unstable_dev() の代わりに createTestHarness() の使用を推奨します。プログラムから開発サーバを起動する場合は、Cloudflare Vite plugin と Vite の createServer() ↗ API を使用してください。createTestHarness() の詳細は Integration test harness guide を参照してください。