# テスト方針書

## 概要

本ドキュメントは、Fizzyプロジェクトのテスト方針を定義するものである。FizzyはRuby on Rails（メインブランチ追従）で構築されたWebアプリケーションであり、Minitestをベースとした標準的なRailsテスト構成を採用している。SQLiteおよびMySQLの両データベースアダプタに対応し、CI/CDパイプラインにおいて並列実行による効率的なテスト実行を実現している。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | モデル、ヘルパー、ジョブ、メーラー等の個別コンポーネントの動作検証 | 開発者 |
| 結合テスト | コントローラとビューの統合、リクエスト/レスポンスの検証 | 開発者 |
| システムテスト | ブラウザを介したE2Eテスト、ユーザーワークフローの検証 | 開発者/QA |
| 受入テスト | 本番環境相当での機能確認 | QA/ステークホルダー |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | ビジネスロジック、CRUD操作、認証/認可の検証 | 開発時・CI |
| 性能テスト | レスポンスタイム、並列処理能力の検証 | リリース前 |
| セキュリティテスト | Brakeman静的解析、依存関係監査（bundler-audit、importmap audit） | PR作成時・CI |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| ローカル開発環境 | 開発者による日常的なテスト実行 | SQLite、Ruby 3.4.7 |
| CI環境（SQLite） | プルリクエスト時の自動テスト | Ubuntu、SQLite、GitHub Actions |
| CI環境（MySQL） | 本番データベース互換性検証 | Ubuntu、MySQL 8.0、GitHub Actions |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| Minitest | テストフレームワーク | Rails標準（7.x相当） |
| Capybara | システムテスト用ブラウザ操作 | Gemfile管理 |
| Selenium WebDriver | ChromeヘッドレスによるE2Eテスト | Gemfile管理 |
| WebMock | 外部HTTPリクエストのモック | Gemfile管理 |
| VCR | HTTP通信記録・再生 | Gemfile管理 |
| Mocha | モック/スタブライブラリ | Gemfile管理 |
| Brakeman | セキュリティ静的解析 | Gemfile管理 |
| bundler-audit | Gemの脆弱性チェック | Gemfile管理 |
| Faker | テストデータ生成 | Gemfile管理 |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 明示的な数値目標なし（現状ベース） |
| 分岐カバレッジ | 明示的な数値目標なし（現状ベース） |

備考: 現在のコードベースにはカバレッジ計測ツール（SimpleCov等）の設定が確認されていない。カバレッジ目標の設定は今後の検討事項である。

## テストデータ

- **フィクスチャ**: `test/fixtures/` ディレクトリに32個のYAMLフィクスチャファイルを配置
- **ファクトリ**: フィクスチャベースのテストデータ管理（FactoryBotは不使用）
- **Faker**: 動的なテストデータ生成に使用
- **UUIDv7**: 決定論的なフィクスチャID生成により、ソート順の一貫性を保証
- **テストヘルパー**: `test/test_helpers/` に9種類の専用ヘルパーモジュールを配置
  - `SessionTestHelper`: 認証関連のテストサポート
  - `VcrTestHelper`: HTTP通信記録・再生の自動化
  - `CardTestHelper`, `CachingTestHelper`, `ActionTextTestHelper` 等

## 不具合管理

- **課題追跡**: GitHubのIssue機能を活用（推定）
- **プルリクエスト**: CIパイプラインでのテスト失敗時はマージ不可
- **セキュリティ**: Brakemanによる警告は即座にエラーとして扱う（`--exit-on-warn --exit-on-error`）

## CI/CD連携

### GitHub Actions ワークフロー構成

| ワークフロー | トリガー | 内容 |
| --- | --- | --- |
| `ci-oss.yml` | プルリクエスト（外部リポジトリ） | OSSモードでのテスト実行 |
| `ci-saas.yml` | プッシュ | OSS + SaaSモードでのテスト実行 |
| `ci-checks.yml` | プルリクエスト | Lint、セキュリティチェック、Gemfile同期確認 |
| `test.yml` | 他ワークフローから呼び出し | テストマトリクス実行（SQLite/MySQL） |

### テスト実行マトリクス

```yaml
strategy:
  matrix:
    include:
      - mode: SQLite
        db_adapter: sqlite
      - mode: MySQL
        db_adapter: mysql
```

### 並列実行設定

- **ワーカー数**: CPUコア数に応じた自動スケーリング
- **ワークスティーリング**: 有効（`WORK_STEALING`環境変数で制御可能）
- **テストファイル数**: 218ファイル
  - モデルテスト: 94ファイル
  - コントローラテスト: 96ファイル
  - システムテスト: 1ファイル（スモークテスト）
  - 統合テスト: 2ファイル
  - メーラーテスト: 6ファイル
  - ジョブテスト: 5ファイル
  - ヘルパーテスト: 6ファイル

### セキュリティチェック（ci-checks.yml）

1. **Gemfile drift チェック**: `bin/bundle-drift check`
2. **Gem脆弱性監査**: `bin/bundler-audit check --update`
3. **Importmap監査**: `bin/importmap audit`
4. **静的セキュリティ解析**: `bin/brakeman --quiet --no-pager --exit-on-warn --exit-on-error`
5. **Lint**: `bin/rubocop`

## 備考

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

```bash
# 全テスト実行
bin/rails test

# システムテスト実行
bin/rails test:system

# ブラウザ表示付きシステムテスト
SYSTEM_TESTS_BROWSER=1 bin/rails test:system
```

### データベース設定

- **SQLite**: デフォルトのローカル開発用
- **MySQL 8.0**: CI環境および本番環境互換性テスト用
- **環境変数**: `DATABASE_ADAPTER`でアダプタを切り替え

### マルチテナント対応

- OSS版とSaaS版で異なるテスト設定（`SAAS`環境変数で切り替え）
- SaaS版は追加のGemfile（`Gemfile.saas`）を使用
- マルチテナントモードのテスト: `with_multi_tenant_mode`ヘルパー

### VCR設定

- **カセット格納先**: `test/vcr_cassettes`
- **リクエストマッチング**: method, uri, body（タイムスタンプ正規化対応）
- **機密情報フィルタ**: OpenAI APIキー等を自動マスク
