Pourquoi le code ne fonctionne-t-il pas si le métier a dit "tout est bon" ?
\n\nAvez-vous déjà vécu cette situation : le manager affirme que la tâche est résolue, les tests passent au vert, mais l'utilisateur est toujours mécontent ? Un grand classique. Le problème n'est pas dans le code — le problème est dans la communication. Nous parlons des langues différentes : le métier raisonne en scénarios, tandis que les développeurs raisonnent en méthodes et en classes. C'est là que le BDD (Behaviour-Driven Development) — le développement piloté par le comportement — vient à la rescousse. Et oui, sur PHP, cela fonctionne à merveille.
\n\nDans cet article, nous allons voir comment le BDD en PHP aide à transformer des "envies" vagues en tests compréhensibles, que le manager comme le programmeur peuvent saisir. Vous découvrirez en quoi le BDD diffère du TDD classique, comment rédiger des scénarios en Gherkin et quels outils (Behat, PHPSpec) simplifient réellement la vie.
\n\nQu'est-ce que le BDD en termes simples ?
\n\nBDD (Behaviour-Driven Development) est une évolution du TDD. Si le TDD se concentre sur "comment tester le code", le BDD répond à la question "que doit faire le code pour que le métier soit satisfait".
\n\nImaginez que vous développez une boutique en ligne. Au lieu d'un test abstrait comme "la méthode applyDiscount() doit réduire le prix", vous rédigez un scénario :
\n\n- \n
- Étant donné : un article à 1000 roubles dans le panier \n
- Quand : l'utilisateur saisit le code promo "SALE10" \n
- Alors : le total du panier devient 900 roubles \n
Ce scénario est lisible par n'importe qui — du marketeur au chef d'équipe. Pas de magie, seulement le comportement du système.
\n\nBDD vs TDD : quelle est la différence ?
\n\nBeaucoup confondent ces concepts. Mettons les points sur les i :
\n\n- \n
- TDD — on écrit un test, puis le code, puis on refactorise. Les tests sont écrits par un développeur pour un développeur. \n
- BDD — on écrit d'abord un scénario de comportement en langage naturel, puis on l'automatise. Les scénarios sont rédigés en dialogue avec le métier. \n
Le BDD ne remplace pas le TDD, il le complète. Vous écrivez toujours des tests unitaires, mais vous disposez désormais d'une "documentation vivante" sous forme de scénarios.
\n\nOutils BDD pour PHP : choisir son arme
\n\nL'écosystème PHP propose deux outils principaux pour le développement piloté par le comportement : Behat et PHPSpec. Ils répondent à des objectifs différents.
\n\nBehat — le soldat universel
\n\nBehat est un framework de tests d'acceptation. Il fonctionne avec le langage Gherkin (le fameux "Étant donné-Quand-Alors"). Behat est idéal pour les tests d'intégration, la vérification d'API, d'interfaces web et de logique métier de haut niveau.
\n\nPHPSpec — le microscope du développeur
\n\nPHPSpec est un outil de spécification de classes. Il est plus proche du TDD, mais avec la philosophie du BDD : vous décrivez le comportement d'un objet, pas ses détails internes. PHPSpec est parfait pour les tests unitaires de la logique métier.
\n\nDans cet article, nous nous concentrerons sur Behat, car il illustre le mieux le behaviour-driven development en PHP.
\n\nÉcrire notre premier scénario BDD en PHP avec Behat
\n\nCréons un exemple concret. Supposons que nous développions un système de fidélité. Le client bénéficie d'une réduction de 10% si le montant de la commande dépasse 5000 roubles.
\n\nÉtape 1 : Installation de Behat
\n\ncomposer require --dev behat/behat\n\nEnsuite, initialisons le projet :
\n\nvendor/bin/behat --init\n\nLa structure sera la suivante :
\n\nfeatures/\n bootstrap/\n FeatureContext.php\n discount.feature\n\nÉtape 2 : Rédiger un fichier feature en Gherkin
\n\nCréons le fichier features/discount.feature :
Feature: Calcul de la réduction pour les clients fidèles\n En tant que responsable commercial\n Je veux offrir une réduction de 10% sur les commandes à partir de 5000 roubles\n Afin de stimuler les gros achats\n\n Scenario: La commande dépasse le seuil de réduction\n Étant donné des articles dans le panier pour un montant de 6000 roubles\n Quand je demande le montant total\n Alors le montant total doit être