Вийшов Pest 5 із Test Impact Analysis, Agent Verification та Evals

Перекладено ШІ 0 Laravel News 04 серпня, 2026

Новий Pest v5 із рушієм Tia Engine здатен скоротити час виконання тестів із хвилин до лічених секунд. Дізнайтеся, як підтримка AI-агентів та інтеграція з PHPStan і Rector виводять автоматизацію на абсолютно новий рівень.

Вийшло наступне велике оновлення Pest PHP — Pest v5! Нуно Мадуро анонсував реліз на Laracon US 2026 у Бостоні, випустивши версію v5.0.0 прямо під час конференції. Ключова новинка — двигун TIA, який кардинально скорочує час виконання тестів. Pest 5 вимагає PHP 8.4 та PHPUnit 13, а також пропонує набір офіційних плагінів для AI-агентів, PHPStan, Rector та інших інструментів.

Двигун TIA став справжнім проривом у швидкості тестування. Наприклад, тестовий набір Laravel Cloud із понад 19 000 тестів тепер виконується за 5 секунд замість 3 хвилин:

Тейлор Отвелл у X: Pest 5 скоротив час виконання тестів Laravel Cloud (19 000+) з 3 хвилин до 5 секунд.

Коротко про те, що нового з'явилося у Pest 5:

  • Tia Engine: перезапускає лише ті тести, на які вплинули ваші останні зміни, а решту відтворює з кешу без втрати точності coverage.
  • Agent plugin: дозволяє вашому AI-агенту однією командою перевірити, чи дійсно працюють внесені зміни у межах реального тестового набору.
  • Evals plugin: оцінює результати роботи LLM за допомогою детермінованих перевірок та AI-метрик через звичний API expect().
  • PHPStan plugin: вчить PHPStan розуміти конструкції it(), test(), expect() та контекст $this усередині тестів.
  • Rector plugin: містить 60 правил, які переписують звичайні PHP-assertions на Pest matchers та допомагають з оновленням версій.
  • Нові expectations для перевірки email, ULID, IP-адрес та інших форматів, які раніше доводилося перевіряти вручну.
  • PHP 8.4 та PHPUnit 13 тепер є мінімальними вимогами.

# Що нового

# Аналіз впливу тестів із двигуном Tia

Tia — це абревіатура від Test Impact Analysis. Під час першого запуску система фіксує, які тести взаємодіють із певними файлами. Усі наступні запуски виконують лише ті тести, що стосуються ваших змін, а для решти — просто відтворюють результати з кешу.

Щоб скористатися цією функцією, додайте прапор --tia:

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

Підсумок виконання покаже, як саме було оброблено тести:

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

Важливо, що "replay" — це не просто пропущений тест. Кешований результат містить усі дані, які згенерував тест, включно з точними рядками та гілками коду, які він покрив. Тому звіти --coverage та пороги --min працюють так, ніби був запущений увесь набір тестів.

Цікаво, що граф залежностей розуміє не лише PHP-файли. Якщо змінити міграцію, Pest запустить лише ті тести, що звертаються до цієї таблиці. Зміна JS-компонента змусить Pest проаналізувати граф модулів Vite, щоб знайти відповідні сторінки Inertia. Зміна шаблону Blade запустить тести, які його рендерять. Система автоматично розпізнає Laravel, Symfony, Livewire, Inertia та фронтенд-активи через Composer, тому додаткове налаштування не потрібне.

Pest також нормалізує файли перед хешуванням, ігноруючи зайві пробіли, коментарі та docblocks. Використання Pint або редагування README не змінить хеш і не запустить тести повторно.

Примітка: для запису базового стану потрібен драйвер покриття, тому у вас мають бути встановлені PCOV або Xdebug. На великих проектах перший запуск може тривати довго, тому в командах CI може записувати базовий стан при кожному злитті з гілкою main, а розробники зможуть завантажувати його локально.

Налаштувати поведінку можна у файлі tests/Pest.php:

pest()->tia()
    ->always()     // запускати TIA при кожному виклику
    ->locally()    // використовувати always() лише в локальному оточенні
    ->baselined()  // завантажувати спільний базовий стан із CI
    ->filtered();  // завантажувати лише зачеплені файли тестів

# Перевірка змін AI-агента за допомогою Agent Plugin

AI-агенти непогано пишуть код, але їм важко підтвердити його працездатність. Плагін Agent дає таку можливість. Встановіть його як dev-залежність:

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

Це додає опцію --agent, яка запускає фрагмент коду всередині повноцінного Pest-тесту, де доступні ваші factories, RefreshDatabase та Laravel fakes:

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

Використовуйте одинарні лапки, щоб оболонка (shell) не інтерпретувала $user, і вказуйте повні імена класів. Кожен фрагмент виконується як ізольований тест під назвою "verify". Опцію --agent можна викликати кілька разів одночасно.

Якщо у вас встановлено плагін для браузерного тестування, цей самий інструмент може керувати реальним браузером і перевіряти побічні ефекти на бекенді, що неможливо зробити звичайною перевіркою інтерфейсу.

Розробники Pest наголошують, що цей інструмент призначений для швидкого фідбеку під час роботи, а не для заміни регресійних тестів у вашому репозиторії.

# Тестування виводів LLM з плагіном Evals

Один і той самий промт може давати різні відповіді моделі, тому звичайна перевірка на рівність не працює. Плагін Evals натомість оцінює якість виводу через API expect():

composer require pestphp/pest-plugin-evals --dev
use App\Agents\CapitalCityAgent;
 
it('answers capital city questions correctly', function (): void {
    expect(CapitalCityAgent::class)
        ->prompt('What is the capital of France?')
        ->toContain('Paris')            // детермінована перевірка
        ->toBeRelevant()                // AI-оцінка релевантності
        ->toBeSimilar('Paris, France'); // семантична схожість
});

Оскільки кожна оцінка звертається до реальної моделі, вони пропускаються під час звичайного запуску. Використовуйте прапор --evals, коли вони вам потрібні.

Для оцінюваних параметрів можна встановити поріг точності від 0.0 до 1.0 (за замовчуванням 0.7). Доступні методи toBeRelevant() для оцінки відповіді на промт, toBeSafe() для перевірки на небезпечний контент, toBeFactual() для порівняння з еталонною відповіддю та інші. Оцінювання за замовчуванням працює через Laravel AI.

# Підтримка PHPStan для Pest-тестів

Це була одна з найочікуваніших функцій. Раніше PHPStan не розумів специфічний синтаксис Pest та контекст $this усередині замикань тестів. Тепер це виправлено:

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

Плагін зчитує конфігурацію Pest.php, щоб визначити тип $this, і підтримує різні стилі опису тестів. Типи коректно передаються по ланцюжку очікувань, наприклад, toBeInt() автоматично звужує тип int|string до int. Також плагін виявляє очікування, які ніколи не зможуть виконатися (наприклад, expect(10)->toStartWith('1')).

# Рефакторинг тестів за допомогою Rector

Плагін Rector пропонує 60 правил для покращення стилю коду та оновлення версій:

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

Набір правил CODING_STYLE автоматично перетворює сирий PHP-код на лаконічні ланцюжки Pest:

-expect(count($array))->toBe(5);
-expect(array_key_exists('id', $array))->toBeTrue();
+expect($array)->toHaveCount(5)
+    ->toHaveKey('id');

# Шардинг за часом (Time-Balanced Sharding)

Ця функція з'явилася ще у версії 4.6.0, але вона надзвичайно корисна для CI. Замість того, щоб ділити тести між машинами просто за кількістю файлів (що часто призводить до простою однієї машини, поки інша працює), Pest розподіляє їх на основі реального часу виконання.

# Нові Expectations

Додано вісім нових методів для перевірки форматів, які раніше було незручно перевіряти вручну:

expect('nuno@pestphp.com')->toBeEmail();
expect('01ARZ3NDEKTSV4RRFFQ69G5FAV')->toBeUlid();
expect('192.168.1.1')->toBeIpAddress();
expect('00:1a:2b:3c:4d:5e')->toBeMacAddress();
expect('example.com')->toBeHostname();
expect('example.co.uk')->toBeDomain();
expect('Zm9vYmFy')->toBeBase64();
expect('deadbeef')->toBeHexadecimal();

# Оновлення до Pest 5

Pest 5 вимагає PHP 8.4+ та PHPUnit 13. Основні зусилля під час оновлення, швидше за все, стосуватимуться переходу на нову версію PHPUnit. Сам процес оновлення Pest зазвичай займає лише кілька хвилин і не містить критичних змін в API.

Просто оновіть версію у composer.json:

-    "pestphp/pest": "^4.0",
+    "pestphp/pest": "^5.0",

# Корисні посилання

Ви можете ознайомитися з повним анонсом Pest 5 та інструкцією з оновлення на офіційному сайті, а також переглянути документацію до нових плагінів.

Pest створений та підтримується Нуно Мадуро. Вихідний код та деталі релізу доступні на GitHub у репозиторії pestphp/pest.

Популярні

Інше, що варто прочитати

60 Оновлено 26 червня, 2026

Усе, що нам відомо про Livewire 4

Нова версія Livewire 4, представленої Келебом Порзіо на Laracon US 2025, обіцяє значні покращення у швидкості та організації компонентів. Які з інноваційних функцій підкорять ваше серце? Читайте далі, щоб дізнатися більше про те, як Livewire 4 полегшить вашу роботу

15 Оновлено 26 червня, 2026

Випущено Livewire 3.6

Laravel Livewire випустив нову версію 3.6, яка приносить з собою цікаві HTML-директиви для управління видимістю DOM-елементів і JavaScript-діями. Досліджуйте нові можливості Livewire, що допоможуть вам створити ще більш інтерактивні користувацькі інтерфейси!

12 Оновлено 26 червня, 2026

Управління доступом у Filament за допомогою плагіна Shield

Дізнайтеся, як пакет Filament Shield забезпечує управління доступом до ваших панелей, ресурсів і віджетів у Laravel. Ця стаття розкриває основні можливості пакету, включаючи просту установку та підтримку багатокористувацьких середовищ — не пропустіть!