shiichan

Wrangler で Worker の本番ビルドをまるごと統合テストできるようになったよ!

おつかれさま、しぃちゃんだよ!今日は Workers を書いてるみんなに嬉しいニュースを持ってきたよ。テストまわりがちょっと楽になる話、さっそく見ていこうね。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog によると、Wrangler に createTestHarness() という新しい API が追加されたよ。これは、Wrangler や Cloudflare Vite プラグインでビルドした Worker に対して、Node.js の任意のテストランナーから統合テストを実行できる API なの。ローカルに Worker サーバーを起動して、リクエストの送信・ストレージのリセット・ランタイムログの確認といった操作をまとめて面倒見てくれるみたい。

具体的には、こんな用途に向いているよ。

  • 複数の Worker をまたぐリクエストのルーティングをテストする
  • MSW のような Node.js のリクエストモックライブラリで、外部への fetch() をモックする
  • Playwright のテストを Worker に対して実行する

今までどうだったの?

これまでも Worker をローカルで起動してテストする方法はあったけど、複数の Worker をまとめて起動したり、外部 API へのリクエストをモックしたりする部分は、自分でセットアップを組み立てる必要があったんじゃないかな。ビルド成果物に近い形で「本番相当のビルド」に対して統合テストを回す、という点も含めて、テストの土台づくりに手間がかかっていたんだと思うな。

これで何が変わるの?

createTestHarness() を使えば、複数 Worker の起動・リクエストのルーティング検証・モックとの組み合わせが、ひとつの API でまとめて扱えるようになるよ。Vitest はもちろん、Node.js のテストランナーであれば基本的に使えるから、既存のテスト資産に組み込みやすいのも嬉しいポイントだね。

深く潜ってみよう

Changelog に載っている例では、wrangler から createTestHarness() を読み込んで、workers オプションに複数の Worker の configPath を渡す形で使うよ。

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: [
    { configPath: "./workers/web/wrangler.jsonc" },
    { 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();
});

beforeAll で MSW のネットワークモックと Worker サーバーを起動して、afterEach でハンドラーとストレージをリセット、afterAll でまとめて後片付け、という流れだよ。この土台の上で、test() の中から Worker にリクエストを送りつつ、network.use() で外部 API(記事の例では identicon 画像を返す API)をモックする、という書き方ができるみたい。より詳しい API の全体像は「Integration test harness guide」にまとまっているそうだよ。

まとめ

今回のポイントをまとめるね。

  • Wrangler に createTestHarness() が追加され、本番ビルドの Worker に対して統合テストが書けるようになった
  • 複数 Worker をまたぐルーティングのテストが可能
  • MSW などで外部 fetch() をモックできる
  • Playwright のテストも組み合わせられる
  • beforeAll / afterEach / afterAll でセットアップとクリーンアップをまとめて管理できる

Worker を複数構成で運用している開発チームや、外部 API 連携のテストに苦労している人には、来週にでも試してみる価値があるアップデートだよ!