# テスト方針書

## 概要

本ドキュメントは、Babelプロジェクト（JavaScriptコンパイラ）のテスト方針を定義する。Babelはモノレポ構成で150以上のパッケージを管理しており、包括的なテスト戦略により品質を担保している。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 各パッケージ（プラグイン、ヘルパー、パーサー等）の個別機能検証 | 開発者 |
| 結合テスト | パッケージ間の連携検証、変換パイプラインの正確性確認 | 開発者 |
| システムテスト | バンドラー連携（Webpack、Rollup）、Node.jsバージョン互換性検証 | CI/CD |
| 受入テスト | E2Eテスト（create-react-app、Angular CLI、Prettier等との実プロジェクト連携） | CI/CD |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | フィクスチャベースのトランスフォーメーションテスト、パーサーテスト | プルリクエスト時、プッシュ時 |
| 性能テスト | ベンチマークスイートによるパフォーマンス計測 | 必要に応じて手動実行 |
| セキュリティテスト | 依存関係の脆弱性チェック（Yarn/npm audit） | CI/CDパイプライン |
| 型テスト | TSTycheによるTypeScript型定義の検証 | プルリクエスト時 |
| 外部パーサーテスト | Test262、Flow、TypeScriptパーサーテストスイート | CI/CDパイプライン |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| ローカル開発環境 | 開発者による単体テスト実行 | Node.js 20.19.0以上 または 22.12.0以上 |
| GitHub Actions（Ubuntu） | メインCI/CDパイプライン | ubuntu-latest、Node.js 20/22/24/25 |
| GitHub Actions（Windows） | クロスプラットフォーム検証 | windows-latest、Node.js 25.6.1 |
| GitHub Actions（macOS） | クロスプラットフォーム検証 | macos-latest、Node.js 25.6.1 |
| Verdaccio ローカルレジストリ | E2Eテスト用パッケージ配信 | Docker/ローカルプロセス |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| Jest | テストフレームワーク | ^30.1.1 |
| jest-light-runner | 軽量テストランナー | ^0.7.9 |
| c8 | カバレッジ収集（V8ネイティブ） | ^10.0.0 |
| TSTyche | TypeScript型テスト | ^6.2.0 |
| ESLint | 静的解析・リント | ^10.0.0 |
| Prettier | コードフォーマット検証 | ^3.8.1 |
| @babel/helper-transform-fixture-test-runner | フィクスチャテストランナー | workspace |
| @babel/helper-fixtures | テストフィクスチャ管理 | workspace |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 明示的な目標値は設定されていない（Codecovによる継続的モニタリング） |
| 分岐カバレッジ | 明示的な目標値は設定されていない（Codecovによる継続的モニタリング） |

### カバレッジ収集対象

- `packages/*/lib/**/*.{js,cjs,mjs,ts}`
- `codemods/*/lib/**/*.{js,cjs,mjs,ts}`
- `eslint/*/lib/**/*.{js,cjs,mjs,ts}`

### カバレッジ除外対象

- `/node_modules/`
- `<rootDir>/packages/babel-standalone/`
- `/test/(fixtures|tmp|__data__)/`
- `*.d.ts`（型定義ファイル）
- `<rootDir>/packages/babel-types/.*/generated/.*`（自動生成ファイル）
- `<rootDir>/packages/babel-helpers/.*/helpers/.*`

## テストデータ

### フィクスチャベーステスト

Babelのテストは主にフィクスチャベースで実施される。各テストケースは以下のファイル構成を持つ：

- `input.js` / `input.mjs`: 入力ソースコード
- `output.js` / `output.mjs`: 期待される変換結果
- `options.json`: テスト固有のBabel設定
- `exec.js`: 実行時テスト（トランスパイル後のコード実行検証）

### テストデータの配置

```
packages/{package-name}/test/fixtures/
  {test-suite}/
    {test-case}/
      input.js
      output.js
      options.json
```

### 外部テストスイート

- **Test262**: ECMAScript仕様適合テスト（`build/test262`にダウンロード）
- **Flow**: Flowパーサーテスト
- **TypeScript**: TypeScriptパーサーテスト

## 不具合管理

- **Issue Tracker**: GitHub Issues
- **ラベル管理**: `PR: Bug Fix :bug:`、`PR: Spec Compliance :eyeglasses:` 等
- **自動トリアージ**: GitHub Actionsによる自動ラベリング（`.github/workflows/issue-triage.yml`）
- **ステイル管理**: 非アクティブIssueの自動クローズ（`.github/workflows/lock.yml`）

## CI/CD連携

### ワークフロー構成

| ワークフロー | トリガー | 内容 |
| --- | --- | --- |
| `ci.yml` | push, pull_request | メインCI（ビルド、リント、テスト、カバレッジ） |
| `e2e-tests.yml` | push (main), pull_request | E2Eテスト（外部プロジェクト連携） |
| `release.yml` | 手動/タグ | リリースパイプライン |

### CI/CDパイプラインの流れ

1. **Yarn キャッシュ準備**: 依存関係のキャッシュを事前準備
2. **Yarn検証**: 依存関係の制約チェック、重複チェック、循環依存チェック
3. **ビルド**: Babel成果物のビルド（Ubuntu、Windows両環境）
4. **リント**: ESLint、Prettierによるコード品質チェック
5. **テスト実行**:
   - Node.js 20/22/24/25でのテスト
   - Windows/macOSでのクロスプラットフォームテスト
   - カバレッジ収集（c8）とCodecovへのアップロード
6. **外部パーサーテスト**: Test262、Flow、TypeScriptテストスイート
7. **ランタイム連携テスト**: 複数のNode.jsバージョン（10〜23）での`@babel/runtime`検証
8. **ESLintバージョンテスト**: `@babel/eslint-*`の互換性検証
9. **E2Eテスト**: Verdaccioローカルレジストリを使用した実プロジェクトテスト

### テスト実行コマンド

```bash
# 全テスト実行（リント + テスト）
make test

# テストのみ実行
make test-only

# カバレッジ付きテスト
yarn c8 jest --ci

# ESMテスト
yarn test:esm

# ランタイム連携テスト
yarn test:runtime:node
yarn test:runtime:bundlers

# 外部パーサーテスト
make test-test262
make test-flow
make test-typescript
```

### 並列実行とマトリックス戦略

- **Node.jsバージョンマトリックス**: 20, 22, 24でのテスト並列実行
- **OS マトリックス**: Ubuntu, Windows, macOSでのクロスプラットフォームテスト
- **Test262並列実行**: 8チャンクに分割して並列実行
- **ランタイムマトリックス**: Node.js 10〜23.10の多バージョンテスト

## 備考

### テストパターン

Jestのテスト対象ファイルパターン：
```
./(packages|codemods|eslint)/[^/]+/test/.+\.m?js$
```

### 除外パターン

以下のパスはテスト対象から除外される：
- `/test/fixtures/`
- `/test/debug-fixtures/`
- `/test/regenerator-fixtures/`
- `/babel-preset-env/test/regressions/`
- `/babel-parser/test/expressions/`
- `/test/tmp/`
- `/test/__data__/`
- `/test/helpers/`
- `_browser.js`

### Babel 9対応

CI/CDでは Babel 8 と Babel 9 の両方のビルド・テストを並行実施：
- `BABEL_9_BREAKING=false`: Babel 8モード
- `BABEL_9_BREAKING=true`: Babel 9モード
