2児のパパ系Webエンジニア
の開発日記
A Dad-of-Two Engineer's Development Diary

Pest 5の--tiaで変わったテストだけ回す!Laravelのテスト待ちを減らした設定とCIで使わない理由

Pest 5の--tiaで変わったテストだけ回す!Laravelのテスト待ちを減らした設定とCIで使わない理由

🙌 結論から

Pest 5 の --tia を使うと、手元のテストは「変更に関係するものだけ」回るようになります!

Tia は Test Impact Analysis(テスト影響分析)の略です。

1回目にどのテストがどのファイルに依存しているかを記録して、2回目からは影響を受けたテストだけを実行し、残りは前回の結果を使い回します。

AIエージェントに実装を任せると、小さい修正のたびに「テスト全部回して」が増えるんですよね・・・。

その待ち時間がかなり減りました(^^)

ただし公式も書いているとおり、CI では --tia を使わずに全部回すのが前提です。

CI のほうは、同じく Pest 5 で入った実行時間ベースの --shard で分けるようにしました👍

💡 Pest 5で何が変わったか

Pest 5 は、2026年7月の Laracon US で発表されたメジャーバージョンです。

この記事を書いている時点の最新は、Packagist で v5.3.1(10月7日)でした。

主な変更を、私が気になった順に並べるとこうなります。

  • Tia エンジン: 変更に影響するテストだけを実行して、残りはキャッシュから結果を再生する
  • 実行時間で分けるシャーディング: --shard が、テストごとの実行時間を見て均等に分けるようになった
  • 新しい expectation: toBeEmail() toBeUlid() toBeIpAddress() など、手で書くと面倒だった検証が増えた
  • 公式プラグイン: PHPStan・Rector・Agent・Evals のプラグインが出た

動く条件は PHP 8.4 以上で、中身は PHPUnit 13 になっています。

Pest 4 からの更新は、ほとんどの場合 composer.json の ^4.0 を ^5.0 に変えるだけです。

ほかの Pest 公式プラグインを入れている場合は、そちらも ^5.0 にそろえます。

公式の発表では、10分かかっていたテストが約4秒で再生されたという例が出ていました。

ここはメーカーの数字なので話半分で見ていますが、私のプロジェクトでも、1ファイル直してテストを回したときの待ち時間は体感でかなり短くなりました🔥

🔧 手元でTiaを使う設定

私が手元で回しているコマンドはこれだけです。

./vendor/bin/pest --parallel --tia

1回目は全部のテストが走って、依存関係を記録します。

ここで必要なのが、PCOV か Xdebug のようなカバレッジドライバです。

私は Docker の PHP コンテナに PCOV を入れました。

RUN pecl install pcov && docker-php-ext-enable pcov

2回目からは、こんな感じの結果が出ます(公式の例をそのまま載せています)。

Tests:    774 passed (2658 assertions, 7 affected, 2 uncached, 765 replayed)
Duration: 3.92s

affected が今回実際に走ったテスト、replayed が前回の結果を使い回したテストです。

面白いのは、依存関係の追い方が Laravel をちゃんと分かっているところです(・∀・)

公式の説明では、Laravel・Livewire・Inertia などを Composer から見つけて追跡してくれます。

たとえば、マイグレーションを変えると、そのテーブルを使っているテストが再実行されるそうです。

逆に、コメントだけの変更やフォーマッタで整えただけの変更では、何も再実行されません。

Pint を走らせたあとにテストを回しても一瞬で終わるので、ここはかなりありがたいです。

再生されたテストも、記録しておいたカバレッジをそのまま出してくれます。

なので、カバレッジを見ながら書くときも数字がブレません✨

🔥 CIでは—tiaを使わずに—shardで分ける

ここは公式がはっきり書いているポイントです。

CI では --tia を使わず、きれいなチェックアウトで全部のテストを回してください、とのこと。

キャッシュの結果を CI に持ち込むと、「本当は落ちるはずのテストが前回の合格を再生していた」という事故がありえるので、私もここは素直に従っています(`・ω・´)

その代わり、CI は --shard で並列に分けました。

まず手元で、テストごとの実行時間を記録します。

./vendor/bin/pest --update-shards

すると tests/.pest/shards.json ができるので、これをコミットします。

GitHub Actions 側は、matrix で4つに分けるだけです。

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        shard: [1, 2, 3, 4]
    steps:
      - uses: actions/checkout@v4
      # PHP と composer install の手順は省略
      - run: ./vendor/bin/pest --shard=${{ matrix.shard }}/4

実行時間のファイルがあると、--shard はテストの数ではなく時間で均等に分けてくれます。

テストの数で分けると、重いブラウザテストが1つのシャードに固まって、そこだけ遅い・・・ということが起きがちです。

時間で分けておけば、4つのジョブの終わる時間がそろいやすくなります🙌

新しく増えたテストファイルは均等に振り分けられて、時間のデータを更新するように Pest が教えてくれます。

私は月に1回くらい --update-shards をやり直しています。

🤔 ハマった点と回避策

最初につまずいたのは2つです。

ひとつ目は、PHP のバージョンです。

Pest 5 は PHP 8.4 以上が必要なので、PHP 8.3 のままのプロジェクトでは composer require の時点で入りません(´・ω・`)

私は先に Docker イメージの PHP を 8.4 に上げてから、Pest を上げました。

ふたつ目は、カバレッジドライバが無いと Tia が使えないことです。

ローカルで Xdebug をデバッグ用にオフにしていると、そのままでは依存関係が記録できません。

私は普段のテスト用には PCOV、ステップ実行したいときだけ Xdebug、と分けています。

あと、ブラウザテストを使っている人は、Pest 5 からブラウザテストが pestphp/pest-plugin-browser という別のパッケージになっています。

ブラウザテストを使うなら、composer.json にこのプラグインも足しておきます👍

🔗 関連記事と使い分け

パパ系Webエンジニア〜愛用ガジェット一覧 🛍️

この記事を書いている作業環境のガジェットを楽天ROOMにまとめています ✨ 在宅エンジニアのデスク作りの参考にどうぞ 🙌

🙌 まとめ

Pest 5 の --tia は、手元で何度もテストを回す人ほど待ち時間が減る機能でした。

./vendor/bin/pest --parallel --tia だけで、変更に関係するテストだけが走ります🙌

一方で、PCOV などのカバレッジドライバが必要なことと、CI では使わずに全部回すこと、この2つは押さえておきたいところです。

CI のほうは --update-shards と --shard で時間ごとに分けると、ジョブの終わる時間がそろいます。

AIに直してもらう→テストを回す、の往復が多い人は、マジで一度試してみてください(^^)

※ バージョン番号・料金・機能は今後も変わる可能性があります。最新情報は Pest の公式サイト をご確認ください👀

参考になったらシェアしてもらえるとうれしいです🙌

Xでポスト Threads はてブ LINE