# テスト方針書

## 概要

本ドキュメントは、Ruby on Railsフレームワーク本体のテスト方針を定義する。Railsは12のサブフレームワーク（Active Support、Active Model、Active Record、Action View、Action Pack、Active Job、Action Mailer、Action Cable、Active Storage、Action Mailbox、Action Text、Railties）で構成され、各フレームワークが独自のテストスイートを持つ。すべてのテストはMinitestをベースとして実行され、CI/CDパイプラインはBuildkiteを使用している。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 各モジュール・クラスの個別機能の検証 | 各フレームワーク開発者 |
| 結合テスト | フレームワーク間の連携・統合動作の検証 | コア開発チーム |
| 分離テスト（Isolated Test） | 各テストファイルを独立したプロセスで実行し、テスト間の依存関係を排除 | CI/自動化 |
| インテグレーションテスト | Active Job/Active Recordなどのアダプタ間統合テスト | コア開発チーム |
| システムテスト | Capybara/Selenium WebDriverを使用したブラウザベースのE2Eテスト | アプリケーション開発者 |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | 各フレームワークの機能が仕様通りに動作することを検証 | コミット時・PR時 |
| 性能テスト | 暗号化処理のパフォーマンステスト（Active Recordの`encryption/performance`） | 必要に応じて |
| セキュリティテスト | Brakeman、bundler-auditによる静的解析 | Railtiesテスト実行時 |
| 静的コード解析 | RuboCop（rubocop-minitest、rubocop-performanceを含む）による品質チェック | 開発時・CI時 |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| ローカル開発環境 | 開発者による単体テスト実行 | Ruby 3.4+、各データベースアダプタ |
| Buildkite CI | 自動テスト・継続的インテグレーション | 並列実行対応、複数Ruby/DB環境 |
| GitHub Actions | 補助的なCI（releaser tests、devcontainer smoke test等） | ubuntu-latest |
| Devcontainer | コンテナ化された開発環境でのスモークテスト | Docker、各種DB（SQLite3、PostgreSQL、MySQL、Trilogy） |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| Minitest | 主要テストフレームワーク | ~> 6.0 |
| minitest-mock | モック機能 | - |
| minitest-retry | テストリトライ機能 | - |
| Capybara | システムテスト・ブラウザ操作 | >= 3.39 |
| Selenium WebDriver | ブラウザ自動化 | >= 4.20.0 |
| RuboCop | 静的コード解析 | 1.79.2 |
| rubocop-minitest | Minitestスタイルチェック | - |
| rubocop-performance | パフォーマンス関連チェック | - |
| rubocop-rails | Rails固有スタイルチェック | - |
| Brakeman | セキュリティ静的解析 | - |
| bundler-audit | 依存関係セキュリティチェック | - |
| WebMock | HTTPリクエストのモック | - |
| stackprof | パフォーマンスプロファイリング（MRI Ruby） | - |
| debug | デバッガー | >= 1.1.0 |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 明示的な目標値は設定されていない（各フレームワークの包括的テストを重視） |
| 分岐カバレッジ | 明示的な目標値は設定されていない |

備考: Railsフレームワークは包括的なテストスイートを持ち、主要な機能パスはテストでカバーされている。新機能追加時はテストの追加が必須とされている。

## テストデータ

### テストデータの準備方針

- **Fixturesの使用**: 各フレームワークの`test/fixtures`ディレクトリにテストデータを配置
- **ファクトリパターン**: 動的なテストデータ生成が必要な場合は各テスト内で作成
- **データベース環境**:
  - Active Recordテスト用に`arunit`と`arunit2`の2つのテストデータベースを使用
  - MySQL、PostgreSQL、SQLite3、Trilogyの各アダプタ用にテストDBを構築
- **データベース構築コマンド**:
  - `rake db:mysql:build` - MySQLテストDB構築
  - `rake db:postgresql:build` - PostgreSQLテストDB構築
  - `rake db:create` - 全DBの構築

## 不具合管理

### 不具合報告

- **GitHub Issues**: バグ報告はGitHub Issuesで管理
- **バグレポートテンプレート**: 各フレームワーク用のバグレポートテンプレートを`guides/bug_report_templates/`に用意
  - `active_record.rb` - Active Record関連
  - `action_controller.rb` - Action Pack関連
  - `action_view.rb` - Action View関連
  - `active_job.rb` - Active Job関連
  - `active_storage.rb` - Active Storage関連
  - `action_mailer.rb` - Action Mailer関連
  - `action_mailbox.rb` - Action Mailbox関連
  - `generic.rb` - その他

### セキュリティ脆弱性

- セキュリティ関連のバグはGitHub Issuesではなく、[セキュリティポリシー](https://rubyonrails.org/security)に従って報告

## CI/CD連携

### Buildkite

- **メインCI/CD**: すべてのプルリクエストとプッシュでテストを自動実行
- **並列実行**: `BUILDKITE_PARALLEL_JOB_COUNT`と`BUILDKITE_PARALLEL_JOB`環境変数による並列テスト分散
- **プロファイリング**: CI環境では`--profile`オプションでテスト実行時間を計測

### GitHub Actions

以下のワークフローが設定されている：

| ワークフロー | トリガー | 目的 |
| --- | --- | --- |
| `rails_releaser_tests.yml` | `tools/releaser/**`への変更時 | リリースツールのテスト |
| `devcontainer-smoke-test.yml` | プッシュ時 | Devcontainer環境でのスモークテスト（SQLite3、PostgreSQL、MySQL、Trilogy） |
| `rail_inspector.yml` | - | Rail Inspectorツールのテスト |

### テスト実行コマンド

```bash
# 全フレームワークのテスト実行
rake test

# 全フレームワークの分離テスト実行
rake test:isolated

# 特定フレームワークのテスト
rake actionpack:test
rake activerecord:test

# Active Recordの特定アダプタテスト
rake activerecord:mysql2:test
rake activerecord:postgresql:test
rake activerecord:sqlite3:test
rake activerecord:trilogy:test

# Active Jobのアダプタ別テスト
rake activejob:async:test
rake activejob:inline:test
rake activejob:resque:test

# スモークテスト（簡易テスト）
rake smoke
rake smoke[actionpack,true]  # 特定フレームワーク・分離テストモード
```

### 環境変数

| 変数名 | 説明 |
| --- | --- |
| `RAILS_MINITEST_PLUGIN` | Minitest Railsプラグインの有効化 |
| `MT_CPU` | 並列テストのワーカー数（デフォルト: 4） |
| `ARCONN` | Active Recordの接続アダプタ指定 |
| `AJ_ADAPTER` | Active Jobのアダプタ指定 |
| `AJ_INTEGRATION_TESTS` | Active Job統合テストの有効化 |
| `CI` | CI環境フラグ（プロファイリング有効化） |
| `BUILDKITE` | Buildkite環境フラグ |
| `TEST_DIR` / `TEST_DIRS` | テスト対象ディレクトリの指定 |
| `TESTOPTS` | 追加のテストオプション |

## 備考

### テスト並列化

- Active Supportの`parallelize`メソッドにより、テストはデフォルトで並列実行される
- MRI Rubyではforkベースの並列化、それ以外ではスレッドベースの並列化を使用
- `PROCESS_COUNT`（または`MT_CPU`）でワーカー数を制御可能

### 分離テスト（Isolated Test）

- 各テストファイルを独立したRubyプロセスで実行
- テスト間の状態汚染を防止し、並列実行時の問題を早期発見
- `test:isolated`タスクで実行可能
- Active Storageは分離テストをサポートしていない

### 非推奨機能の検出

- テスト環境では`deprecator.behavior = :raise`が設定されており、非推奨機能の使用時に例外が発生
- これにより非推奨APIの使用を早期に検出可能

### JRuby対応

- JRuby環境では`--dev`オプションを使用して高速化
- 一部アダプタ（queue_classic）はJRubyでは無効化
- JRuby用の専用テストタスク（`test_jdbcmysql`、`test_jdbcsqlite3`、`test_jdbcpostgresql`）が存在

### フレームワーク一覧

テスト対象となる12のサブフレームワーク：

1. Active Support - Rubyユーティリティ・拡張
2. Active Model - モデル層の基盤
3. Active Record - ORM（Object-Relational Mapping）
4. Action View - ビューテンプレート
5. Action Pack - コントローラ・ルーティング
6. Active Job - バックグラウンドジョブ
7. Action Mailer - メール送信
8. Action Cable - WebSocket
9. Active Storage - ファイルストレージ
10. Action Mailbox - メール受信
11. Action Text - リッチテキストコンテンツ
12. Railties - Railsエンジン・初期化
