testing について
testingは、Sandbox SDK固有のテスト規約をまとめたスキルです。コントリビューター向けに、単体テストとE2Eテストの選び方や、実行環境、コマンド、モック、テスト作成の指針を説明します。
主な機能
- 01単体テストとE2Eテストの使い分け
- 02テスト配置場所と実行環境の説明
- 03テスト実行・絞り込みコマンド
- 04モックとセッション分離のパターン
- 05テスト作成の規約
活用シーン
- 01変更内容に適したテストの選択
- 02Sandbox SDKテストの実行や絞り込み
- 03独立性のあるE2Eテストの作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cloudflare/ sandbox-sdk --skill testingインストール後、Claude Code で/testingを入力して読み込まれたか確認します。
詳細
Sandbox SDK でのテスト
このスキルでは、プロジェクト固有のテスト規約を説明します。TDD の方法論については、superpowers:test-driven-development スキルを使用してください。
2 つのテストスイート
ユニットテスト
使用する場面:独立したロジック、クライアントの動作、サービスメソッド、ユーティリティをテストする場合。
場所:
- SDK:
packages/sandbox/tests/ - コンテナ:
packages/sandbox-container/tests/
ランタイム:
- SDK のテストは
@cloudflare/vitest-pool-workersを使用して Workers ランタイムで実行されます - コンテナのテストは Bun ランタイムで実行されます
コマンド:
npm test # All unit tests
npm test -w @cloudflare/sandbox # SDK tests only
npm test -w @repo/sandbox-container # Container tests only
モックのパターン:
- SDK のテストではモックコンテナを使用します(Docker は不要です)
- コンテナのテストでは外部依存関係(ファイルシステム、プロセス)をモックします
- ロガーのモックには
@repo/sharedのcreateNoOpLogger()を使用します
既知の問題:vitest-pool-workers の workerd シャットダウンにより、SDK のユニットテストが終了時にハングすることがあります。テストの成功・失敗は正しく判定されます。ハングは見かけ上のものです。
E2E テスト
使用する場面:リクエストの一連の流れ、コンテナとの統合、実際の Docker の動作をテストする場合。
場所:tests/e2e/
ランタイム:実際の Cloudflare Workers と Docker コンテナ
コマンド:
npm run test:e2e # All E2E tests (vitest + browser)
npm run test:e2e:vitest -- -- tests/e2e/process-lifecycle-workflow.test.ts # Single vitest file
npm run test:e2e:vitest -- -- tests/e2e/git-clone-workflow.test.ts -t 'test name' # Single vitest test
npm run test:e2e:browser # Browser tests only (Playwright)
注:テストを絞り込む場合は test:e2e:vitest を使用してください。test:e2e ラッパーは引数の引き渡しに対応していません。
主なパターン:
- パフォーマンス向上のため、すべてのテストで 1 つのコンテナを共有します
- テストを分離するため、テストごとに一意のセッションを使用します
- テストはスレッドプールを使って並列実行されます
- 設定:
vitest.e2e.config.ts(ルート階層)
E2E テストの作成:
import { createTestSession } from './helpers';
describe('Feature X', () => {
let session: TestSession;
beforeEach(async () => {
session = await createTestSession(); // Gets unique session
});
it('should do something', async () => {
const result = await session.sandbox.exec('echo hello');
expect(result.stdout).toBe('hello\n');
});
});
どちらを使用するか
| シナリオ | テスト種別 |
|---|---|
| クライアントメソッドのロジック | ユニット |
| サービスのビジネスロジック | ユニット |
| リクエスト/レスポンスの処理 | ユニット |
| コマンド実行の一連の流れ | E2E |
| 実際のファイルシステムを使ったファイル操作 | E2E |
| プロセスのライフサイクル(開始、停止、シグナル) | E2E |
| ポート公開とプレビュー URL | E2E |
| Git 操作 | E2E |
テスト固有の規約
ファイル名:ユニットテスト、E2E テストのどちらも *.test.ts
テスト構成:
describe('ComponentName', () => {
describe('methodName', () => {
it('should do X when Y', async () => {
// Arrange
// Act
// Assert
});
});
});
アサーション:vitest の expect() を使い、明確で具体的なアサーションを記述します
開発中のテスト実行
意味のあるコード変更を行った後は、次のコマンドを実行してください。
npm run check- まず型エラーを検出しますnpm test- ユニットテストが通ることを確認しますnpm run test:e2e- コア機能に変更を加えた場合に実行します
ビルドへの信頼:モノレポのビルドシステムが依存関係を自動で処理します。E2E テストは常に最新のビルド済みコードに対して実行されるため、手動で再ビルドする必要はありません。