# バッチ設計書 26-test

## 概要

本ドキュメントは、clojure-lspプロジェクトにおける全ユニットテスト実行バッチ（test）の設計を記載したものである。

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

本バッチは、clojure-lspの全ユニットテストを一括実行する処理である。test-reflection、test-lib、test-cliの3つのサブタスクを順次実行し、プロジェクト全体のコード品質を包括的に検証する。

**業務上の目的・背景**：clojure-lspはコアライブラリ（lib）とCLIモジュール（cli）に分かれており、それぞれ独立したテストスイートを持っている。開発者やCI/CDシステムが単一のコマンドで全テストを実行できるようにすることで、リグレッションの検出を確実にし、リリース前の品質保証プロセスを簡素化する。また、リフレクション警告テストを最初に実行することで、GraalVMネイティブイメージ化に影響する問題を早期に検出する。

**バッチの実行タイミング**：開発中のマイルストーン確認時、プルリクエスト作成時、リリース前の最終確認時に実行される。CI/CDパイプラインでは、すべてのコミットに対して自動実行される。

**主要な処理内容**：
1. test-reflection - リフレクション警告テストの実行
2. test-lib - libモジュールのユニットテスト実行
3. test-cli - cliモジュールのユニットテスト実行

**前後の処理との関連**：このバッチは最も包括的なテストタスクであり、lintタスク、ビルドタスクと並んでCI/CDの中核を担う。integration-testはこのバッチには含まれず、別途実行される。

**影響範囲**：ファイルシステムへの永続的な変更は行わない。テスト実行結果が標準出力に出力される。

## バッチ種別

テスト処理 / ユニットテスト統合

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（開発時）/ コミット毎（CI/CD） |
| 実行時刻 | 指定なし |
| 実行曜日 | 指定なし |
| 実行日 | 指定なし |
| トリガー | 手動（bb test）またはCI/CD |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| JDK | Java Development Kit がインストールされていること |
| Babashka | bb コマンドが利用可能であること |
| Clojure CLI | clojure コマンドが利用可能であること |
| 依存関係 | lib/deps.edn および cli/deps.edn に定義された依存関係が解決可能であること |

### 実行可否判定

特別な実行可否判定は行わない。前提条件が満たされていれば実行可能である。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | コマンドラインパラメータは不要 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| lib/test/**/*.clj | Clojureテストコード | libモジュールのテストファイル |
| cli/test/**/*.clj | Clojureテストコード | cliモジュールのテストファイル |
| lib/src/**/*.clj | Clojureソースコード | libモジュールのソースコード |
| cli/src/**/*.clj | Clojureソースコード | cliモジュールのソースコード |
| lib/deps.edn | EDN | libモジュールの依存関係定義 |
| cli/deps.edn | EDN | cliモジュールの依存関係定義 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | 各サブタスクのテスト実行結果 |
| 終了コード | 整数 | 0=全成功、1以上=いずれかで失敗 |

### 出力ファイル仕様

ファイル出力は行わない。

## 処理フロー

### 処理シーケンス

```
1. test-reflectionタスク実行
   └─ cliディレクトリでリフレクション警告チェック
   └─ 失敗時は即座に停止

2. test-libタスク実行
   └─ libディレクトリでユニットテスト実行
   └─ 失敗時は即座に停止

3. test-cliタスク実行
   └─ cliディレクトリでユニットテスト実行
   └─ 失敗時は非ゼロ終了コードで終了

4. 全タスク完了
   └─ 全成功時は終了コード0で終了
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[test-reflection実行]
    B --> C{成功?}
    C -->|No| D[非ゼロ終了コードで終了]
    C -->|Yes| E[test-lib実行]
    E --> F{成功?}
    F -->|No| D
    F -->|Yes| G[test-cli実行]
    G --> H{成功?}
    H -->|No| D
    H -->|Yes| I[終了コード0で終了]
```

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

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| N/A | N/A | N/A | N/A |

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

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1+ | リフレクション警告 | test-reflectionでリフレクション警告が検出 | 警告箇所に型ヒントを追加 |
| 1+ | テスト失敗 | test-lib/test-cliでテストがfail/error | テストコードまたは実装を修正 |
| - | 依存関係エラー | 必要なライブラリが見つからない | deps.edn を確認し依存関係を解決 |

### リトライ仕様

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

### 障害時対応

1. 失敗したサブタスクを特定（test-reflection / test-lib / test-cli）
2. 該当サブタスクのログから失敗原因を分析
3. 対象コードを修正
4. 失敗したサブタスク単体で再テスト
5. 全体テストで最終確認

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 約50ファイル、数百テストケース（全モジュール合計） |
| 目標処理時間 | 10分以内 |
| メモリ使用量上限 | JVMデフォルト |

## 排他制御

同一プロジェクトディレクトリでの同時実行は可能だが、テスト間で共有リソースがある場合は競合の可能性がある。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | 各サブタスク開始時 | サブタスク名 |
| 進捗ログ | テスト実行中 | 各テストケースの結果 |
| 終了ログ | 各サブタスク終了時 | テストサマリー |
| エラーログ | テスト失敗時 | 失敗したテストの詳細とスタックトレース |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 0以外 | CI/CDシステム |
| 処理時間 | 15分 | CI/CDシステム |

## 備考

- 実行順序の意図：
  1. test-reflection: GraalVMネイティブイメージ化に影響する問題を最初に検出
  2. test-lib: コア機能のテストを先に実行（最も重要かつテスト数が多い）
  3. test-cli: CLI固有の機能を最後にテスト（libに依存するため）
- dependsによる依存関係定義により、Babashkaが自動的に順次実行を行う
- 各サブタスクは独立して実行することも可能
- integration-testはこのバッチに含まれない（別途 bb integration-test で実行）
- pod-testもこのバッチに含まれない（別途 bb pod-test で実行）
