テストとは
テストとは、コードが期待どおりに動作するかを自動的に検証する仕組みです。 テストを書くことで、機能追加や修正をしたときに既存の動作が壊れていないかを素早く確認できます。 チームでの開発では、テストがあることで安心してコードを変更・レビューできます。 Laravelは最初からテストのサポートが組み込まれており、Pest と PHPUnit の両方が使えます。 新規インストール時にはphpunit.xml 設定ファイルと tests/ ディレクトリが自動的に用意されています。
tests/ ディレクトリの構成
Feature/— 機能テストを置きます。HTTPリクエストを含む大きな単位のテストに使います。複数のオブジェクトが連携する動作やAPIエンドポイントの検証など、アプリケーション全体に近いテストです。ほとんどのテストはここに置くことになります。Unit/— ユニットテストを置きます。単一のクラスやメソッドなど、小さな単位のテストに使います。Laravelアプリケーションは起動しないため、データベースや他のフレームワーク機能は使えません。
テストの作成
make:test Artisanコマンドで新しいテストクラスを生成します。
tests/Feature/TodoTest.php が生成されます。
テストの実行
php artisan test コマンドでテストを実行します。
vendor/bin/pest や vendor/bin/phpunit を直接実行しても同じ結果が得られますが、php artisan test のほうが見やすい出力が得られるため推奨します。
特定のテストスイートだけを実行したいときはオプションを使います。
基本的なテストの書き方
シンプルなアサーションの例です。よく使うアサーション
HTTPテスト
LaravelのHTTPテストでは、実際のHTTPサーバーを立てることなく、ルートへのリクエストをシミュレートできます。Feature/ ディレクトリのテストクラスで使える強力な機能です。
ページの表示を確認する
get() メソッドでGETリクエストを送り、レスポンスを検証します。
ToDoアプリのHTTPテスト例
Todo モデルがあるアプリケーションを例に、CRUDの各操作をテストします。
よく使うレスポンスのアサーション
RefreshDatabase トレイトを使うと、各テストの実行後にデータベースをリセットします。テスト間でデータが干渉しないようにするために使います。テスト環境
phpunit.xml の設定
プロジェクトルートの phpunit.xml でテスト環境の設定を行います。
デフォルトではセッションとキャッシュが array ドライバーに設定されており、テスト実行中にデータが残りません。
.env.testing ファイル
プロジェクトルートに .env.testing ファイルを作成すると、テスト実行時に .env の代わりに読み込まれます。
テスト専用のデータベース接続や外部サービスの設定を分けたい場合に使います。
並列テスト実行
テスト数が増えてくると実行時間が長くなります。--parallel オプションを使うと、複数のプロセスでテストを同時実行して時間を短縮できます。
まず brianium/paratest パッケージをインストールします。
--parallel オプションを付けて実行します。
--processes オプションを使います。
次のステップ
HTTPテスト
リクエストのシミュレーション、認証付きテスト、JSONアサーションなど、より詳しいHTTPテストの方法を確認できます。