# テスト方針書

## 概要

本ドキュメントは、Prettier（コードフォーマッター）プロジェクトのテスト方針を定義します。Prettierは複数の言語（JavaScript、TypeScript、CSS、HTML、Markdownなど）に対応したコードフォーマッターであり、高品質なフォーマット出力を保証するために包括的なテスト戦略を採用しています。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 個々の関数・ユーティリティの動作検証（ASTパス、ドキュメントビルダー、パーサーなど） | 開発者 |
| フォーマットテスト | 各言語・シナリオに対するフォーマット出力の一貫性検証（スナップショットテスト） | 開発者 |
| 結合テスト | CLI、設定ファイル解決、プラグインシステムの統合動作検証 | 開発者 |
| 型定義テスト | TypeScript型定義（.d.ts）の正確性検証 | 開発者 |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | フォーマット機能、CLI機能、プラグインAPI等の動作確認 | プルリクエスト時、mainブランチへのpush時 |
| 回帰テスト | スナップショットによる出力の変更検知 | プルリクエスト時、mainブランチへのpush時 |
| クロスプラットフォームテスト | Linux、macOS、Windowsでの動作確認 | プルリクエスト時、mainブランチへのpush時 |
| ブラウザテスト | Chrome、Firefoxでのブラウザ互換性確認 | プロダクションテスト時 |
| セキュリティテスト | CodeQLによる静的コード解析 | プルリクエスト時、mainブランチへのpush時 |
| 性能テスト | ベンチマークによる性能計測（--debug-benchmarkフラグ） | 手動実行 |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| 開発環境（Dev） | 開発時テスト実行 | Node.js 20-25、Ubuntu/macOS/Windows |
| プロダクション環境（Prod） | ビルド済みバンドルのテスト | Node.js 14-25、Ubuntu/macOS/Windows |
| ブラウザ環境 | ブラウザ互換性テスト | Chrome、Firefox（Puppeteer使用） |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| Jest | テストフレームワーク | 30.2.0 |
| jest-light-runner | 高速テスト実行（child-processモード） | 0.7.11 |
| jest-snapshot-serializer-raw | スナップショットシリアライザー | 2.0.0 |
| jest-snapshot-serializer-ansi | ANSIカラーコードのシリアライズ | 2.2.1 |
| jest-watch-typeahead | テスト実行時のファイル名・テスト名補完 | 3.0.1 |
| c8 | コードカバレッジ計測 | 10.1.3 |
| Puppeteer | ブラウザテスト | 24.36.1 |
| ESLint | 静的コード解析 | 9.39.2 |
| TypeScript | 型チェック | 5.9.3 |
| CodeQL | セキュリティ静的解析 | GitHub Actions経由 |
| cspell | スペルチェック | 9.6.2 |
| actionlint | GitHub Actionsワークフロー検証 | 最新 |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 明示的な目標値なし（Codecovへレポート） |
| 分岐カバレッジ | 明示的な目標値なし（Codecovへレポート） |

カバレッジ対象:
- `src/**/*.js`
- `bin/**/*.js`

カバレッジ除外:
- `src/standalone.js`
- `src/document/debug.js`

## テストデータ

テストデータの準備方針:

1. **フォーマットテスト**: `tests/format/` ディレクトリ配下に言語・機能ごとにフィクスチャファイルを配置。期待される出力はJestスナップショットとして管理。

2. **統合テスト**: `tests/integration/` ディレクトリ配下に設定ファイル、プラグイン、CLI入力ファイル等のテストフィクスチャを配置。

3. **テストプラグイン**: `tests/config/prettier-plugins/` に検証用のダミープラグインを配置。

4. **外部テストスイート**: CommonMark、GFM、JSON、YAMLの標準テストスイートを使用。

## 不具合管理

不具合の管理方法:

1. **バグ報告**: GitHub Issuesを使用
2. **再現テストケース**: バグ修正時は必ず再現テストを追加
3. **スナップショット更新**: フォーマット出力変更時はスナップショットを更新し、レビュー時に差分を確認
4. **回帰防止**: 修正されたバグに対応するテストケースを永続的に保持

## CI/CD連携

### GitHub Actions ワークフロー

| ワークフロー | トリガー | 目的 |
| --- | --- | --- |
| Dev (`dev-test.yml`) | push/PR | 開発モードでのテスト実行（単体テスト含む） |
| Prod (`prod-test.yml`) | push/PR | プロダクションビルドのテスト（Node.js/ブラウザ） |
| Lint (`lint.yml`) | push/PR | 静的解析、型チェック、スペルチェック |
| CodeQL (`codeql.yml`) | push/PR | セキュリティ脆弱性スキャン |

### テスト実行フロー

1. **開発テスト（Dev）**:
   - Node.js 20, 22, 24, 25 で実行
   - Ubuntu, macOS, Windows で実行
   - `yarn test` コマンド
   - Node.js 24 (Ubuntu) でカバレッジ取得・Codecovアップロード

2. **プロダクションテスト（Prod）**:
   - ビルド成果物のダウンロード後に実行
   - Node.js 14-25 で実行（広範な互換性検証）
   - `yarn test:production` および `yarn test:production-standalone`
   - ブラウザテスト: ESM/UMDバンドルの動作確認

3. **リント**:
   - ESLint、Prettier、TypeScript型チェック
   - 依存関係チェック（Knip）
   - Changelogリント
   - ワークフローファイル検証（actionlint）

### スクリプトコマンド

```bash
# 基本テスト
yarn test                        # Jest実行

# 開発パッケージテスト
yarn test:dev-package           # INSTALL_PACKAGE=1 でテスト

# プロダクションテスト
yarn test:production            # NODE_ENV=production でテスト
yarn test:production-standalone # スタンドアロンモードでテスト

# ブラウザテスト
yarn test:production:browser         # ブラウザテスト
yarn test:production:browser:chrome  # Chrome指定
yarn test:production:browser:firefox # Firefox指定

# リント
yarn lint                 # 全リント実行
yarn lint:typecheck       # TypeScript型チェック
yarn lint:eslint          # ESLint
yarn lint:prettier        # Prettier自身によるフォーマットチェック
yarn lint:spellcheck      # スペルチェック
```

## 備考

1. **テストランナー設定**: `jest-light-runner` を使用し、child-processモードで高速実行を実現。

2. **環境変数による制御**:
   - `NODE_ENV=production`: プロダクションモード（dist/からテスト実行）
   - `TEST_STANDALONE`: スタンドアロンバンドルテスト
   - `TEST_RUNTIME`: 実行環境指定（nodejs/browser）
   - `TEST_RUNTIME_BROWSER`: ブラウザ指定（chrome/firefox）
   - `TEST_BUNDLE_FORMAT`: バンドル形式（esm/umd）
   - `FULL_TEST`: フルテスト実行フラグ

3. **Node.jsバージョン対応**:
   - 開発時: Node.js 20以上が必要
   - プロダクション: Node.js 14以上で動作
   - レガシーNode.js（14, 16）では yarn@3 にダウングレードしてテスト

4. **並行実行制御**: GitHub Actionsで `concurrency` 設定により、同一ワークフロー・ブランチの重複実行をキャンセル。

5. **テストタイムアウト**: CI/CDでのテストジョブは15分でタイムアウト。
