このドキュメントは、プロジェクトのテスト方法を説明します。
テストを実行するには、まず必要なパッケージをインストールしてください:
pnpm installこのプロジェクトでは主に以下の3種類のテストを実装しています:
- ユニットテスト: 個別の関数やコンポーネントの機能をテスト
- 統合テスト: 複数のモジュールの連携をテスト
- E2Eテスト: ブラウザ上での実際の動作をテスト
# すべてのテストを実行
pnpm test
# テストをウォッチモードで実行(変更を検知して再実行)
pnpm test:watch
# カバレッジレポートを生成
pnpm test:coverageE2Eテストを実行するには、Playwrightのインストールが必要です:
# Playwrightをインストール
pnpm add -D @playwright/test
npx playwright install
# E2Eテストを実行
pnpm test:e2e
# UIモードでE2Eテストを実行(ブラウザが表示される)
pnpm test:e2e:ui/
├── src/
│ ├── test/
│ │ ├── mocks/ # テスト用のモックデータ
│ │ ├── setup.ts # テスト環境のセットアップ
│ │ ├── integration/ # 統合テスト
│ │ └── e2e/ # E2Eテスト
│ ├── lib/
│ │ └── notion.test.ts # NotionAPIクライアントのテスト
│ └── components/
│ └── NotionBlock.test.tsx # コンポーネントのテスト
├── vitest.config.ts # Vitestの設定
└── playwright.config.ts # Playwrightの設定(必要に応じて作成)
src/lib/notion.tsのテストでは、以下の点に注目しています:
- APIの正しい呼び出し: Notion APIが正しいパラメータで呼び出されるか
- データの整形: API応答から正しくデータが整形されるか
- エラーハンドリング: API障害時に適切に処理されるか
- キャッシュ機能: キャッシュが期待通りに動作するか
src/components/NotionBlock.tsxのテストでは、以下の点に注目しています:
- 正しいレンダリング: 各タイプのブロックが正しくレンダリングされるか
- リッチテキスト処理: テキストの装飾が正しく適用されるか
- ネストされたコンテンツ: 子要素を持つブロックが正しく表示されるか
- エッジケース: サポートされていないブロックタイプや空のコンテンツが適切に処理されるか
統合テストでは、Notionからデータを取得してコンポーネントでレンダリングするまでの一連のフローをテストします。
E2Eテストでは、実際のブラウザ上での動作を検証します:
- ページナビゲーション: 各ページが正しく表示されるか
- レスポンシブデザイン: モバイルとデスクトップで正しく表示されるか
- ユーザーインタラクション: リンクやボタンが正しく機能するか
テストでは、src/test/mocks/notionData.tsに定義されたモックデータを使用しています。Notion APIのレスポンスをシミュレートするためのデータを提供します。
GitHubでのCIワークフロー例:
# .github/workflows/test.yml
name: Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 20
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Run E2E tests
run: npx playwright install --with-deps && npm run test:e2eこのプロジェクトでは、以下のテストカバレッジ目標を設定しています:
- ユニットテスト: コードベースの80%以上をカバー
- 統合テスト: 主要なユーザーフローをすべてカバー
- E2Eテスト: 重要なページとインタラクションをカバー
- 独立したテスト: 各テストは他のテストに依存せず独立して実行できるようにする
- 高速なテスト: テストは可能な限り高速に実行されるべき(特にユニットテスト)
- モックの適切な使用: 外部依存(APIなど)は適切にモック化する
- 実際のユースケース: 実際のユースケースに基づいたテストを書く
- エッジケースのカバー: 境界値や異常系のテストを忘れずに実装する
- 依存関係の確認: すべての依存関係が正しくインストールされているか確認
- 環境変数: 必要な環境変数が設定されているか確認(テスト用の
.env.testを用意する) - タイミング問題: 非同期テストにおいて、適切に
awaitが使われているか確認 - モックの再確認: APIレスポンスなどのモックが最新の実装と一致しているか確認
- 並列実行: Vitestの並列実行設定を確認
- テストの粒度: 大きすぎるテストを分割する
- 不要なセットアップの削減: 各テストで必要最小限のセットアップのみを行う
新機能を追加する際は、TDD(テスト駆動開発)アプローチを推奨します:
- 失敗するテストを書く: 新機能の要件を満たすテストを先に書く
- コードを実装: テストが通るようにコードを実装する
- リファクタリング: コードの品質を改善しながらテストが通ることを確認
新しいNotionブロックタイプをサポートする際は、以下のテストを追加してください:
- モックデータの追加:
notionData.tsに新しいブロックタイプのモックを追加 - レンダリングテスト: 新しいブロックが正しくレンダリングされることを確認するテスト
- エッジケース: 特殊なケース(空のコンテンツ、特殊な書式など)に対するテスト
Notion APIが更新された場合は、以下の手順でテストを更新してください:
- モックの更新: 新しいAPIレスポンス形式に合わせてモックを更新
- テストケースの見直し: 新機能や変更点に対応するテストケースの追加
- 回帰テスト: 既存機能が引き続き動作することを確認
頻繁に更新される大規模なNotionドキュメントを扱う場合、以下のパフォーマンステストを実施することを推奨します:
- レンダリング速度: 大量のブロックがある場合のレンダリング時間測定
- APIコール最適化: キャッシュ機構が効果的に動作しているか確認
- メモリ使用量: 大きなページ処理時のメモリ使用量を監視
アクセシビリティを確保するため、以下のテストを追加することを検討してください:
- axeプラグイン: Playwrightとaxeを組み合わせたアクセシビリティテスト
- キーボードナビゲーション: キーボードのみでの操作が可能か確認するテスト
- スクリーンリーダー互換性: スクリーンリーダーで正しく読み上げられるか確認
- 型チェック: テストコードも厳格な型チェックを適用する
- 型定義テスト: 重要な型定義が正しく機能することをチェックするテスト
- Notionの型定義: Notion APIのレスポンス型定義が常に最新の状態に保たれているか確認
Vitestのスナップショットテスト機能を使って、コンポーネントのレンダリング結果が期待通りであることを確認できます:
it('コンポーネントが正しくレンダリングされること(スナップショット)', () => {
const { container } = render(<NotionBlock block={paragraphBlock} />);
expect(container).toMatchSnapshot();
});スナップショットテストは、以下の場合に特に有効です:
- レンダリング結果の変更を検出
- リグレッションの防止
- 複雑なコンポーネントの視覚的な確認
テストコードは定期的にメンテナンスする必要があります:
- モックの更新: 実装の変更に合わせてモックを更新
- 非推奨APIの更新: 非推奨になったテストAPIを最新のものに置き換え
- テストカバレッジの改善: カバレッジが低い領域に新しいテストを追加
これらのガイドラインに従うことで、プロジェクトの品質と安定性を維持することができます。