# バッチ設計書 11-rake test:lib

## 概要

本ドキュメントは、mrubyプロジェクトにおけるライブラリテストのビルドおよび実行を行う`rake test:lib`タスクのバッチ設計書である。

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

`rake test:lib`は、mrubyのコアライブラリおよびmrbgemsのライブラリレベルのテストをビルドし、実行するRakeタスクである。mruby-test gemをロードしてテストバイナリ（mrbtest）を生成し、各ビルドターゲットに対してテストを実行する。

**業務上の目的・背景**：mrubyのコアライブラリやmrbgemsが正しく動作することを検証するために必要なタスクである。コード変更後の回帰テストとして使用され、ライブラリレベルの品質を保証する。CIパイプラインにおいても`rake test`の一部として組み込まれており、プルリクエストやpush時の自動検証に不可欠である。

**バッチの実行タイミング**：開発者による手動実行、またはCI/CDパイプライン（GitHub Actions等）でのpush/PR時の自動実行。`rake test`タスクの一部としても間接的に実行される。

**主要な処理内容**：
1. `build:lib`タスクを前提条件として実行し、ライブラリのビルドを完了させる
2. `rake:all`タスクにより全ターゲットのビルドを実施
3. 各ビルドターゲットに対して`mruby-test` gemをセットアップ
4. mrbtest実行可能バイナリを生成（define_installer_if_needed）
5. 各ビルドターゲットの`run_test`メソッドによりテストを実行

**前後の処理との関連**：`rake test`タスクから呼び出される場合は、`test:build`タスクが先行する。`build:lib`タスク（`rake:all`に依存）が前提条件として実行される。後続処理としては、テスト結果の出力とCI上での成否判定がある。

**影響範囲**：ビルドディレクトリ内にmrbtestバイナリが生成される。テスト結果は標準出力に表示され、テストの成否がプロセスの終了コードとして返される。ソースコードやプロダクションビルドには影響しない。

## バッチ種別

テスト実行（ライブラリテスト）

## 実行スケジュール

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

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Ruby実行環境 | Rubyインタプリタ（CRuby）がインストールされていること |
| Rakeインストール | Rakeがインストールされていること |
| Cコンパイラ | GCCまたはClangなどのCコンパイラが利用可能であること |
| ビルド設定 | mruby_config（build_config）が正しく設定されていること |
| テスト有効化 | ビルド設定でtest_enabled?がtrueであること（enable_test指定） |

### 実行可否判定

ビルドターゲットの`test_enabled?`メソッドがtrueを返す場合にのみ、そのターゲットのテストが実行される。テストが無効化されているターゲットはスキップされる。

## 入力仕様

### 入力パラメータ

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

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| build_config/*.rb | Ruby | ビルド設定ファイル（テスト対象ターゲット定義） |
| test/*.rb | Ruby | mruby-test gemに含まれるテストファイル |
| mrbgems/*/test/*.rb | Ruby | 各gemのテストファイル |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | テスト実行結果（成功/失敗件数） |
| build/*/bin/mrbtest | バイナリ | テスト実行バイナリ |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | mrbtest（各ビルドターゲットごと） |
| 出力先 | build/{target_name}/bin/ |
| 文字コード | N/A（バイナリファイル） |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. build:libタスクの実行（前提条件）
   └─ rake:allタスクを実行し、全ターゲットのビルドを完了
2. mruby-test gemのロード
   └─ MRuby.each_targetで各ターゲットにmruby-test gemを追加
3. テストバイナリのビルド
   └─ gem.setup / gem.setup_compilers でコンパイラ設定
   └─ define_installer_if_neededでmrbtestバイナリを生成
4. テスト実行（run:lib）
   └─ 各ビルドターゲットのrun_testメソッドを呼び出し
   └─ テスト結果を標準出力に表示
```

### フローチャート

```mermaid
flowchart TD
    A[rake test:lib 開始] --> B[build:lib タスク実行]
    B --> C[rake:all 実行]
    C --> D[各ターゲットに mruby-test gem をロード]
    D --> E{test_enabled?}
    E -->|Yes| F[gem.setup / gem.setup_compilers]
    E -->|No| G[スキップ]
    F --> H[mrbtest バイナリ生成]
    H --> I[run_test 実行]
    I --> J{テスト成功?}
    J -->|Yes| K[次のターゲットへ]
    J -->|No| L[エラー終了]
    K --> M{全ターゲット完了?}
    M -->|Yes| N[正常終了]
    M -->|No| E
    G --> M
```

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

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

本バッチはデータベースを使用しない。ファイルシステム上のビルド成果物の生成とテスト実行のみを行う。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| N/A | コンパイルエラー | テストコードまたはソースコードにコンパイルエラーが存在する場合 | ソースコードを修正してから再実行 |
| N/A | テスト失敗 | テストアサーションが失敗した場合 | テスト結果を確認し、コードまたはテストを修正 |
| N/A | ビルド設定エラー | build_configが不正な場合 | ビルド設定ファイルを確認・修正 |

### リトライ仕様

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

### 障害時対応

テスト失敗時は、標準出力に表示されるテスト結果を確認し、失敗したテストケースを特定する。コードの修正後に`rake test:lib`を再実行して検証する。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（ファイルシステム操作のみ） |
| コミットタイミング | N/A |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | ビルドターゲット数に依存（通常1〜数個） |
| 目標処理時間 | ビルド構成に依存（通常数分〜十数分） |
| メモリ使用量上限 | 特に制限なし（システムリソースに依存） |

## 排他制御

同一ビルドディレクトリに対する同時実行は想定されていない。複数の`rake test:lib`を同時に実行した場合、ビルド成果物の競合が発生する可能性がある。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| テスト結果 | テスト実行後 | 成功/失敗件数、失敗テストの詳細 |
| エラーログ | コンパイルエラー時 | コンパイラのエラーメッセージ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| テスト成否 | 1件以上の失敗 | CI/CD通知（GitHub Actions） |
| 処理時間 | ビルド構成依存 | CI/CDタイムアウト設定 |

## 備考

- `rake test:lib`は`rake test`タスクの一部として間接的に呼び出されることが多い
- テスト対象はビルド設定で`enable_test`が指定されたターゲットのみ
- mruby-test gemは動的にロードされ、テストバイナリ（mrbtest）に組み込まれる
- CXX例外が有効な場合、一部ファイルはC++としてコンパイルされる
