Le BDD (Behavior Driven Développement) est une méthode de développement selon laquelle on écrit avec une phrase une fonctionnalité de d'une application pour commencer à l’implémenter. Dans cet article, nous allons voir les étapes de mise en place d'un BDD dans une application Symfony2.
Installation
Commençons par installer behat.
Note : Si vous utilisez xdebug, augmentez la valeur de debug.max_nesting_level (256 par exemple)
Configuration
Créez le fichier behat.yml à la racine de votre projet (même niveau à composer.json)
Lançons la commande
Essayons de lancer behat
On voit que nous n'avons aucun scénario pour le moment, nous allons donc en définir un. Supposons que l'une des fonctionnalités de notre application est activée seulement lorsque quelqu'un lance la command
"php app/console blog:greeting", le texte "hello world" doit être affiché.
Création des Scénarios
A la racine du bundle, créez un dossier Features (même niveau que Controller), et placez les fichiers *.feature
A titre d’exemple, créez un fichier nommé commands.feature dont voici le contenu :
Ce scénario comporte deux étapes (steps) :
Etape1: When I run "php app/console blog:greeting"
Etape2: Then I should see "hello world"
Lançons behat de nouveau,
Là, on nous dit que certaines étapes ne sont pas dans le FeatureContext. On va alors copier le bout de code proposé et le coller dans notre classe FeatureContext (AppBundle\Features\Context\FeatureContext).
Il ne reste plus qu’à compléter leurs implémentations. Dans la méthode iRun par exemple, vous allez expliquer à behat ce que signifie « I run » dans l’étape 1 (when I run "php app/console blog:greeting») ; "php app/console blog:greeting" va être injecté en paramètre de la méthode iRun.
NB : La classe PendingException se trouve dans le namespace Behat\Behat\Tester\Exception au cas où vous l’utilisez.
Ci-dessous, un exemple de classe FeatureContext (FeatureContext.php), on peut y voir une implémentation possible de la méthode iRun et iShouldSee,
A ce stade, si nous exécutons behat, nous remarquons que le step 2 échoue, car le texte "hello world" n'est pas affiché.
Rappelons qu'il s'agit d'un BDD, comme en TDD, on écrit les tests d'abord, au début ils échouent parce que l'on a pas encore écrit les implémentations. Ici on a décrit les fonctionnalités, mais pour le moment rien n'a été implémenté, le fail ci-dessus est normal. Cela nous indique que nous somme sur la bonne voie (celle de la BDD).
Développement des fonctionnalités
La prochaine étape est d'éliminer le fail ci-dessus, en commençant par développer les fonctionnalités. Dans notre exemple il s'agit de créer la command blog:greeting (une commande Symfony2) qui doit afficher "hello world" comme on a spécifié dans les scénarios ci-dessus.
Maintenant tous les steps passent.
Voilà ! Nous venons de faire un BDD. Dans la pratique, on peut imaginer convertir les demandes de clients, les spécifications fonctionnelles directement en scénarios behat et ne commencer à développer qu'une fois que ces derniers sont en place.