Skip to main content

Pestとは

Pest はPHPUnit上に構築されたテストフレームワークで、Laravel 11以降の新規プロジェクトにデフォルトで採用されています。PHPUnitの豊富なアサーション群をそのまま利用しながら、クロージャベースの簡潔な構文でテストを記述できます。 PHPUnitとの主な違い:
PestのテストはPHPUnitで実行されるため、既存のPHPUnitテストと共存できます。php artisan test または vendor/bin/pest で実行します。

describe / it / test の使い分け

test()

最もシンプルな定義。テスト名をそのまま説明文として使います。

it()

「it should…」のような英語的な文体で自然言語に近い記述ができます。

describe()

関連するテストをグループ化します。beforeEach() の共有やファイル内での論理的な整理に使います。
describe() はネストできます。ただし深すぎるネストはテストを読みにくくするため、2階層までを目安にしましょう。

Expectation API

expect() はPest独自のアサーション構文です。メソッドチェーンで条件を積み重ねられます。

基本的なアサーション

モデルに対するアサーション

and() チェーン

each() で配列の各要素を検証

データセットを使ったパラメータ化テスト

同じロジックを複数の入力値でテストするには dataset() またはインライン with() を使います。

インラインデータセット

名前付きデータセット

tests/Datasets ディレクトリにデータセットを定義します。

クロージャを使った動的データセット

Mockeryを使ったユニットテスト

サービスのモック

スパイ

スパイはモックと違い、実装を呼び出しながら呼び出し記録を残します。

部分モック

一部のメソッドだけモックし、他は実際の実装を使います。

HTTPフェイクによる外部API呼び出しのテスト

Http::fake() を使うと実際のHTTPリクエストを送らずにレスポンスをスタブできます。

基本的なフェイク

エラーレスポンスのテスト

ネットワーク障害のシミュレーション

イベント・メール・通知のフェイク

Event::fake()

特定のイベントだけフェイクし、他は実際に処理させることもできます。

Mail::fake()

Notification::fake()

Artisanコマンドのテスト

対話型コマンドのテスト

RefreshDatabaseLazilyRefreshDatabase

RefreshDatabase

各テスト後にデータベースをロールバックし、クリーンな状態を保ちます。テストスイート開始時にマイグレーションを実行します。

LazilyRefreshDatabase

RefreshDatabase はすべてのテストでマイグレーションを確認しますが、LazilyRefreshDatabase はデータベースを実際に変更するテストが実行されるまでマイグレーションを遅延させます。データベースに触れないテストが多い場合に高速化できます。
ほとんどのプロジェクトでは RefreshDatabase が安全な選択肢です。LazilyRefreshDatabase はテストスイートが大きくなりデータベース操作のないテストが多い場合に検討しましょう。

コードカバレッジの計測

XdebugまたはPCOVが必要です。
コードカバレッジの計測はテスト実行時間を大幅に増加させます。CI環境では専用ジョブに分けるか、プルリクエスト時のみ実行するように設定することをおすすめします。

関連ページ

テスト入門

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