メインコンテンツへスキップ

はじめに

Laravelは、HTTPリクエストをシミュレートしてレスポンスを検証するための、豊富なAPIを提供しています。 実際のHTTPサーバーを立てることなく、アプリケーションへのリクエストをテスト内で再現できます。
get() メソッドはアプリケーションに GET リクエストを送り、assertStatus() は返ってきたレスポンスのHTTPステータスコードを検証します。
テスト実行中はCSRFミドルウェアが自動的に無効になります。テストで明示的に無効化する必要はありません。

リクエストの作成

テスト内では getpostputpatchdelete メソッドを使ってリクエストを送れます。 これらのメソッドはネットワークリクエストを実際には発行せず、アプリケーション内部でシミュレートします。 返り値は Illuminate\Testing\TestResponse のインスタンスで、様々なアサーションメソッドを提供します。
1つのテストメソッド内では、基本的に1つのリクエストのみ送ることを推奨します。複数のリクエストを同一テスト内で実行すると予期しない動作が発生することがあります。

リクエストヘッダーのカスタマイズ

withHeaders() メソッドを使ってリクエストのヘッダーをカスタマイズできます。

クッキー

withCookie() または withCookies() メソッドでリクエスト前にクッキー値を設定できます。

セッションと認証

withSession() メソッドを使ってリクエスト前にセッションデータを設定できます。
actingAs() メソッドで認証ユーザーとしてリクエストを送れます。モデルファクトリーと組み合わせて使います。
actingAs() の第2引数にガード名を渡すと、そのガードで認証されます。テストの間はそのガードがデフォルトになります。
未認証状態でリクエストしたい場合は actingAsGuest() を使います。

レスポンスのデバッグ

テスト中にレスポンスの内容を確認したい場合は dumpdumpHeadersdumpSession メソッドを使います。
実行を停止したい場合は ddddHeadersddBodyddJsonddSession メソッドを使います。

例外のテスト

特定の例外がスローされることをテストするには、Exceptions ファサードを使います。
例外がスローされなかったことを確認するには assertNotReportedassertNothingReported を使います。
例外ハンドリングを無効にしてリクエストを送るには withoutExceptionHandling() を使います。
クロージャ内のコードが例外をスローするかテストするには assertThrows() を使います。
例外がスローされないことを確認するには assertDoesntThrow() を使います。

JSON APIのテスト

LaravelはJSON APIのテストのためのヘルパーを多数提供しています。 jsongetJsonpostJsonputJsonpatchJsondeleteJsonoptionsJson メソッドを使ってJSONリクエストを送れます。
JSONレスポンスのデータには配列変数としてアクセスできます。
assertJson() はレスポンスを配列に変換し、指定した配列がJSONレスポンスの中に含まれているかを検証します。JSONに他のプロパティが存在していても、指定したフラグメントが含まれていればテストは通過します。

完全一致のアサーション

assertExactJson() を使うと、返却されたJSONと指定した配列が完全に一致することを検証できます。

JSONパスのアサーション

assertJsonPath() を使って、指定したパスにあるデータを検証できます。
クロージャを渡してより柔軟に検証することもできます。

フルーエントなJSONテスト

assertJson() にクロージャを渡すと、AssertableJson インスタンスを使ってフルーエントにアサーションを記述できます。
etc() メソッドはアサーション対象以外のプロパティが存在することを許可します。etc() を使わない場合、アサーションしていないプロパティが存在するとテストが失敗します。これにより意図せず機密情報をレスポンスに含めてしまうことを防ぎます。
属性の存在・不在を確認するには has()missing() を使います。
複数の属性をまとめて確認するには hasAll()missingAll() を使います。

JSONコレクションのアサーション

ルートが複数のアイテムを含むJSONレスポンスを返す場合、has() メソッドでアイテム数やコレクションの中身を検証できます。
すべてのアイテムに同じアサーションを適用するには each() を使います。

JSONの型アサーション

whereType()whereAllType() を使ってプロパティの型を検証できます。
| 文字で複数の型を指定することもできます。いずれかの型に一致すればアサーションは通過します。
利用可能な型は stringintegerdoublebooleanarraynull です。

認証テスト

actingAs() を使って認証されたユーザーとしてリクエストを送れます。
特定のガードで認証するには第2引数にガード名を指定します。

ユーザー登録フローのテスト例

実際のユーザー登録エンドポイントをテストする例です。

セッションのテスト

withSession() でセッションデータを事前にセットしてリクエストを送れます。 assertSessionHas() でセッションに値が存在するかを検証できます。

セッションアサーションの一覧

ファイルアップロードのテスト

Illuminate\Http\UploadedFile クラスの fake() メソッドを使って、ダミーのファイルや画像を生成できます。 Storage ファサードの fake() メソッドと組み合わせることで、ファイルアップロードを簡単にテストできます。
ファイルが存在しないことを確認するには assertMissing() を使います。

ダミーファイルのカスタマイズ

画像のサイズやファイルサイズを指定できます。バリデーションルールのテストに便利です。

ビューのテスト

HTTPリクエストをシミュレートせずにビューを直接レンダリングしてテストできます。 view() メソッドはビュー名とオプションでデータの配列を受け取り、Illuminate\Testing\TestView のインスタンスを返します。
TestView クラスでは以下のアサーションメソッドが使えます。 レンダリングされたビューの内容を文字列として取得するには、TestView インスタンスを文字列にキャストします。
バリデーションエラーをビューに渡すには withViewErrors() を使います。

コンポーネントのテスト

blade() メソッドを使って生のBladeテンプレート文字列をレンダリングできます。
component() メソッドを使ってBladeコンポーネントをレンダリングできます。Illuminate\Testing\TestComponent のインスタンスを返します。

レスポンスアサーション一覧

Illuminate\Testing\TestResponse クラスが提供する主要なアサーションメソッドです。

HTTPステータス

リダイレクト

コンテンツ

JSON

ヘッダーとクッキー

ビュー

バリデーション

TDDを実践するためのポイント

HTTPテストはTDD(テスト駆動開発)と相性が抜群です。以下のポイントを意識するとより効果的です。
HTTPテストは tests/Feature/ ディレクトリに作成します。アプリケーションの外から見た動作(リクエスト→レスポンス)を最初に定義することで、実装すべき機能が明確になります。
データベースを使うテストでは RefreshDatabase トレイトを使いましょう。各テスト後にデータベースがリセットされ、テスト間でのデータ干渉を防げます。テストの独立性を保つことで、実行順序に依存しない安定したテストスイートが構築できます。
User::factory()->create() のようなモデルファクトリーを使うと、テストデータの作成が簡単になります。特定の状態を持つモデルを作成するためにファクトリーの状態(state)を定義しておくと、テストの可読性が向上します。
1つのテストメソッドではできるだけ1つのことを検証しましょう。テストが失敗したときに原因が特定しやすくなります。「Arrange(準備)→ Act(実行)→ Assert(検証)」のAAAパターンを意識するとテストが読みやすくなります。
認証が必要なルートには必ず「認証済みの場合」と「未認証の場合」の両方のテストを書きましょう。セキュリティ上の問題を早期に発見できます。

関連ページ

テスト入門

Laravelでのテストの基本的な書き方と php artisan test の使い方を確認します。
最終更新日 2026年4月25日