Laravel TDD ワークフロー
PHPUnit と Pest を使用した Laravel アプリケーション用のテスト駆動開発。80%+ カバレッジ(ユニット + フィーチャー)。
使用時機
- Laravel の新機能またはエンドポイント
- バグ修正またはリファクタリング
- Eloquent モデル、ポリシー、ジョブ、通知のテスト
- プロジェクトが PHPUnit を標準化していない限り、新しいテストには Pest を優先
仕組み
RED-GREEN-REFACTOR サイクル
- テスト失敗を書く
- 最小限の変更を実装して合格させる
- テストを緑に保ちながらリファクタリング
テスト層
- ユニット:純粋な PHP クラス、値オブジェクト、サービス
- フィーチャー:HTTP エンドポイント、認証、バリデーション、ポリシー
- 統合:データベース + キュー + 外部バウンダリー
スコープに基づいて層を選択:
- ユニットテストを純粋なビジネスロジックとサービスに使用。
- フィーチャーテストを HTTP、認証、バリデーション、レスポンス形状に使用。
- 統合テストを DB/キュー/外部サービスを一緒に検証するときに使用。
データベース戦略
RefreshDatabaseほとんどのフィーチャー/統合テスト用(テスト実行ごとにマイグレーションを 1 回実行し、次に各テストをトランザクション内でラップ;メモリ内データベースは各テストごとに再マイグレーションする可能性がある)DatabaseTransactionsスキーマがすでにマイグレーションされており、テストごとのロールバックのみが必要なときDatabaseMigrationsすべてのテストで完全な migrate/fresh が必要なとき、またはコストを負担できるとき
RefreshDatabase をデータベースに触れるテストのデフォルトとして使用:トランザクション サポート付きデータベースの場合、マイグレーション ステップ フラグを使用して テスト実行ごとに 1 回実行し、次に各テストをトランザクション内でラップします;:memory: SQLite または非トランザクションの接続では、各テストの前にマイグレーションします。スキーマがすでにマイグレーションされており、テストごとのロールバックのみが必要なときは DatabaseTransactions を使用します。
テストフレームワーク選択
- 新しいテストの場合は Pest をデフォルトで使用。
- PHPUnit はプロジェクトがすでにそれを標準化している、またはPHPUnit 固有のツールが必要なときのみ使用。
例
PHPUnit 例
フィーチャーテスト例(HTTP レイヤー)
Pest 例
フィーチャーテスト Pest 例(HTTP レイヤー)
ファクトリーと状態
- テストデータにはファクトリーを使用
- エッジケース(アーカイブ済み、管理者、トライアル)の状態を定義
データベーステスト
- クリーンな状態には
RefreshDatabaseを使用 - テストを隔離して決定論的に保つ
- 手動クエリより
assertDatabaseHasを優先
永続性テスト例
副作用のためのフェイク
Bus::fake()ジョブ用Queue::fake()キュー作業用Mail::fake()とNotification::fake()通知用Event::fake()ドメインイベント用
認証テスト(Sanctum)
HTTP と外部サービス
Http::fake()を使用して外部 API を隔離Http::assertSent()で送信ペイロードをアサート
カバレッジターゲット
- ユニット + フィーチャーテストで 80%+ カバレッジを実施
- CI では
pcovまたはXDEBUG_MODE=coverageを使用
テストコマンド
php artisan testvendor/bin/phpunitvendor/bin/pest
テスト設定
phpunit.xmlを使用してDB_CONNECTION=sqliteとDB_DATABASE=:memory:を設定して高速テスト- テストは dev/prod データに触れないように別の env を保つ
認可テスト
Inertia フィーチャーテスト
Inertia.js 使用時、Inertia テスティングヘルパーでコンポーネント名とプロップをアサート。
生の JSON アサーションより assertInertia を優先して、テストを Inertia レスポンスに合わせておく。


