Skip to main content

テストとは

テストとは、コードが期待どおりに動作するかを自動的に検証する仕組みです。 テストを書くことで、機能追加や修正をしたときに既存の動作が壊れていないかを素早く確認できます。 チームでの開発では、テストがあることで安心してコードを変更・レビューできます。 Laravelは最初からテストのサポートが組み込まれており、PestPHPUnit の両方が使えます。 新規インストール時には phpunit.xml 設定ファイルと tests/ ディレクトリが自動的に用意されています。
PestはPHPUnitをベースに構築されており、より簡潔で読みやすい構文でテストを書けます。これからテストを始める場合はPestを選ぶのがおすすめです。

tests/ ディレクトリの構成

  • Feature/ — 機能テストを置きます。HTTPリクエストを含む大きな単位のテストに使います。複数のオブジェクトが連携する動作やAPIエンドポイントの検証など、アプリケーション全体に近いテストです。ほとんどのテストはここに置くことになります。
  • Unit/ — ユニットテストを置きます。単一のクラスやメソッドなど、小さな単位のテストに使います。Laravelアプリケーションは起動しないため、データベースや他のフレームワーク機能は使えません。

テストの作成

make:test Artisanコマンドで新しいテストクラスを生成します。
tests/Feature/TodoTest.php が生成されます。

テストの実行

php artisan test コマンドでテストを実行します。
vendor/bin/pestvendor/bin/phpunit を直接実行しても同じ結果が得られますが、php artisan test のほうが見やすい出力が得られるため推奨します。 特定のテストスイートだけを実行したいときはオプションを使います。

基本的なテストの書き方

シンプルなアサーションの例です。

よく使うアサーション

HTTPテスト

LaravelのHTTPテストでは、実際のHTTPサーバーを立てることなく、ルートへのリクエストをシミュレートできます。 Feature/ ディレクトリのテストクラスで使える強力な機能です。

ページの表示を確認する

get() メソッドでGETリクエストを送り、レスポンスを検証します。

ToDoアプリのHTTPテスト例

Todo モデルがあるアプリケーションを例に、CRUDの各操作をテストします。

よく使うレスポンスのアサーション

RefreshDatabase トレイトを使うと、各テストの実行後にデータベースをリセットします。テスト間でデータが干渉しないようにするために使います。

テスト環境

phpunit.xml の設定

プロジェクトルートの phpunit.xml でテスト環境の設定を行います。 デフォルトではセッションとキャッシュが array ドライバーに設定されており、テスト実行中にデータが残りません。
データベースには、ファイルを残さないSQLiteのインメモリデータベースを使うのが一般的です。

.env.testing ファイル

プロジェクトルートに .env.testing ファイルを作成すると、テスト実行時に .env の代わりに読み込まれます。 テスト専用のデータベース接続や外部サービスの設定を分けたい場合に使います。
設定をキャッシュしている場合、php artisan config:clear を実行してからテストを実行してください。古いキャッシュが使われて設定が反映されないことがあります。

並列テスト実行

テスト数が増えてくると実行時間が長くなります。 --parallel オプションを使うと、複数のプロセスでテストを同時実行して時間を短縮できます。 まず brianium/paratest パッケージをインストールします。
その後、--parallel オプションを付けて実行します。
デフォルトではCPUのコア数分のプロセスが立ち上がります。プロセス数を指定するには --processes オプションを使います。
並列テストを使うときは、各プロセスが独立したデータベースを使う必要があります。RefreshDatabase トレイトと phpunit.xml のインメモリSQLite設定を組み合わせると問題なく動作します。

次のステップ

HTTPテスト

リクエストのシミュレーション、認証付きテスト、JSONアサーションなど、より詳しいHTTPテストの方法を確認できます。
最終更新日 2026年4月25日