Skip to main content

はじめに

Laravelには、データベースを使う機能を安全かつ高速に検証するための仕組みが標準で用意されています。データベースリセット用トレイト、モデルファクトリ、シーダー、専用アサーションを組み合わせることで、壊れにくいテストを作成できます。 まずは RefreshDatabase を使うのが基本です。多くのケースで、完全リセットより高速にテストの独立性を保てます。

各テスト後のデータベースリセット

前のテストデータが次のテストに影響しないように、Laravelのデータベースリセット用トレイトを利用します。
RefreshDatabase は、スキーマが最新かどうかを判定します。最新ならトランザクションでテストを実行し、最新でなければ先にマイグレーションを実行します。 トランザクション方式ではなく、毎回完全にリセットしたい場合は次のトレイトを使います。

モデルファクトリ

テスト前にデータを準備する際、モデルファクトリを使うとEloquentモデルを簡潔に生成できます。 ファクトリ定義・state・リレーションの詳細は Eloquentファクトリ を参照してください。

シーダーの実行

テスト中にデータを投入したい場合は seed() を使います。引数なしなら DatabaseSeeder、引数ありなら特定シーダー(または配列)を実行できます。
RefreshDatabase を使う全テストで毎回自動シードしたい場合は、基底のテストクラスに #[Seed] 属性を付けます。
特定シーダーのみを自動実行したい場合は #[Seeder(...)] を使います。

利用可能なアサーション

Laravelには、Pest / PHPUnitのどちらでも使えるデータベース専用アサーションが用意されています。

assertDatabaseCount

テーブル内のレコード件数が期待値と一致することを確認します。

assertDatabaseEmpty

テーブルが空であることを確認します。

assertDatabaseHas

指定した条件に一致するレコードが存在することを確認します。

assertDatabaseMissing

指定した条件に一致するレコードが存在しないことを確認します。

assertSoftDeleted

対象のEloquentモデルがソフトデリート済みであることを確認します。

assertNotSoftDeleted

対象のEloquentモデルがソフトデリートされていないことを確認します。

assertModelExists

指定したモデル(またはモデルコレクション)がDB上に存在することを確認します。

assertModelMissing

指定したモデル(またはモデルコレクション)がDB上に存在しないことを確認します。

expectsDatabaseQueryCount

テスト冒頭で、実行されるデータベースクエリの総数を厳密に指定します。実際の実行回数が一致しない場合は失敗します。
最終更新日 2026年5月29日