Pest 5 débarque avec Test Impact Analysis, outils pour agents IA et évals
Nuno Maduro a annoncé Pest 5 à la Laracon US 2026.
Cette version apporte un moteur de Test Impact Analysis qui a réduit la suite de 19 000 tests de Laravel Cloud de 3 minutes à 5 secondes, ainsi que des plugins pour la vérification par agents IA, les évals LLM, PHPStan et Rector. PHP 8.4 et PHPUnit 13 sont requis.
Nuno Maduro a annoncé Pest 5 sur scène à la Laracon US 2026 à Boston et a tagué v5.0.0 pendant la conférence. Cette nouvelle version majeure du framework de test PHP exige PHP 8.4 et fonctionne sur PHPUnit 13.
La fonctionnalité phare est le moteur Tia (Test Impact Analysis). Lors du premier run, il enregistre quels tests touchent quels fichiers ; ensuite, `./vendor/bin/pest --parallel --tia` n'exécute que les tests affectés par vos modifications et rejoue les autres depuis le cache. La suite de plus de 19 000 tests de Laravel Cloud serait passée de 3 minutes à 5 secondes. Les résultats en cache conservent la couverture complète des lignes et branches, donc les rapports `--coverage` et les seuils `--min` se comportent comme si toute la suite avait tourné. Le graphe de dépendances dépasse PHP : modifier une migration ne relance que les tests ayant interrogé cette table, éditer un composant JS partagé suit le graphe de modules Vite jusqu'aux pages Inertia concernées, et toucher un template Blade relance les tests qui l'ont rendu. Laravel, Symfony, Livewire, Inertia et les assets navigateur sont détectés automatiquement via Composer. Les fichiers sont normalisés avant hachage (espaces, commentaires et docblocks supprimés), donc un passage de Pint ne déclenche rien. L'enregistrement de la baseline requiert PCOV ou Xdebug ; la CI peut l'enregistrer une fois par merge sur main, mais le partage exige une GitHub CLI authentifiée et ne fonctionne que sur GitHub. Le comportement se configure dans tests/Pest.php via `pest()->tia()` avec des méthodes comme `always()`, `locally()`, `baselined()` et `filtered()`.
Le plugin Agent (pestphp/pest-plugin-agent) permet aux agents de codage IA de vérifier leurs modifications. L'option `--agent` exécute un extrait de code comme un test isolé nommé « verify », avec factories, RefreshDatabase et fakes Laravel disponibles — par exemple créer un utilisateur et vérifier qu'une requête dashboard renvoie OK. Avec le plugin de test navigateur installé, les sondes peuvent piloter un vrai navigateur et vérifier les effets de bord côté backend. C'est pensé comme un retour rapide, pas comme un remplacement des tests de régression commités.
Le plugin Evals (pestphp/pest-plugin-evals) traite le non-déterminisme des sorties LLM en notant la qualité plutôt qu'en vérifiant l'égalité, via l'API expect() habituelle. Les évals appellent de vrais modèles, donc elles sont ignorées lors des runs normaux et ne s'exécutent qu'avec `--evals`. Les expectations déterministes comme toContain(), toMatch(), toBe() et toBeJson() n'ont besoin d'aucun driver. Les expectations notées acceptent un seuil de 0.0 à 1.0 (0.7 par défaut) : toBeRelevant(), toBeSafe(), toBeFactual(), toBeSimilar() et toPassJudge() pour des critères en langage naturel, plus toHaveToolCalls() et toFollowTrajectory() pour l'usage des outils par les agents, repeat() pour l'échantillonnage et toPassScorer() pour des scorers personnalisés. Le scoring passe par Laravel AI par défaut, avec des drivers judge et embeddings remplaçables via closures ou classes personnalisées.
Le support PHPStan officiel (pestphp/pest-plugin-phpstan) était très demandé. Le plugin lit Pest.php pour déterminer ce qu'est $this dans les closures de test, supporte les styles uses(TestCase::class)->in(...) et pest()->extend(...), et s'enregistre automatiquement avec phpstan/extension-installer. Les types se propagent dans les chaînes d'expectations, toBeInt() affine les unions, les propriétés définies dans beforeEach() sont typées, et les expectations impossibles comme expect(10)->toStartWith('1') sont signalées. Des règles supplémentaires couvrent les closures statiques, $this dans beforeAll(), les descriptions dupliquées et les références throws()/covers() invalides, avec des identifiants stables comme pest.expectation.impossible.
Le plugin Rector (pestphp/pest-plugin-rector) livre 60 règles réparties entre style de codage et mises à jour de version. Le set de style réécrit les assertions PHP brutes en matchers (par exemple en combinant count et vérification de clé en toHaveCount(5)->toHaveKey('id')), convertit les assertions PHPUnit en expect() et transforme les tests d'exception try/catch en toThrow(). Les sets de mise à jour sous PestLevelSetList sont cumulatifs ; aperçu avec --dry-run.
Le sharding équilibré par le temps, introduit dans Pest v4.6.0, répartit les shards CI selon la durée mesurée plutôt que le nombre de fichiers : enregistrez les durées avec --update-shards, commitez tests/.pest/shards.json, et --shard=1/4 les exploite automatiquement.
Huit nouvelles expectations couvrent les vérifications de format fastidieuses : toBeEmail(), toBeUlid(), toBeIpAddress(), toBeMacAddress(), toBeHostname(), toBeDomain(), toBeBase64() et toBeHexadecimal(), chacune avec un message d'échec personnalisé optionnel et une négation via not.
La mise à niveau consiste à passer pestphp/pest et les plugins Pest à ^5.0 dans composer.json. Le guide estime l'opération à environ deux minutes, sans rupture d'API au-delà des changements de version ; l'essentiel des frictions viendra de PHPUnit 13 lui-même.
Tribune des lecteurs
Pas encore de contributions — lance le débat.
Lance la discussion
Pas de compte ni de mot de passe — saisis simplement ton adresse e-mail et nous t’envoyons un lien de connexion à usage unique. Première visite ? Tout se met en place automatiquement.
Ton évaluation sera appliquée automatiquement après ta connexion.
Vérifie ta boîte mail
Nous avons envoyé un lien de connexion à …. Ouvre-le sur cet appareil — cet onglet te connectera automatiquement.
En attente de ton clic …
·