# バッチ設計書 10-rake test

## 概要

本ドキュメントは、mrubyの全テストをビルドして実行する `rake test` タスクの設計仕様を記述する。

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

`rake test` は、mrubyプロジェクトの全テスト（ライブラリテストおよびコマンドバイナリテスト）をビルドし、実行する統合テストタスクである。`test:build` でテスト用のバイナリをビルドし、`test:run` でテストを実行する。

**業務上の目的・背景**：mrubyの品質を保証するためには、コアランタイム、標準ライブラリ、各gemの機能が正しく動作することを検証する必要がある。`rake test` はこの検証を一括で行う統合タスクであり、CI/CDパイプラインでの自動テスト実行や、開発者によるローカルでの品質確認に使用される。ライブラリテスト（`mruby-test` gemを使用）とバイナリテスト（bintest）の2種類のテストを包括的に実行する。

**バッチの実行タイミング**：開発者による手動実行（随時）。CI/CDパイプラインでのテストステップとして実行。`rake all` の後に実行されることが想定される。

**主要な処理内容**：
1. `test:build` タスクを実行し、テスト用バイナリ（mrbtest）をビルドする
2. `test:build` は内部で `build:lib` を実行し、`mruby-test` gemをロードしてテストバイナリを生成する
3. `test:run` タスクを実行し、全テストを実行する
4. テスト有効なターゲットでは `build.run_test` でライブラリテストを実行する
5. bintestが有効なターゲットでは `build.run_bintest` でバイナリテストを実行する

**前後の処理との関連**：`rake all`（No.1）によるビルドが完了していることが前提。`test:build:lib` は内部で `rake:all` を依存関係として指定しており、テストビルド前にメインビルドが完了する。`:clean` タスクではmrbtestバイナリも削除される。

**影響範囲**：テスト実行時にmrbtestバイナリが生成される。テスト結果は標準出力に表示される。テスト失敗時はプロセスの終了コードが0以外となる。

## バッチ種別

テスト実行処理（統合テスト）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動（`rake test`）/ CI/CDパイプライン |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| mrubyビルド完了 | `rake all` によるビルドが完了していること（`test:build:lib` が `rake:all` に依存） |
| test_enabled? | ターゲットでテストが有効であること（ライブラリテスト） |
| bintest_enabled? | ターゲットでbintestが有効であること（バイナリテスト） |
| mruby-test gem | テスト用gemが利用可能であること |

### 実行可否判定

`test_enabled?` が true のターゲットでライブラリテストが実行される。`bintest_enabled?` が true のターゲットでバイナリテストが実行される。いずれも有効でないターゲットではテストがスキップされる。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| MRUBY_CONFIG | 環境変数（文字列） | No | `build_config/default.rb` | ビルド設定ファイルのパス |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| test/ | テストファイル | mrubyのテストスクリプト |
| mrbgems/*/test/ | テストファイル | 各gemのテストスクリプト |
| mruby-test gem | Ruby gem | テストフレームワーク |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | テスト結果（合格/不合格の件数、失敗テストの詳細） |
| build/{target}/bin/mrbtest | 実行バイナリ | テスト用バイナリ |
| bin/mrbtest | 実行バイナリ | インストール済みテストバイナリ |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | mrbtest |
| 出力先 | `build/{target}/bin/` および `bin/` |
| 文字コード | バイナリ |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. test:build タスク実行
   └─ test:build:lib に依存
2. test:build:lib タスク実行
   └─ rake:all に依存（メインビルドを先に完了）
   └─ MRuby.each_target で mruby-test gem をロード
   └─ test:build:lib_without_loading_gem タスクを実行
3. test:build:lib_without_loading_gem:{target} タスク実行
   └─ mruby-test gem のセットアップ
   └─ mrbtest バイナリのインストーラを invoke
4. test:run タスク実行
   └─ test_enabled? なターゲットで test:run:lib:{target} を実行
   └─ bintest_enabled? なターゲットで test:run:bin:{target} を実行
5. test:run:lib:{target} タスク実行
   └─ build.run_test でライブラリテストを実行
6. test:run:bin:{target} タスク実行
   └─ build.run_bintest でバイナリテストを実行
```

### フローチャート

```mermaid
flowchart TD
    A[rake test 開始] --> B[test:build 実行]
    B --> C[test:build:lib 実行]
    C --> D[rake:all 実行（メインビルド）]
    D --> E[mruby-test gem ロード]
    E --> F[mrbtest バイナリビルド]
    F --> G[test:run 実行]
    G --> H{test_enabled?}
    H -->|はい| I[build.run_test 実行]
    H -->|いいえ| J{bintest_enabled?}
    I --> J
    J -->|はい| K[build.run_bintest 実行]
    J -->|いいえ| L[rake test 終了]
    K --> L
```

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

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

本バッチではデータベース操作は発生しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | テストビルドエラー | mrbtestバイナリのコンパイル/リンク失敗 | エラーメッセージに従いソースコードを修正 |
| - | テスト失敗 | テストケースの assert 失敗 | 失敗したテストケースの内容を確認し修正 |
| - | bintest失敗 | バイナリテストの期待結果不一致 | テストスクリプトまたは対象バイナリを修正 |

### リトライ仕様

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

### 障害時対応

テスト失敗時は失敗したテストケースの詳細出力を確認し、対象のソースコードまたはテストスクリプトを修正する。テストビルドエラーの場合は `rake clean` 後に再ビルドする。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 全テストケース数（数百から数千件） |
| 目標処理時間 | 環境依存（通常数分以内） |
| メモリ使用量上限 | 環境依存 |

## 排他制御

同一ビルドディレクトリに対する同時実行は想定されていない。ただし、`test:run:serial` タスクを使用することで逐次実行が可能である。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | テストビルド時 | ビルド対象ファイル |
| テスト結果ログ | テスト実行時 | テストケースの合格/不合格結果 |
| エラーログ | テスト失敗時 | 失敗したテストケースの詳細 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 0以外 | CI/CDパイプラインの通知設定に依存 |
| テスト失敗件数 | 1件以上 | CI/CDパイプラインの通知設定に依存 |

## 備考

- `rake test` は `test:build` と `test:run` の2フェーズで構成される。ビルドフェーズではmrbtestバイナリを生成し、実行フェーズでテストを実行する。
- `test:run:serial` タスクを使用すると、テストを並列ではなく逐次実行できる。デバッグ時に有用である。
- `test:lib` タスクはライブラリテストのみ、`test:bin` タスクはバイナリテストのみを実行するサブタスクである。
- `:clean` タスクでは `host` ターゲットの `mrbtest` バイナリが削除される（test.rake最終行）。
- `test:build:lib` は `rake:all` に依存しているため、テストビルド前に必ずメインビルドが完了する。
- `mruby-test` gem は `test:build:lib` タスク内で動的にロードされる（`build.gem(core: 'mruby-test')`）。
