# バッチ設計書 11-test

## 概要

本ドキュメントは、Decap CMSプロジェクトにおけるテスト実行バッチ `test` の設計仕様を定義する。本バッチはリント、型チェック、ユニットテストを順次実行し、コード品質を包括的に検証する統合テストバッチである。

### 本バッチの処理概要

本バッチは、Decap CMSモノレポ全体のコード品質を一括で検証するための統合テストスクリプトである。lint（静的解析）、type-check（TypeScript型チェック）、test:unit（Jestユニットテスト）の3つのサブタスクを順次実行し、いずれかが失敗した場合は後続の処理を中断する。

**業務上の目的・背景**：開発者がローカル環境でコードの品質を包括的に検証するために使用する。PR作成前やコミット前に実行することで、リントエラー、型エラー、テスト失敗を早期に検出し、コードベースの品質を維持する。CI環境では `test:ci` が使用されるため、本バッチは主にローカル開発での利用を想定している。

**バッチの実行タイミング**：開発者による手動実行（随時）。PR作成前やコード変更後にローカル環境で実行される。

**主要な処理内容**：
1. `npm run lint` - CSSリント（stylelint）とJS/TSリント（eslint）を並列実行
2. `npm run type-check` - TypeScriptの型チェック（tsc --noEmit）を実行
3. `npm run test:unit` - Jestによるユニットテストを実行（cross-env NODE_ENV=test jest --no-cache）

**前後の処理との関連**：本バッチはNo.15 lint、No.19 type-check、および内部の test:unit サブタスクを順次呼び出す。CI環境向けには No.12 test:ci が同等の機能を提供する。全テスト実行には `test:all` コマンドが使用され、本バッチの後に No.13 test:e2e が続く。

**影響範囲**：プロジェクト全体の packages/ 配下の全パッケージのソースコードが検証対象となる。テスト自体はファイルシステムやデータベースへの副作用を持たない読み取り専用の処理である。

## バッチ種別

テスト実行（リント・型チェック・ユニットテスト統合実行）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | なし |
| 実行日 | なし |
| トリガー | 手動（開発者によるローカル実行） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js | Node.js 22.x または 24.x がインストールされていること |
| 依存パッケージ | `npm ci` または `npm install` で依存関係がインストール済みであること |
| プロジェクトルート | モノレポのルートディレクトリで実行すること |

### 実行可否判定

特別な実行可否判定は行わない。前提条件が満たされていれば常に実行可能である。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| NODE_ENV | 環境変数 | No | test（test:unit実行時に自動設定） | テスト実行環境を指定 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| packages/*/src/**/*.{js,jsx,ts,tsx} | ソースコード | リント・型チェック・テスト対象のソースファイル |
| packages/**/*.{css,scss} | スタイルシート | CSSリント対象のスタイルファイル |
| packages/**/__tests__/**/*.{js,jsx,ts,tsx} | テストコード | Jestユニットテストファイル |
| jest.config.js | 設定ファイル | Jestテスト設定 |
| tsconfig.json | 設定ファイル | TypeScript型チェック設定 |
| .eslintrc.js | 設定ファイル | ESLint設定 |
| .stylelintrc | 設定ファイル | Stylelint設定 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | リント結果、型チェック結果、テスト結果を出力 |
| 標準エラー出力 | テキスト | エラー詳細を出力 |
| プロセス終了コード | 数値 | 0: 成功、1以上: 失敗 |

### 出力ファイル仕様

本バッチはファイル出力を行わない。結果は標準出力・標準エラー出力にのみ出力される。

## 処理フロー

### 処理シーケンス

```
1. lint実行
   ├─ lint:css（stylelint）を並列起動
   └─ lint:js（eslint）を並列起動
   └─ 両方の完了を待機、いずれか失敗でエラー終了
2. type-check実行
   └─ tsc --noEmit でTypeScript型チェックを実行
   └─ 型エラーがあればエラー終了
3. test:unit実行
   └─ cross-env NODE_ENV=test jest --no-cache で全ユニットテストを実行
   └─ テスト失敗があればエラー終了
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始: npm run test] --> B[lint実行]
    B --> B1[lint:css - stylelint]
    B --> B2[lint:js - eslint]
    B1 --> C{lint成功?}
    B2 --> C
    C -->|失敗| Z[エラー終了]
    C -->|成功| D[type-check実行: tsc --noEmit]
    D --> E{型チェック成功?}
    E -->|失敗| Z
    E -->|成功| F[test:unit実行: jest --no-cache]
    F --> G{テスト成功?}
    G -->|失敗| Z
    G -->|成功| H[バッチ正常終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

本バッチはデータベースへのアクセスを行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | リントエラー | ESLintまたはStylelintのルール違反検出 | エラー箇所を修正後に再実行 |
| 1 | 型チェックエラー | TypeScript型エラー検出 | 型定義を修正後に再実行 |
| 1 | テスト失敗 | Jestテストケースの失敗 | テストまたはソースコードを修正後に再実行 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（手動再実行） |
| リトライ間隔 | なし |
| リトライ対象エラー | なし |

### 障害時対応

各サブタスクの失敗時は該当する処理のエラーメッセージに従い、ソースコードまたはテストコードを修正して再実行する。lint段階で失敗した場合は `npm run format` による自動修正も有効である。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし（読み取り専用処理） |
| コミットタイミング | なし |
| ロールバック条件 | なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | モノレポ内全パッケージのソースファイル |
| 目標処理時間 | 数分程度（プロジェクト規模に依存） |
| メモリ使用量上限 | Node.jsデフォルトヒープサイズ |

## 排他制御

同時実行の制御は行わない。ただし、同一ディレクトリで複数のテストプロセスを同時に実行すると、ファイルロックの競合が発生する可能性がある。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | 各サブタスク開始時 | npm run lint / type-check / test:unit の実行開始メッセージ |
| 進捗ログ | 処理中 | ESLint/Stylelint/tsc/Jestの進捗情報 |
| 終了ログ | 各サブタスク終了時 | テスト結果サマリー（成功数・失敗数・スキップ数） |
| エラーログ | エラー発生時 | エラー箇所のファイルパス・行番号・エラー内容 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 処理時間 | なし（ローカル実行のため） | なし |
| エラー件数 | なし（ローカル実行のため） | なし |

## 備考

- 本バッチは `npm run test` コマンドで実行される
- CI環境向けには `npm run test:ci`（No.12）を使用すること。lintのquietモードが有効になり出力が簡潔になる
- `npm run test:all` を実行すると、本バッチに続いてE2Eテスト（No.13）も実行される
- Jestは `--no-cache` オプション付きで実行されるため、キャッシュの影響を受けずに常に最新のコードでテストされる
- テスト環境は jsdom を使用し、`http://localhost:8080` をベースURLとして設定している
