はじめに
Laravelには、データベースを使う機能を安全かつ高速に検証するための仕組みが標準で用意されています。データベースリセット用トレイト、モデルファクトリ、シーダー、専用アサーションを組み合わせることで、壊れにくいテストを作成できます。 まずはRefreshDatabase を使うのが基本です。多くのケースで、完全リセットより高速にテストの独立性を保てます。
各テスト後のデータベースリセット
前のテストデータが次のテストに影響しないように、Laravelのデータベースリセット用トレイトを利用します。RefreshDatabase は、スキーマが最新かどうかを判定します。最新ならトランザクションでテストを実行し、最新でなければ先にマイグレーションを実行します。
トランザクション方式ではなく、毎回完全にリセットしたい場合は次のトレイトを使います。
| トレイト | 挙動 | 使いどころ |
|---|---|---|
RefreshDatabase | スキーマが最新ならトランザクション、必要時のみマイグレーション | 通常はこれを第一候補にする |
DatabaseMigrations | 各テストごとにマイグレーションを実行 | 毎回マイグレーションのライフサイクルを通したい場合 |
DatabaseTruncation | テーブルをTRUNCATEして初期化 | トランザクションが適さない環境で全件クリアしたい場合 |
モデルファクトリ
テスト前にデータを準備する際、モデルファクトリを使うとEloquentモデルを簡潔に生成できます。 ファクトリ定義・state・リレーションの詳細は Eloquentファクトリ を参照してください。シーダーの実行
テスト中にデータを投入したい場合はseed() を使います。引数なしなら DatabaseSeeder、引数ありなら特定シーダー(または配列)を実行できます。
RefreshDatabase を使う全テストで毎回自動シードしたい場合は、基底のテストクラスに #[Seed] 属性を付けます。
#[Seeder(...)] を使います。