# バッチ設計書 33-make test

## 概要

本ドキュメントは、mrubyプロジェクトにおけるMakeターゲット `make test` のバッチ設計書である。MakefileからRakeを呼び出してmrubyのテストをビルド・実行するラッパーコマンドについて記述する。

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

`make test` は、Makefileで定義されたテスト用ターゲットであり、まず `make all` で全ターゲットをビルドした後、Rakeの `test` タスクを実行してmrubyの全テストをビルド・実行する。

**業務上の目的・背景**：開発者が行ったコード変更に対して、全テストスイートを実行し品質を確認するためのコマンドである。Make経由でテスト実行を可能にすることで、標準的なC/C++プロジェクトのワークフローに合わせた開発体験を提供する。

**バッチの実行タイミング**：開発者がコード変更後に手動で実行する。コミット前の品質確認や、CI/CDパイプラインの一部として使用される。

**主要な処理内容**：
1. Rakeコマンドの存在チェック（check_rake依存ターゲット）
2. `make all` の実行（allターゲットへの依存）
3. `$(RAKE) test` の実行（Rakefileのtestタスクを呼び出し）
4. テスト結果の出力

**前後の処理との関連**：Makefileで `test: check_rake all` と定義されており、`make all`（No.32）が前提として実行される。Rakeの `test` タスクは `test:build` と `test:run` を順に実行する。

**影響範囲**：ビルドディレクトリにテスト用ビルド成果物が追加生成される。テスト実行結果が標準出力に出力される。

## バッチ種別

テスト実行（Rakeラッパー）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | 手動（開発者によるコマンド実行） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Ruby | Rubyランタイムがインストールされていること |
| Rake | Rakeコマンドが利用可能であること（check_rakeで検証） |
| Cコンパイラ | GCCまたはClang等のCコンパイラが利用可能であること |

### 実行可否判定

Makefileの `check_rake` ターゲットが先に実行され、Rakeコマンドの存在を確認する。存在しない場合はエラーメッセージを出力して終了する。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| RAKE | Makefile変数 | No | rake | 使用するRakeコマンド |
| MRUBY_CONFIG | 環境変数 | No | build_config/default.rb | mrubyビルド設定ファイルパス |
| CC | 環境変数 | No | システムデフォルト | Cコンパイラ |
| CXX | 環境変数 | No | システムデフォルト | C++コンパイラ |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Makefile | Make | ターゲット定義 |
| Rakefile | Ruby | テストタスク定義 |
| tasks/test.rake | Ruby | テスト詳細定義 |
| mrubyソースコード一式 | C/Ruby | テスト対象のソースコード |
| テストコード一式 | C/Ruby | テストケース |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | テスト実行結果（成功/失敗の詳細） |
| build/ | バイナリ | テスト用ビルド成果物 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | N/A（標準出力が主） |
| 出力先 | 標準出力、build/ |
| 文字コード | UTF-8 |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. check_rake実行
   └─ rakeコマンドの存在確認
2. allターゲット実行
   └─ 全ビルドターゲットの構築（make allと同等）
3. $(RAKE) test実行
   └─ Rakefileのtestタスクを呼び出し
4. test:build
   └─ テスト用バイナリのビルド
5. test:run
   └─ テストの実行と結果出力
```

### フローチャート

```mermaid
flowchart TD
    A[make test 開始] --> B[check_rake: rakeコマンド存在確認]
    B --> C{rakeが存在?}
    C -->|なし| D[エラー出力・終了]
    C -->|あり| E[make all 実行]
    E --> F["$(RAKE) test 実行"]
    F --> G[test:build テストバイナリビルド]
    G --> H[test:run テスト実行]
    H --> I{テスト結果}
    I -->|全件成功| J[正常終了]
    I -->|失敗あり| K[テスト失敗・非0終了]
    J --> L[バッチ終了]
    K --> L
```

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

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

本バッチではデータベース操作は行わない。

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| N/A | N/A | N/A | データベース操作なし |

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

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | コマンド未検出 | rakeコマンドがPATHに存在しない | Rubyおよびrake gemをインストールする |
| 非0終了 | ビルド失敗 | ソースコードのコンパイル失敗 | エラーメッセージを確認し、ソースコードを修正する |
| 非0終了 | テスト失敗 | テストケースの失敗 | テスト結果出力を確認し、失敗テストを特定・修正する |

### リトライ仕様

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

### 障害時対応

テスト失敗時は、標準出力のテスト結果を確認し、失敗したテストケースを特定する。ビルド失敗時は `make clean` 後に再実行を試みる。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（データベーストランザクションなし） |
| コミットタイミング | N/A |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | mruby全テストスイート |
| 目標処理時間 | 環境依存（一般的に数分以内） |
| メモリ使用量上限 | システム依存 |

## 排他制御

ビルドディレクトリへの同時書き込みを避けるため、同一ビルドディレクトリに対する並行実行は行わないこと。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | ビルド開始時 | ビルド対象ファイルの情報 |
| 進捗ログ | テスト実行中 | 各テストケースの実行結果 |
| 終了ログ | テスト完了時 | テスト結果サマリー |
| エラーログ | エラー発生時 | テスト失敗の詳細 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 処理時間 | 特に定めなし | 標準出力 |
| テスト失敗件数 | 1件以上 | 標準エラー出力 |

## 備考

- `make test` はMakefile内で `test: check_rake all` と定義されており、allターゲット（ビルド）を前提としている
- 内部的には `$(RAKE) test` を実行し、Rakefileの `rake test` タスクに処理を委譲する
- Makefileのコメント `## build and run all mruby tests` がhelpターゲットで表示される
