# バッチ設計書 12-rake test:bin

## 概要

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

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

`rake test:bin`は、mrubyのコマンドラインバイナリ（mrbc、mruby、mirb等）に対するインテグレーションテスト（bintest）をビルドし実行するRakeタスクである。各ビルドターゲットで`bintest_enabled?`が有効なターゲットに対して`run_bintest`メソッドを呼び出し、バイナリの動作を検証する。

**業務上の目的・背景**：mrubyが生成するコマンドラインツール（mrbc、mruby、mirb等）が正しく動作することを検証するために必要なタスクである。ライブラリレベルのテスト（test:lib）とは異なり、コマンドラインインターフェースの動作を外部からテストする。ユーザーが直接使用するバイナリの品質保証を担う。

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

**主要な処理内容**：
1. `rake:all`タスクを前提条件として実行し、全ターゲットのビルドを完了させる
2. 各ビルドターゲットで`bintest_enabled?`が有効なターゲットを抽出
3. 各対象ターゲットに対して`run_bintest`メソッドを呼び出しbintestを実行
4. テスト結果を標準出力に表示

**前後の処理との関連**：`rake test`タスクから`test:run`経由で間接的に呼び出される。`rake:all`タスクが前提条件として先行実行される。test:libタスクとは独立しているが、`rake test`では両方が実行される。

**影響範囲**：テスト結果は標準出力に表示され、テストの成否がプロセスの終了コードとして返される。ビルド済みバイナリを使用してテストするため、ソースコードやビルド成果物には影響しない。

## バッチ種別

テスト実行（コマンドバイナリテスト）

## 実行スケジュール

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

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Ruby実行環境 | Rubyインタプリタ（CRuby）がインストールされていること |
| Rakeインストール | Rakeがインストールされていること |
| ビルド完了 | rake:allによる全ターゲットのビルドが完了していること |
| bintest有効化 | ビルド設定でbintest_enabled?がtrueであること（enable_bintest指定） |

### 実行可否判定

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

## 入力仕様

### 入力パラメータ

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

### 入力データソース

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

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | bintest実行結果（成功/失敗件数） |

### 出力ファイル仕様

本バッチはファイル出力を行わない。テスト結果は標準出力のみに表示される。

## 処理フロー

### 処理シーケンス

```
1. rake:allタスクの実行（前提条件）
   └─ 全ターゲットのビルドを完了
2. bintest対象ターゲットの抽出
   └─ MRuby.each_targetでbintest_enabled?がtrueのターゲットを選択
3. bintest実行
   └─ 各対象ターゲットのrun_bintestメソッドを呼び出し
4. 結果出力
   └─ テスト結果を標準出力に表示
```

### フローチャート

```mermaid
flowchart TD
    A[rake test:bin 開始] --> B[rake:all タスク実行]
    B --> C[MRuby.each_target でターゲット走査]
    C --> D{bintest_enabled?}
    D -->|Yes| E[run_bintest 実行]
    D -->|No| F[スキップ]
    E --> G{テスト成功?}
    G -->|Yes| H[次のターゲットへ]
    G -->|No| I[エラー終了]
    H --> J{全ターゲット完了?}
    J -->|Yes| K[正常終了]
    J -->|No| C
    F --> J
```

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

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

本バッチはデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| N/A | テスト失敗 | bintestアサーションが失敗した場合 | テスト結果を確認し、バイナリの実装またはテストを修正 |
| N/A | バイナリ未生成 | ビルドが正常に完了していない場合 | rake allを先に実行してビルドを完了させる |

### リトライ仕様

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

### 障害時対応

テスト失敗時は、標準出力のテスト結果を確認し、失敗したテストケースを特定する。対象バイナリの実装を確認・修正後に再実行する。

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

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

## パフォーマンス要件

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

## 排他制御

同一ビルドディレクトリに対する同時実行は想定されていない。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| テスト結果 | 各テスト実行後 | 成功/失敗件数、失敗テストの詳細 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| テスト成否 | 1件以上の失敗 | CI/CD通知（GitHub Actions） |

## 備考

- `rake test:bin`は`rake test`タスクの一部として間接的に呼び出されることが多い
- bintestはコマンドラインバイナリを外部プロセスとして実行しその出力を検証する
- bintest対象はビルド設定で`enable_bintest`が指定されたターゲットのみ
- test:run:bin タスクに各ターゲットのbintestタスクが依存関係として追加される
