Skip to main content

Qu’est-ce que Pest

Pest est un framework de test construit au-dessus de PHPUnit et adopté par défaut dans tout nouveau projet depuis Laravel 11. Il reprend l’ensemble des assertions de PHPUnit tout en offrant une syntaxe concise basée sur des closures. Principales différences avec PHPUnit :
Les tests Pest étant exécutés par PHPUnit, ils cohabitent sans problème avec des tests PHPUnit existants. Lancez-les avec php artisan test ou vendor/bin/pest.

Quand utiliser describe / it / test

test()

La définition la plus simple : le nom du test sert directement de description.

it()

Permet une écriture proche du langage naturel, sous forme « it should… ».

describe()

Regroupe des tests apparentés. Utile pour partager un beforeEach() ou structurer logiquement un fichier.
describe() peut être imbriqué, mais une imbrication trop profonde nuit à la lisibilité. Deux niveaux au maximum sont un bon repère.

Expectation API

expect() est la syntaxe d’assertion propre à Pest. Vous pouvez enchaîner des conditions via des appels de méthodes.

Assertions de base

Assertions sur des modèles

Chaîne and()

Vérifier chaque élément d’un tableau avec each()

Tests paramétrés avec les datasets

Pour exécuter la même logique avec plusieurs entrées, utilisez dataset() ou with() en ligne.

Dataset en ligne

Datasets nommés

Définissez les datasets dans le répertoire tests/Datasets.

Dataset dynamique avec closure

Tests unitaires avec Mockery

Mocker un service

Espion (spy)

Contrairement à un mock, un spy exécute l’implémentation tout en enregistrant les appels.

Mock partiel

Mocker certaines méthodes et laisser les autres utiliser l’implémentation réelle.

Tests d’appels d’API externes via HTTP fake

Http::fake() permet de stubber les réponses sans envoyer de vraie requête HTTP.

Fake de base

Tester une réponse d’erreur

Simuler une panne réseau

Fake d’événements, e-mails et notifications

Event::fake()

Vous pouvez ne fake que certains événements et laisser les autres s’exécuter réellement.

Mail::fake()

Notification::fake()

Tester une commande Artisan

Tester une commande interactive

RefreshDatabase et LazilyRefreshDatabase

RefreshDatabase

Rollback la base après chaque test pour garantir un état propre. Les migrations sont exécutées au démarrage de la suite de tests.

LazilyRefreshDatabase

Là où RefreshDatabase prépare les migrations pour tous les tests, LazilyRefreshDatabase diffère les migrations jusqu’à ce qu’un test modifie effectivement la base. Cela accélère les suites où de nombreux tests ne touchent pas à la base.
Pour la plupart des projets, RefreshDatabase est un choix sûr. Envisagez LazilyRefreshDatabase uniquement quand la suite est grande et comporte beaucoup de tests sans base de données.

Mesure de la couverture de code

Xdebug ou PCOV est requis.
La mesure de couverture allonge significativement le temps d’exécution des tests. En CI, il est recommandé de la faire dans un job dédié ou uniquement lors des pull requests.

Pages associées

Introduction aux tests

Découvrez la façon d’écrire des tests avec Laravel et l’utilisation de php artisan test.
Dernière modification le 13 juillet 2026