はじめに
Laravelにおいて、
テストコードは3種類存在します。
・UnitTest
・FeatureTest
・BrowserTest
この3つの違いがよく分からなかったので、
自分なりにしっくりくるように簡単に整理しました。
UnitTest
/tests/Unit
配下にテストを配置する。
一番粒度の細かいテスト。
Service、Model、Middleware、Policyなど、
自分で作ったクラス1つ1つと対応するように
テストクラス(ファイル)を1つ1つ作る。
その対象クラスのメソッド1つ1つの動作を検証するための
テストケースをコードに書いていく。
Controllerクラスのテストは
UnitTestではなくFeatureTestとするほうがしっくりくる。
FeatureTest
/tests/Feature
配下にテストを配置する。
UnitTestより粒度を大きくしたテスト。
1つのHTTPリクエスト単位の動きをテストする。
=ルーティング1つごとにテストクラス(ファイル)を作る
=コントローラのアクションメソッド単位でのテスト
UnitTestでテストした各クラスを結合した状態で
コントローラの動き(つまりリクエストを受けてレスポンスを返すまで)をテストするというイメージ。
1つのコントローラアクションに対応したテストクラス(ファイル)の中で、
・ログインした状態でアクセス時の動作
・未ログインアクセス時の動作
・検索パラメータ付けたアクセス時の動作
・ユーザに特定ロールを付けた状態の動作
など1つ1つのケースをテストケースとしてコードを書く。
BrowserTest
/tests/Browser
配下にテストを配置する。
実際にブラウザを使って画面にリクエスト、
ボタンをクリック、
マウスホバー、
フォーム送信などの操作をするテストをコードで実行できる。
FeatureTestにさらに
・複数HTTPリクエストの遷移
・画面操作時のJsの動作
のような観点を加えてテストできるイメージ。
Unit、FeatureはPHPUnitで動作するテストなのに対し、
BrowserTestはlaravel/dusk
というパッケージを使ったテスト。
参考
https://readouble.com/laravel/7.x/ja/testing.html
https://readouble.com/laravel/7.x/ja/dusk.html