# テスト方針書

## 概要

本ドキュメントは、Chatwootプロジェクトにおけるテスト方針を定義します。Chatwootは、Ruby on Rails（バックエンド）とVue.js（フロントエンド）で構成されるオープンソースのカスタマーエンゲージメントプラットフォームであり、バックエンドとフロントエンド双方で包括的なテスト戦略を採用しています。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 個々のモデル、サービス、ヘルパー、コンポーザブル、ストアモジュールの正確性を検証 | 開発者 |
| 結合テスト | コントローラ、API、コンポーネント間の連携を検証 | 開発者 |
| システムテスト | アプリケーション全体の動作検証（E2Eテスト） | QAエンジニア/開発者 |
| 受入テスト | ビジネス要件の充足を確認 | プロダクトオーナー/QAエンジニア |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | モデル、サービス、コントローラ、API、UIコンポーネントの機能検証 | プルリクエスト時、CI/CDパイプライン |
| 性能テスト | レスポンス時間、スループットの検証 | 本番リリース前、定期実行 |
| セキュリティテスト | 脆弱性検出（Brakeman静的解析、依存関係監査） | CI/CDパイプライン |
| 静的解析 | コード品質・スタイルチェック（RuboCop、ESLint） | プルリクエスト時、CI/CDパイプライン |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| ローカル開発環境 | 開発者による単体・結合テスト実行 | Ruby 3.4.4、Node.js 24.x、PostgreSQL（pgvector）、Redis |
| CI環境（GitHub Actions） | 自動テスト実行、コードレビュー前の品質担保 | ubuntu-latest、PostgreSQL 16（pgvector/pgvector:pg16）、Redis Alpine |
| テスト専用データベース | テスト実行用の分離されたデータベース | `chatwoot_test`（PostgreSQL） |

## テストツール

### バックエンド（Ruby/Rails）

| ツール | 用途 | バージョン |
| --- | --- | --- |
| RSpec | テストフレームワーク | >= 6.1.5 |
| FactoryBot | テストデータ生成 | >= 6.4.3 |
| Shoulda Matchers | マッチャー拡張 | 最新 |
| WebMock | HTTP通信モック | 最新 |
| Pundit RSpec | ポリシーテスト | 最新 |
| Sidekiq Testing | ジョブテスト | 最新 |
| Test Prof | テストプロファイリング・最適化 | 最新 |
| SimpleCov | コードカバレッジ測定 | >= 0.21 |
| Database Cleaner | テストデータベースクリーニング | 最新 |
| RuboCop | Ruby静的解析 | 最新 |
| Brakeman | セキュリティ静的解析 | 最新 |
| Bundle Audit | 依存関係脆弱性チェック | 最新 |
| Climate Control | 環境変数モック | 最新 |
| Mock Redis | Redisモック | 最新 |

### フロントエンド（Vue.js/JavaScript）

| ツール | 用途 | バージョン |
| --- | --- | --- |
| Vitest | テストフレームワーク | 3.0.5 |
| Vue Test Utils | Vueコンポーネントテスト | >= 2.4.6 |
| jsdom | ブラウザ環境シミュレーション | >= 27.2.0 |
| fake-indexeddb | IndexedDBモック | >= 6.0.0 |
| ESLint | JavaScript/Vue静的解析 | >= 8.57.0 |
| Prettier | コードフォーマッタ | >= 3.3.3 |
| Vitest Coverage V8 | コードカバレッジ測定 | 3.0.5 |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| バックエンド行カバレッジ | 80%以上（推奨） |
| フロントエンド行カバレッジ | 70%以上（推奨） |
| 分岐カバレッジ | 60%以上（推奨） |

## テストデータ

### バックエンド

- **FactoryBot**を使用してテストデータを生成
- `spec/factories/`ディレクトリに80以上のファクトリ定義
- 主要エンティティ（Account、User、Conversation、Message、Contact、Inbox等）のファクトリを完備
- **test-profのlet_it_be/before_all**を活用してテストデータの重複生成を最小化
- トランザクショナルテストにより各テスト後のデータベースロールバックを保証

### フロントエンド

- モックデータを各テストファイル内で定義
- Vue Test Utilsのモック機能を活用
- fake-indexeddbによるIndexedDBのモック

## 不具合管理

- **GitHub Issues**を使用して不具合を追跡
- **プルリクエスト**でコードレビューとCI検証を実施
- テスト失敗時のログとアーティファクト（`log/test.log`、`tmp/rspec_results.json`）を保存

## CI/CD連携

### GitHub Actionsワークフロー

| ワークフロー | トリガー | 目的 |
| --- | --- | --- |
| `run_foss_spec.yml` | push（develop/master）、pull_request | バックエンドテスト・Lint実行 |
| `frontend-fe.yml` | push/PR（develop） | フロントエンドテスト・カバレッジ |
| `run_mfa_spec.yml` | pull_request | MFA関連テスト専用 |
| `test_docker_build.yml` | PR（develop/master） | Dockerビルド検証 |
| `size-limit.yml` | PR | バンドルサイズチェック |

### バックエンドテスト並列実行

- **16並列**でRSpecテストを分散実行
- ラウンドロビン方式でspecファイルを分配
- テスト結果をJSON形式でアーティファクトとして保存
- 失敗時はログフォルダも保存

### 実行フロー

1. **Lint（並列）**
   - バックエンド：`bundle exec rubocop --parallel`
   - フロントエンド：`pnpm run eslint`

2. **テスト（並列）**
   - バックエンド：`bundle exec rspec`（16ノード並列）
   - フロントエンド：`pnpm run test:coverage`

3. **アーティファクト保存**
   - テスト結果（JSON）
   - 失敗時のログ

### ローカル実行コマンド

```bash
# バックエンドテスト
bundle exec rspec                                    # 全テスト実行
bundle exec rspec spec/path/to/file_spec.rb          # 特定ファイル
bundle exec rspec spec/path/to/file_spec.rb:LINE     # 特定行

# フロントエンドテスト
pnpm test                    # 全テスト実行（ウォッチなし）
pnpm test:watch              # ウォッチモード
pnpm test:coverage           # カバレッジ付き

# Lint
bundle exec rubocop -a       # Ruby Lint（自動修正）
pnpm eslint                  # JavaScript/Vue Lint
pnpm eslint:fix              # JavaScript/Vue Lint（自動修正）
```

## 備考

### テストディレクトリ構成

#### バックエンド（`spec/`）

```
spec/
├── models/           # モデルテスト
├── controllers/      # コントローラテスト
├── services/         # サービステスト
├── jobs/             # ジョブテスト
├── mailers/          # メーラーテスト
├── policies/         # ポリシーテスト
├── presenters/       # プレゼンターテスト
├── builders/         # ビルダーテスト
├── finders/          # ファインダーテスト
├── lib/              # ライブラリテスト
├── requests/         # リクエストテスト（API統合テスト）
├── integration/      # 統合テスト
├── channels/         # ActionCableチャネルテスト
├── mailboxes/        # ActionMailboxテスト
├── enterprise/       # Enterprise版専用テスト
├── factories/        # FactoryBot定義
├── support/          # テストヘルパー
└── fixtures/         # フィクスチャ
```

#### フロントエンド（`app/javascript/**/specs/`）

```
app/javascript/
├── dashboard/
│   ├── composables/spec/      # Composablesテスト
│   ├── components/specs/      # コンポーネントテスト
│   ├── store/modules/specs/   # Vuexストアテスト
│   └── helper/specs/          # ヘルパーテスト
├── widget/
│   ├── composables/specs/
│   ├── store/modules/specs/
│   └── helpers/specs/
├── shared/
│   ├── composables/specs/
│   ├── components/specs/
│   └── helpers/specs/
└── portal/specs/
```

### テスト数

- バックエンド：約662ファイル
- フロントエンド：約339ファイル
- 合計：約1,001ファイル

### Enterprise版テスト

- `spec/enterprise/`ディレクトリにEnterprise専用テストを配置
- CI実行時はEnterprise版コードを除外して実行（FOSS版テスト）
- Enterprise版はプライベートリポジトリで別途テスト

### テスト最適化

- **test-prof**を使用してテストパフォーマンスを最適化
- `let_it_be`/`before_all`によるセットアップコストの削減
- トランザクショナルフィクスチャによる高速ロールバック
- WebMockによる外部HTTP通信のブロック
- Vitestの`threads`プールによるフロントエンドテストの並列実行
