Pest 5 Released: Test Impact Analysis, Agent Verification, and Evals
Laravel PHP #Pest PHP #Testing #PHP 8.4 #PHPUnit #AI #Laravel

Pest 5 Released: Test Impact Analysis, Agent Verification, and Evals

4 min read Mohamed Said Mohamed Said

Pest 5 Is Here

Nuno Maduro announced Pest v5 on stage at Laracon US 2026 in Boston and tagged v5.0.0 during the conference. The release ships a new TIA engine, five first-party plugins, eight new expectations, and bumps the baseline to PHP 8.4 and PHPUnit 13.

Test Impact Analysis With the TIA Engine

TIA (Test Impact Analysis) is the headline feature. On the first run Pest records which tests touch which files. Every subsequent run executes only the tests affected by your changes and replays cached results for everything else — without sacrificing coverage accuracy.

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

A typical summary looks like this:

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

The dependency graph goes beyond PHP files. Change a migration and Pest re-runs only tests that queried that table. Edit a Blade template and it re-runs the tests that rendered it. It understands Laravel, Symfony, Livewire, Inertia, and Vite module graphs automatically — nothing to configure.

Taylor Otwell reported that Laravel Cloud's suite of 19,000+ tests dropped from 3 minutes to 5 seconds after enabling TIA.

Note: TIA needs PCOV or Xdebug to record its baseline. Teams can have CI record the baseline once per merge to main and share it with everyone else.

Verifying AI Agent Changes With the Agent Plugin

The Agent plugin gives coding agents a way to confirm their changes actually work inside your real test suite:

composer require pestphp/pest-plugin-agent --dev
./vendor/bin/pest --agent='$user = \App\Models\User::factory()->create(); $this->actingAs($user)->get("/dashboard")->assertOk();'

Each snippet runs as an isolated test with factories, RefreshDatabase, and Laravel fakes available. This is designed for quick feedback during development, not as a replacement for committed regression tests.

Testing LLM Output With Evals

The Evals plugin scores LLM output quality through the familiar expect() API:

composer require pestphp/pest-plugin-evals --dev
it('answers capital city questions correctly', function (): void {
    expect(CapitalCityAgent::class)
        ->prompt('What is the capital of France?')
        ->toContain('Paris')            // deterministic check
        ->toBeRelevant()                // LLM-as-judge scorer
        ->toBeSimilar('Paris, France'); // semantic similarity
});

Evals are skipped on a normal run and only execute when you pass --evals. Scored expectations accept a threshold between 0.0 and 1.0 (default 0.7). Available scorers include toBeRelevant(), toBeSafe(), toBeFactual(), toBeSimilar(), toPassJudge(), toHaveToolCalls(), and toFollowTrajectory().

PHPStan and Rector Plugins

PHPStan — The new first-party plugin teaches PHPStan about it(), test(), expect(), and $this inside test closures. Types flow through expectation chains, and it catches impossible expectations like expect(10)->toStartWith('1').

composer require pestphp/pest-plugin-phpstan --dev

Rector — Ships 60 rules that rewrite raw PHP assertions as Pest matchers and handle major version upgrades.

use Pest\Rector\Set\PestSetList;

return RectorConfig::configure()
    ->withPaths([__DIR__ . '/tests'])
    ->withSets([PestSetList::CODING_STYLE]);

New Expectations

Eight new matchers cover common format checks:

expect('nuno@pestphp.com')->toBeEmail();
expect('01ARZ3NDEKTSV4RRFFQ69G5FAV')->toBeUlid();
expect('192.168.1.1')->toBeIpAddress();
expect('00:1a:2b:3c:4d:5e')->toBeMacAddress();

Also available: toBeHostname(), toBeDomain(), toBeBase64(), and toBeHexadecimal().

Upgrading to Pest 5

Pest 5 requires PHP 8.4 and PHPUnit 13. For most suites the upgrade is a one-line change in composer.json:

"pestphp/pest": "^5.0"

The Pest team documents no API-level breaking changes beyond the version bumps. Review the PHPUnit 13 changelog for anything that may affect your suite.

Key Takeaways

  • TIA engine runs only affected tests and replays the rest from cache, preserving coverage accuracy
  • Agent plugin lets AI coding agents verify changes inside a real feature-test environment
  • Evals plugin scores LLM output with deterministic and AI-powered checks via expect()
  • PHPStan plugin adds full type inference for Pest's DSL — a long-requested community feature
  • Rector plugin ships 60 rules for coding style and version upgrades
  • PHP 8.4 and PHPUnit 13 are now required

Source: Pest 5 Released With Test Impact Analysis, Agent Verification, and Evals — Laravel News

Found this useful?

Frequently Asked Questions

3 questions
Q01 Does the TIA engine skip tests or just replay cached results?
It replays cached results, which is different from skipping. Each cached result stores everything the test produced — including exact lines and branches covered — so --coverage reports and --min thresholds behave as though the full suite ran.
Q02 Do I need a coverage driver to use the TIA engine?
Yes. TIA needs PCOV or Xdebug installed to record its baseline on the first run. After that, subsequent runs use the recorded dependency graph to determine which tests to re-execute.
Q03 Are Evals tests run on every normal Pest invocation?
No. Evals are skipped by default and make no API calls unless you explicitly pass the --evals flag when running Pest.

Continue reading

More Articles

View all