Skip to main content

なぜPestがLaravelのデフォルトになったか

Laravel 11より、laravel new でプロジェクトを作成する際に Pest がデフォルトのテストフレームワークとして選択されるようになりました。PHPUnit は長年 PHP の標準的なテストツールとして使われてきましたが、Pest はその PHPUnit をベースにしながら、より簡潔で読みやすいテスト記法を提供します。
PestはPHPUnit上で動作するため、既存のPHPUnitテストはそのまま実行できます。移行は段階的に進められます。
公式が Pest を採用した背景には、テストを書く際の摩擦を減らすという目標があります。クラスを定義してメソッドを書いてという儀式的な手順をなくし、「テストしたいこと」そのものに集中できる記法を提供することで、テストを書く習慣が自然と身につくようになります。

PHPUnitとの主な違い

テストの記法

最もわかりやすい違いはテストの書き方です。
Pest の 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 を継承しているか」といったアーキテクチャルールを自動で検証できます。
arch() テストはソースコードを静的解析して実行されます。実際にHTTPリクエストを送ったりデータベースにアクセスしたりしないため、非常に高速です。
Pest にはよく使われるアーキテクチャルールのプリセットも用意されています。
laravel() プリセットはモデルの命名・コントローラーの継承・ミドルウェアの構造など、Laravelの一般的な慣習に沿ったルールをまとめて検証します。

Laravelプロジェクトでの実践例

テストの作成

Laravel 11 以降でデフォルト設定のまま実行すると、Pest 形式のテストファイルが生成されます。

Laravelのテストヘルパーをそのまま使う

Pest は Laravel の TestCase を継承しているため、actingAs()assertDatabaseHas()、HTTP テストヘルパーなど、すべての Laravel テストヘルパーがそのまま使えます。

ファクトリーとデータベーストランザクション

RefreshDatabaseDatabaseTransactions トレイトも uses() で簡単に適用できます。ファイル先頭に書けばそのファイル全体に適用されます。
tests/Pest.php に一度設定しておくと、すべての Feature テストで RefreshDatabase が自動的に有効になります。個別のテストファイルで上書きすることも可能です。

既存PHPUnitテストとの共存方法

Pest と PHPUnit は同じプロジェクト内で共存できます。既存の PHPUnit テストを書き換える必要はなく、新しいテストから Pest 形式で書き始めればよいだけです。
php artisan test は Laravel 11 以降、Pest がインストールされている場合は自動的に Pest を使って実行します。

移行の進め方

  1. まず tests/Pest.phpuses() の設定を追加する
  2. 新しく追加するテストは Pest 形式で書く
  3. 既存の PHPUnit テストは動作を確認しながら少しずつ移行する
急いで全テストを書き換える必要はありません。Pest のシンタックスは PHPUnit と比べて学習コストが低いため、チームへの浸透も比較的スムーズです。

まとめ

Pest は PHPUnit の置き換えではなく、PHPUnit をラップした上位レイヤーです。Laravel との統合も深く、スターターキット生成時からデフォルトで選択されるほどになっています。既存プロジェクトへの導入コストは低く、新規のテストから試し始めるだけで恩恵を受けられます。 テストを書く量が増えれば、バグの発見が早くなり、リファクタリングへの心理的ハードルも下がります。Pest はその「テストを書くこと自体の摩擦」を減らすための道具です。

Pest公式ドキュメント

データセット、カバレッジ、並列実行など、Pestの全機能については公式ドキュメントを参照してください。
最終更新日 2026年4月19日