Pourquoi Pest est devenu la valeur par défaut de Laravel
À partir de Laravel 11, quand vous créez un projet aveclaravel new, Pest est sélectionné comme framework de test par défaut. PHPUnit est utilisé depuis longtemps comme outil de test standard en PHP, mais Pest s’appuie sur PHPUnit tout en offrant une écriture de tests plus concise et lisible.
Pest s’exécute au-dessus de PHPUnit, si bien que les tests PHPUnit existants tournent tels quels. La migration peut se faire progressivement.
Principales différences avec PHPUnit
Syntaxe des tests
La différence la plus évidente est la manière d’écrire un test.- Pest
- PHPUnit
test() de Pest accepte une closure. Aucune classe ni méthode à définir : l’intention est claire dès la première ligne. it() s’utilise de la même manière — it('can login', ...) se lit comme une phrase anglaise.
API expect()
Le point le plus emblématique de Pest est l’assertion en chaînage via expect().
expect($value)->toBe(), ->toBeNull(), ->toContain(), ->toHaveCount() — les assertions se lisent naturellement. Vous pouvez chaîner plusieurs assertions.
Setup et teardown
L’équivalent desetUp() en PHPUnit est beforeEach() ; celui de tearDown() est afterEach().
Datasets — tests table-driven
Pour rejouer la même logique de test avec plusieurs jeux de données, utilisezdataset.
'email absent', etc.) est ajouté au nom du test, permettant de voir en un coup d’œil quel cas a échoué.
Tests arch() — vérification automatique de l’architecture
arch() de Pest vérifie la structure du code. Vous pouvez faire respecter automatiquement des règles telles que « les contrôleurs ne dépendent pas directement des modèles » ou « les modèles étendent Eloquent ».
laravel() regroupe les règles alignées sur les conventions Laravel : nommage des modèles, héritage des contrôleurs, structure des middlewares, etc.
Exemple concret dans un projet Laravel
Créer un test
Utiliser directement les helpers de test Laravel
Pest étend leTestCase Laravel : actingAs(), assertDatabaseHas(), les helpers HTTP, etc. sont tous disponibles.
Factories et transactions de base
Les traitsRefreshDatabase et DatabaseTransactions s’appliquent facilement avec uses(). Écrit en tête de fichier, cela s’applique au fichier entier.
tests/Pest.php, RefreshDatabase est activé automatiquement pour tous les tests Feature. Chaque fichier peut le surcharger si nécessaire.
Cohabitation avec les tests PHPUnit existants
Pest et PHPUnit cohabitent au sein d’un même projet. Il n’y a rien à réécrire ; il suffit d’écrire les nouveaux tests en style Pest.Depuis Laravel 11, si Pest est installé,
php artisan test l’utilise automatiquement.Étapes de migration
- Ajouter la configuration
uses()danstests/Pest.php - Écrire les nouveaux tests en style Pest
- Migrer progressivement les tests PHPUnit existants en vérifiant qu’ils passent
Conclusion
Pest n’est pas un remplaçant de PHPUnit : c’est une couche supérieure qui l’enveloppe. Son intégration à Laravel est profonde, au point d’être choisi par défaut à la génération d’un starter kit. Le coût d’introduction dans un projet existant est faible ; commencer par les nouveaux tests suffit à récolter les bénéfices.
Écrire plus de tests, c’est trouver plus tôt les bugs et abaisser la barrière psychologique du refactor. Pest est un outil qui vise à réduire précisément « la friction de l’acte d’écrire un test ».
Documentation officielle Pest
Datasets, couverture, exécution parallèle, etc. : consultez la documentation officielle pour toutes les fonctionnalités de Pest.