はじめに
Laravelは、HTTPリクエストをシミュレートしてレスポンスを検証するための、豊富なAPIを提供しています。 実際のHTTPサーバーを立てることなく、アプリケーションへのリクエストをテスト内で再現できます。get() メソッドはアプリケーションに GET リクエストを送り、assertStatus() は返ってきたレスポンスのHTTPステータスコードを検証します。
テスト実行中はCSRFミドルウェアが自動的に無効になります。テストで明示的に無効化する必要はありません。
リクエストの作成
テスト内ではget、post、put、patch、delete メソッドを使ってリクエストを送れます。
これらのメソッドはネットワークリクエストを実際には発行せず、アプリケーション内部でシミュレートします。
返り値は Illuminate\Testing\TestResponse のインスタンスで、様々なアサーションメソッドを提供します。
リクエストヘッダーのカスタマイズ
withHeaders() メソッドを使ってリクエストのヘッダーをカスタマイズできます。
クッキー
withCookie() または withCookies() メソッドでリクエスト前にクッキー値を設定できます。
セッションと認証
withSession() メソッドを使ってリクエスト前にセッションデータを設定できます。
actingAs() メソッドで認証ユーザーとしてリクエストを送れます。モデルファクトリーと組み合わせて使います。
actingAs() の第2引数にガード名を渡すと、そのガードで認証されます。テストの間はそのガードがデフォルトになります。
actingAsGuest() を使います。
レスポンスのデバッグ
テスト中にレスポンスの内容を確認したい場合はdump、dumpHeaders、dumpSession メソッドを使います。
dd、ddHeaders、ddBody、ddJson、ddSession メソッドを使います。
例外のテスト
特定の例外がスローされることをテストするには、Exceptions ファサードを使います。
assertNotReported や assertNothingReported を使います。
withoutExceptionHandling() を使います。
assertThrows() を使います。
assertDoesntThrow() を使います。
JSON APIのテスト
LaravelはJSON APIのテストのためのヘルパーを多数提供しています。json、getJson、postJson、putJson、patchJson、deleteJson、optionsJson メソッドを使ってJSONリクエストを送れます。
assertJson() はレスポンスを配列に変換し、指定した配列がJSONレスポンスの中に含まれているかを検証します。JSONに他のプロパティが存在していても、指定したフラグメントが含まれていればテストは通過します。完全一致のアサーション
assertExactJson() を使うと、返却されたJSONと指定した配列が完全に一致することを検証できます。
JSONパスのアサーション
assertJsonPath() を使って、指定したパスにあるデータを検証できます。
フルーエントなJSONテスト
assertJson() にクロージャを渡すと、AssertableJson インスタンスを使ってフルーエントにアサーションを記述できます。
has() と missing() を使います。
hasAll() や missingAll() を使います。
JSONコレクションのアサーション
ルートが複数のアイテムを含むJSONレスポンスを返す場合、has() メソッドでアイテム数やコレクションの中身を検証できます。
each() を使います。
JSONの型アサーション
whereType() や whereAllType() を使ってプロパティの型を検証できます。
| 文字で複数の型を指定することもできます。いずれかの型に一致すればアサーションは通過します。
string、integer、double、boolean、array、null です。
認証テスト
actingAs() を使って認証されたユーザーとしてリクエストを送れます。
ユーザー登録フローのテスト例
実際のユーザー登録エンドポイントをテストする例です。セッションのテスト
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を実践するためのポイント
Featureテストから始める
Featureテストから始める
HTTPテストは
tests/Feature/ ディレクトリに作成します。アプリケーションの外から見た動作(リクエスト→レスポンス)を最初に定義することで、実装すべき機能が明確になります。RefreshDatabaseを使う
RefreshDatabaseを使う
データベースを使うテストでは
RefreshDatabase トレイトを使いましょう。各テスト後にデータベースがリセットされ、テスト間でのデータ干渉を防げます。テストの独立性を保つことで、実行順序に依存しない安定したテストスイートが構築できます。ファクトリーを積極的に使う
ファクトリーを積極的に使う
User::factory()->create() のようなモデルファクトリーを使うと、テストデータの作成が簡単になります。特定の状態を持つモデルを作成するためにファクトリーの状態(state)を定義しておくと、テストの可読性が向上します。1テスト1アサーション
1テスト1アサーション
1つのテストメソッドではできるだけ1つのことを検証しましょう。テストが失敗したときに原因が特定しやすくなります。「Arrange(準備)→ Act(実行)→ Assert(検証)」のAAAパターンを意識するとテストが読みやすくなります。
認証テストを忘れない
認証テストを忘れない
認証が必要なルートには必ず「認証済みの場合」と「未認証の場合」の両方のテストを書きましょう。セキュリティ上の問題を早期に発見できます。
関連ページ
テスト入門
Laravelでのテストの基本的な書き方と
php artisan test の使い方を確認します。