コンテンツにスキップ

統合テスト

統合テストは、HTTPリクエストをWorkerに送信し、HTTPレスポンスを検証することで、あなたのWorkerの複数のユニットを一緒にテストします。例として、以下のWorkerを考えてみましょう:

export function add(a, b) {
return a + b;
}
export default {
async fetch(request) {
const url = new URL(request.url);
const a = parseInt(url.searchParams.get("a"));
const b = parseInt(url.searchParams.get("b"));
return new Response(add(a, b));
}
}

このWorkerの統合テストは、以下のような例になるかもしれません:

// ポート8787で`index.mjs`を実行するWorker HTTPサーバーを開始し、その後...
const response = await fetch("http://localhost:8787/?a=1&b=2");
assert((await response.text()) === "3");

上記の例では、ユニットテストadd関数をインポートする代わりに、エンドポイントに直接呼び出しを行い、Workerが適切なレスポンスでエンドポイントに応答することをテストしています。

Vitest統合

あなたのWorkersのための統合テストを書く推奨の方法は、Workers Vitest統合を使用することです。Vitestは、単一のWorkerまたは複数のWorkersに対して統合を実行するように構成できます。

SELFを介したテスト

単一のWorkerをテストする場合、cloudflare:test APIによって提供されるSELFフェッチャーを使用できます。

import { SELF } from "cloudflare:test";
it("fetchイベントをディスパッチします", async () => {
const response = await SELF.fetch("https://example.com");
expect(await response.text()).toMatchInlineSnapshot(...);
});

統合テストのためにSELFを使用する場合、あなたのWorkerコードはテストランナーと同じコンテキストで実行されます。これは、グローバルモックを使用してWorkerを制御できることを意味しますが、同時にWorkerはViteによって提供される微妙に異なるモジュール解決の動作を使用します。

通常、これは問題ではありませんが、可能な限り本番環境に近い新しい環境でWorkerを実行したい場合、補助Workerを使用するのが良いアイデアかもしれません。補助Workerにはいくつかの開発者体験(DX)制限があります。

補助Workerを介したテスト

vitest.config.tsを介して統合テストのためにWorkersを構成することも可能です。GitHubにある例のvitest.config.ts構成ファイル

Workerは次のように参照できます:

import { env } from "cloudflare:test";
import { expect, it } from "vitest";
it("fetchイベントをディスパッチします", async () => {
const response = await env.WORKER.fetch("http://example.com");
expect(await response.text()).toBe("👋");
});

この例では、テストランナーと同じWorker内でテスト対象のWorkerを実行するのではなく、テスト対象のWorkerを補助Workerとして定義しています。これは、テストランナーとは異なるグローバルスコープでWorkerが実行されることを意味します。テスト対象のWorkerは本番環境に近い環境で実行されますが、Viteの変換やホットモジュールリロードはWorkerに適用されません—事前にTypeScriptをJavaScriptにコンパイルする必要があります。

補助Workerはwrangler.tomlファイルから構成することはできません。vitest.config.tsでMiniflareのWorkerOptionsを使用する必要があります。

Wranglerのunstable_dev() API

Vitestを使用したくなく、単一のWorkerのための統合テストを書くことを希望する場合、Wranglerのunstable_dev() APIを使用することを検討してください。unstable_dev()は、HTTPリクエストを送信できるwrangler devに似たHTTPサーバーを起動します。unstable_dev()は、Wrangler構成ファイルからオプションを自動的に読み込みます。unstable_dev()は、破壊的変更の対象となる実験的なAPIであることに注意してください。

import assert from "node:assert";
import { unstable_dev } from "wrangler";
const worker = await unstable_dev("./index.mjs");
try {
const response = await worker.fetch("/?a=1&b=2");
assert.strictEqual(await response.text(), "3");
} finally {
await worker.stop();
}

MiniflareのAPI

複数のWorkersのための統合テストを書きたい、テストの外でバインディングに直接アクセスする必要がある、または他の高度なユースケースがある場合は、MiniflareのAPIを直接使用することを検討してください。Miniflareは、このページの他のテストツールの基盤であり、workerdランタイムのJavaScript APIと他のDeveloper Platform製品のローカルシミュレーターを公開しています。unstable_dev()とは異なり、MiniflareはWrangler構成ファイルからオプションを自動的に読み込みません。

import assert from "node:assert";
import { Miniflare } from "miniflare";
const mf = new Miniflare({
modules: true,
scriptPath: "./index.mjs",
});
try {
const response = await mf.dispatchFetch("http://example.com/?a=1&b=2");
assert.strictEqual(await response.text(), "3");
} finally {
await mf.dispose();
}

関連リソース

  • レシピ - WorkersのためのWorkers Vitest統合を使用した例の統合テスト。