# テスト方針書

## 概要

本ドキュメントは、Laravel Framework 12.x のテスト方針を定義するものである。Laravel Frameworkはオープンソースのフルスタックウェブアプリケーションフレームワークであり、包括的なテスト基盤を提供している。本方針書では、フレームワーク自体のテストおよびフレームワークを利用するアプリケーションのテストに関する指針を定める。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 個々のクラス・メソッドの機能検証 | 開発者 |
| 結合テスト | コンポーネント間の連携動作検証 | 開発者 |
| システムテスト | HTTPリクエスト/レスポンスの統合検証 | 開発者・QA |
| 受入テスト | ビジネス要件の充足確認 | QA・ステークホルダー |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | HTTPテスト・データベーステスト・コンソールテスト等 | 開発時・CI実行時 |
| 性能テスト | レスポンス時間・スループットの検証 | リリース前・定期的 |
| セキュリティテスト | 認証・認可・脆弱性検証 | 開発時・リリース前 |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| ローカル開発環境 | 開発者によるテスト実行 | PHP 8.2以上、SQLite/MySQL/PostgreSQL |
| CI環境 | 自動テスト実行 | GitHub Actions、複数PHPバージョン対応 |
| ステージング環境 | リリース前検証 | 本番同等構成 |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| PHPUnit | テストフレームワーク | ^10.5.35 / ^11.5.3 / ^12.0.1 |
| Mockery | モッキングライブラリ | ^1.6.10 |
| Faker (fakerphp/faker) | テストデータ生成 | ^1.24 |
| ParaTest (brianium/paratest) | 並列テスト実行 | ^7.0 / ^8.0 |
| PHPStan | 静的解析 | ^2.0 |
| Laravel Pint | コードスタイル検証 | ^1.18 |
| Orchestra Testbench | Laravelパッケージテスト | ^10.9.0 |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 80%以上 |
| 分岐カバレッジ | 75%以上 |

## テストデータ

### Model Factory

Laravel Frameworkは`Illuminate\Database\Eloquent\Factories\Factory`クラスを通じて、テストデータの生成を標準化している。

- **Factory クラス**: モデルに対応するファクトリを定義し、テストデータを簡潔に生成
- **Sequence**: 連続的なテストデータのバリエーション生成をサポート
- **HasFactory トレイト**: モデルにファクトリ機能を統合
- **Faker 統合**: FakerPHP を通じたリアルなテストデータ生成

### データベーステスト支援機能

- **RefreshDatabase**: テスト間でデータベースをマイグレーションでリフレッシュ
- **DatabaseTransactions**: トランザクションベースのテスト分離
- **DatabaseMigrations**: マイグレーションを使用したスキーマ管理
- **DatabaseTruncation**: テーブルのトランケーションによるリセット
- **LazilyRefreshDatabase**: 遅延評価でのデータベースリフレッシュ

## 不具合管理

- **Issue Tracker**: GitHub Issues を使用
- **バグレポート形式**: 再現手順・期待動作・実際動作を明記
- **優先度分類**: Critical / High / Medium / Low の4段階
- **セキュリティ脆弱性**: 専用セキュリティポリシーに従い非公開で報告

## CI/CD連携

### GitHub Actions ワークフロー

Laravel Frameworkは GitHub Actions を使用して継続的インテグレーションを実施している。

- **テストマトリクス**: 複数のPHPバージョン（PHP 8.2以上）でテスト実行
- **コードスタイルチェック**: Laravel Pint による自動フォーマット検証
- **静的解析**: PHPStan による型安全性検証
- **並列テスト**: ParaTest を使用した高速なテスト実行

### テスト実行タイミング

- プルリクエスト作成時
- mainブランチへのプッシュ時
- リリースタグ作成時

## テストクラス構成

### コアテスティングモジュール (Illuminate\Testing)

| クラス/トレイト | 説明 |
| --- | --- |
| TestResponse | HTTPレスポンスのアサーション |
| AssertableJson | JSONレスポンスのフルーエントアサーション |
| PendingCommand | コンソールコマンドテスト |
| TestView | ビューのテスト |
| TestComponent | Bladeコンポーネントのテスト |
| ParallelTesting | 並列テスト管理 |
| ParallelRunner | ParaTest統合 |

### Foundation テスティング (Illuminate\Foundation\Testing)

| クラス/トレイト | 説明 |
| --- | --- |
| TestCase | 基底テストケースクラス |
| RefreshDatabase | データベースリフレッシュトレイト |
| DatabaseTransactions | トランザクショントレイト |
| WithFaker | Fakerインスタンス提供 |
| MakesHttpRequests | HTTPリクエストヘルパー |
| InteractsWithDatabase | データベースアサーション |
| InteractsWithAuthentication | 認証ヘルパー |
| InteractsWithSession | セッションヘルパー |
| InteractsWithConsole | コンソールテストヘルパー |
| InteractsWithViews | ビューテストヘルパー |
| InteractsWithExceptionHandling | 例外ハンドリング制御 |

### データベーステスト用Constraint

| クラス | 説明 |
| --- | --- |
| HasInDatabase | データ存在確認 |
| CountInDatabase | レコード数確認 |
| SoftDeletedInDatabase | 論理削除確認 |
| NotSoftDeletedInDatabase | 非論理削除確認 |
| SeeInOrder | 順序確認 |
| ArraySubset | 配列サブセット確認 |

## テスト実行方法

### 基本実行

```bash
# 全テスト実行
./vendor/bin/phpunit

# 特定テストスイート実行
./vendor/bin/phpunit --testsuite Unit

# 特定テストファイル実行
./vendor/bin/phpunit tests/Feature/ExampleTest.php
```

### 並列実行

```bash
# ParaTestによる並列実行
./vendor/bin/paratest

# プロセス数指定
./vendor/bin/paratest -p 4
```

### カバレッジ生成

```bash
# HTMLカバレッジレポート生成
./vendor/bin/phpunit --coverage-html coverage
```

## 備考

### PHP要件

- PHP 8.2以上が必須
- 必須拡張: ctype, filter, hash, mbstring, openssl, session, tokenizer

### テストに関する推奨事項

1. **Arrange-Act-Assert パターン**: テストを準備・実行・検証の3段階で構成
2. **単一責任**: 1テストケースで1つの振る舞いを検証
3. **独立性**: テスト間で状態を共有しない
4. **命名規則**: `test_` プレフィックスまたは `@test` アノテーションを使用
5. **データプロバイダ**: パラメータ化テストにはデータプロバイダを活用

### Mockery 使用指針

- テスト対象外の依存関係のみをモック化
- `shouldReceive()` で期待する呼び出しを定義
- `Mockery::close()` をtearDownで必ず呼び出し

### 並列テスト実行時の注意事項

- データベース接続は各プロセスで独立させる
- `ParallelTesting::token()` でプロセス識別子を取得可能
- テスト用データベースは `{database}_test_{token}` 形式で自動作成
