なぜPestがLaravelのデフォルトになったか
Laravel 11より、laravel new でプロジェクトを作成する際に Pest がデフォルトのテストフレームワークとして選択されるようになりました。PHPUnit は長年 PHP の標準的なテストツールとして使われてきましたが、Pest はその PHPUnit をベースにしながら、より簡潔で読みやすいテスト記法を提供します。
PestはPHPUnit上で動作するため、既存のPHPUnitテストはそのまま実行できます。移行は段階的に進められます。
PHPUnitとの主な違い
テストの記法
最もわかりやすい違いはテストの書き方です。- Pest
- PHPUnit
test() 関数はクロージャを受け取ります。クラスやメソッドの定義が不要なため、テストの意図が一行目から明確です。it() も同様に使えます。英語で書く場合は it('can login', ...) という自然な文として読めます。
expect() API
Pest の最大の特徴は expect() を使ったチェーン形式のアサーションです。
expect($value)->toBe(), ->toBeNull(), ->toContain(), ->toHaveCount() など、英語として自然に読める形式でアサーションを書けます。複数のアサーションをメソッドチェーンでまとめることもできます。
セットアップとティアダウン
PHPUnit のsetUp() に相当するのが beforeEach()、tearDown() に相当するのが afterEach() です。
データセット — テーブルドリブンテスト
同じテストロジックを複数のデータで実行したい場合はdataset を使います。
'メールなし' など)がテスト名に付加されるため、どのパターンで失敗したかが一目でわかります。
arch() テスト — アーキテクチャの自動チェック
Pest の arch() はコードベースの構造を検証するテストです。「コントローラーがモデルに直接依存していないか」「モデルが Eloquent を継承しているか」といったアーキテクチャルールを自動で検証できます。
laravel() プリセットはモデルの命名・コントローラーの継承・ミドルウェアの構造など、Laravelの一般的な慣習に沿ったルールをまとめて検証します。
Laravelプロジェクトでの実践例
テストの作成
Laravelのテストヘルパーをそのまま使う
Pest は Laravel のTestCase を継承しているため、actingAs()、assertDatabaseHas()、HTTP テストヘルパーなど、すべての Laravel テストヘルパーがそのまま使えます。
ファクトリーとデータベーストランザクション
RefreshDatabase や DatabaseTransactions トレイトも uses() で簡単に適用できます。ファイル先頭に書けばそのファイル全体に適用されます。
tests/Pest.php に一度設定しておくと、すべての Feature テストで RefreshDatabase が自動的に有効になります。個別のテストファイルで上書きすることも可能です。
既存PHPUnitテストとの共存方法
Pest と PHPUnit は同じプロジェクト内で共存できます。既存の PHPUnit テストを書き換える必要はなく、新しいテストから Pest 形式で書き始めればよいだけです。php artisan test は Laravel 11 以降、Pest がインストールされている場合は自動的に Pest を使って実行します。移行の進め方
- まず
tests/Pest.phpにuses()の設定を追加する - 新しく追加するテストは Pest 形式で書く
- 既存の PHPUnit テストは動作を確認しながら少しずつ移行する
まとめ
Pest は PHPUnit の置き換えではなく、PHPUnit をラップした上位レイヤーです。Laravel との統合も深く、スターターキット生成時からデフォルトで選択されるほどになっています。既存プロジェクトへの導入コストは低く、新規のテストから試し始めるだけで恩恵を受けられます。
テストを書く量が増えれば、バグの発見が早くなり、リファクタリングへの心理的ハードルも下がります。Pest はその「テストを書くこと自体の摩擦」を減らすための道具です。
Pest公式ドキュメント
データセット、カバレッジ、並列実行など、Pestの全機能については公式ドキュメントを参照してください。