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

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

4 min read Mohamed Said Mohamed Said

Nuno Maduro announced Pest v5 on stage at Laracon US 2026 in Boston and tagged v5.0.0 during the conference. The headline feature is the TIA (Test Impact Analysis) engine, which slashed Laravel Cloud's 19,000-test suite from 3 minutes down to 5 seconds. The release also bundles first-party plugins for AI agents, LLM evaluation, PHPStan, and Rector.

What's New at a Glance

  • TIA Engine — re-runs only affected tests; replays cached results for the rest
  • Agent plugin — gives AI coding agents a single command to verify changes inside a real test suite
  • Evals plugin — scores LLM output with deterministic checks and AI-powered scorers
  • PHPStan plugin — teaches PHPStan about it(), test(), expect(), and $this in test closures
  • Rector plugin — 60 rules to rewrite assertions as Pest matchers and handle major version upgrades
  • New expectations for emails, ULIDs, IP addresses, MAC addresses, and more
  • PHP 8.4 and PHPUnit 13 as the new baseline

Test Impact Analysis With the TIA Engine

The TIA engine records which tests touch which files on the first run, then executes only the tests affected by your latest changes and replays cached results for everything else.

./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

Cached results preserve coverage data, so --coverage reports and --min thresholds behave as if the full suite ran. The dependency graph understands migrations, Blade templates, Inertia/Vite module graphs, and Livewire components — no configuration needed. Pest also normalizes files before hashing them, so a Pint formatting pass or a comment edit produces an identical hash and runs nothing.

Note: The TIA engine requires PCOV or Xdebug to record its baseline. CI baseline sharing requires an authenticated GitHub CLI and only works on GitHub.

Configure TIA behaviour in tests/Pest.php:

pest()->tia()
    ->always()
    ->locally()
    ->baselined()
    ->filtered();

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, complete with factories, RefreshDatabase, and Laravel fakes:

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 named "verify". 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 using 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
        ->toBeRelevant()              // LLM-as-judge
        ->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

The PHPStan plugin reads your Pest.php configuration to resolve $this types inside test closures, narrows types through expectation chains, and catches impossible expectations like expect(10)->toStartWith('1').

The Rector plugin ships 60 rules across coding style and version upgrade sets. A quick example of what it rewrites:

// Before
expect(count($array))->toBe(5);
expect(array_key_exists('id', $array))->toBeTrue();

// After
expect($array)->toHaveCount(5)
    ->toHaveKey('id');

Preview changes safely with vendor/bin/rector process --dry-run.

Upgrading to Pest 5

Pest 5 requires PHP 8.4 and PHPUnit 13. The Pest upgrade guide documents no API-level breaking changes beyond the version bumps. For most projects it is a one-line change:

"pestphp/pest": "^5.0"

Update any Pest-maintained plugins to ^5.0 at the same time.

Key Takeaways

  • The TIA engine can reduce large suite runtimes dramatically by replaying cached results
  • The Agent plugin is purpose-built for AI coding agent workflows, not general regression testing
  • Evals run only on demand (--evals) so they never add cost to a standard CI run
  • PHPStan and Rector plugins are now first-party and installable via Composer
  • Upgrading from Pest 4 is straightforward; PHPUnit 13 compatibility is the main consideration

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 does it still count them toward coverage?
The TIA engine replays cached results rather than skipping tests. Each cached result stores the exact lines and branches the test covered, so --coverage reports and --min thresholds behave as though the full suite ran.
Q02 What does the Pest 5 Agent plugin actually do, and when should I use it?
The Agent plugin adds an --agent option that runs a code snippet inside a full Pest test environment, with factories, RefreshDatabase, and Laravel fakes available. It is designed to give AI coding agents a quick way to verify that a change works, not to replace committed regression tests.
Q03 What are the minimum requirements to upgrade to Pest 5?
Pest 5 requires PHP 8.4 or greater and PHPUnit 13. The TIA engine additionally requires PCOV or Xdebug to record its baseline. Pest itself has no API-level breaking changes beyond the version bumps.

Continue reading

More Articles

View all