# バッチ設計書 43-test

## 概要

本ドキュメントは、Railsアプリケーションのtestフォルダ内のすべてのテストを実行するRakeタスク `test` の設計仕様を定義する。

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

`test` タスクは、Minitestフレームワークを使用してRailsアプリケーションのテストスイートを実行する。システムテスト（test/system）を除くtest/ディレクトリ内のすべてのテストファイルを検出し、実行する。

**業務上の目的・背景**：自動テストは、ソフトウェア品質を担保するための重要な手段である。本タスクにより、開発者はコードの変更がアプリケーションの既存機能に悪影響を与えていないかを迅速に確認できる。CI/CDパイプラインにおいても、コードの品質ゲートとして使用される。systemテストを除外しているのは、ブラウザ自動化を伴うテストは実行時間が長く、通常の単体テスト・結合テストと分離して実行されることが多いためである。

**バッチの実行タイミング**：以下の場面で実行される。
- ローカル開発時のコード変更後
- プルリクエスト作成時のCI/CDパイプライン
- デプロイ前の品質確認
- `bin/rails test` コマンド実行時

**主要な処理内容**：
1. RAILS_ENVをtest環境に設定
2. TEST環境変数で指定されたテストファイル、または全テストファイルを対象として特定
3. test/**/*_test.rb パターンにマッチするファイルを収集
4. test/system、test/dummy、test/fixtures配下を除外
5. Rails::TestUnit::Runner.run_from_rakeを介してテストを実行
6. Minitestフレームワークでテストを実行し結果を出力
7. テスト失敗時は非ゼロの終了コードを返す

**前後の処理との関連**：`test:prepare` タスクが事前に実行され、テスト環境の準備が行われる。Active Recordを使用する場合は、データベーススキーマの同期が行われる。`test:db` タスクは本タスクを内包し、事前にデータベースリセットを実行する。

**影響範囲**：テスト環境のデータベースに対してテストデータの読み書きが行われる。本番環境やdevelopment環境のデータには影響しない。

## バッチ種別

テスト実行 / 品質保証

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（開発時・CI/CD時） |
| 実行時刻 | 任意 |
| 実行曜日 | 任意 |
| 実行日 | 任意 |
| トリガー | 手動・CI/CD（bin/rails test） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| テストファイル | test/ディレクトリ配下に*_test.rbファイルが存在すること |
| テスト環境 | test環境のデータベースが設定されていること（Active Record使用時） |
| 依存gem | minitest等のテスト関連gemがインストールされていること |

### 実行可否判定

テストファイルが存在すれば実行可能。テストファイルが存在しない場合は、テストなしとして成功終了する。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| TEST | String | No | なし | 実行する特定のテストファイルまたはディレクトリ |
| TESTOPTS | String | No | なし | Minitestに渡す追加オプション |
| DEFAULT_TEST | String | No | test/**/*_test.rb | デフォルトのテストファイルglob |
| DEFAULT_TEST_EXCLUDE | String | No | test/{system,dummy,fixtures}/**/*_test.rb | 除外するテストファイルglob |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| test/**/*_test.rb | Ruby | テストファイル群 |
| test/fixtures/ | YAML/Ruby | テストフィクスチャ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | テスト実行結果（成功/失敗/エラー） |
| 終了コード | 整数 | 0:成功、非ゼロ:失敗 |

### 出力ファイル仕様

ファイル出力なし。標準出力へのテスト結果表示のみ。

出力例：
```
Running 42 tests in 3 parallel workers

Finished in 2.456789s, 17.1003 tests/s, 45.6789 assertions/s.

42 tests, 112 assertions, 0 failures, 0 errors, 0 skips
```

## 処理フロー

### 処理シーケンス

```
1. RAILS_ENV の設定
   └─ 未設定の場合は "test" を設定
2. テストファイルの収集
   └─ DEFAULT_TEST または TEST 環境変数に基づいてファイルリストを作成
3. 除外ファイルの適用
   └─ system/dummy/fixtures 配下を除外
4. Rails::TestUnit::Runner.run_from_rake 呼び出し
   └─ system() を使用して rails test コマンドを実行
5. Minitest の実行
   └─ 各テストファイルを require してテストを実行
6. 結果の出力
   └─ テスト結果を標準出力に表示
7. 終了コードの返却
   └─ 失敗時は exit(false) で非ゼロを返す
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[RAILS_ENV=test 設定]
    B --> C[テストファイル収集]
    C --> D[除外パターン適用]
    D --> E{テストファイルあり？}
    E -->|Yes| F[Rails::TestUnit::Runner 実行]
    E -->|No| G[テストなしで終了]
    F --> H[Minitest 実行]
    H --> I{テスト結果}
    I -->|全て成功| J[exit 0]
    I -->|失敗あり| K[exit 非ゼロ]
    G --> J
```

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| フィクスチャロード | 各テーブル | INSERT/DELETE | テストデータの投入 |
| テスト実行 | 各テーブル | SELECT/INSERT/UPDATE/DELETE | テスト内容に依存 |

### テーブル別操作詳細

テスト内容に完全に依存する。各テストケースがデータベースをどのように使用するかによって異なる。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 非ゼロ終了 | テスト失敗 | テストアサーションが失敗 | テストコードまたは本番コードを修正 |
| LoadError | ファイル読み込みエラー | テストファイルが見つからない | ファイルパスを確認 |
| 接続エラー | データベースエラー | テストDBに接続できない | test環境のDB設定を確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | なし |
| リトライ対象エラー | なし |

### 障害時対応

テスト失敗時は、出力されたエラーメッセージとスタックトレースを確認し、原因を特定して修正する。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 各テストケース単位（ActiveRecord::TestFixtures使用時） |
| コミットタイミング | テストごとにロールバック |
| ロールバック条件 | 各テスト終了時 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | テストケース数に依存 |
| 目標処理時間 | プロジェクトにより異なる |
| メモリ使用量上限 | プロジェクトにより異なる |

## 排他制御

テスト環境のデータベースを使用するため、同一環境での並列実行は推奨されない。ただし、Minitest自体は並列テスト実行をサポートしている。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 標準出力 | テスト実行中 | テスト名、進捗 |
| 標準出力 | 失敗時 | エラーメッセージ、スタックトレース |
| 標準出力 | 完了時 | サマリー（テスト数、アサーション数、失敗数等） |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| テスト成功率 | 100% | CI/CD通知先 |
| テスト実行時間 | プロジェクトにより設定 | CI/CD通知先 |

## 備考

- `bin/rails test:system` で systemテストのみを実行可能
- `bin/rails test:all` で systemテストを含む全テストを実行可能
- テストの並列実行は PARALLEL_WORKERS 環境変数で制御可能
- 特定のテストファイルやメソッドを指定して実行可能（例: `bin/rails test test/models/user_test.rb:10`）
