Behavior Driven Development
Cédric BRASSEUR
Mis à jour le 22/04/2025
Introduction au BDD
- Historique, objectifs, TDD, ATDD,...
ATDD
- Présentation d'une ATDD
- Sélénium, WebDriver & Locator
- Mise en place d'une ATDD complète (workshop guidé)
Principes associés au BDD
- Notion de comportement & scénario
- Format Gherkin& Exemple de scénario
BDD mise en pratique
- Mise en place de scénario (en .NET avec SpecFlow), organisation des tests, architecture
BDD
Behavior Driven Development
Objectifs BDD :
(Graphique non représentatif)
Depuis son arrivée en 2006 / 2007, la popularité de la méthodologie de développement en se basant sur le comportement (BDD) n'a de cesse d'augmenter.
Pourquoi ?
Vanguard Group Feedbacks
Voici la liste des avantages que j'ai pu en sortir :
J'irai même plus loin que ça, en disant que dans mon expérience, BDD permet de complètement retiré l'équipe de recettage à la fin de la chaîne en temps que testeurs QA.
Ils interviennent essentiellement lors de la phase de réalisation des scénarios.
Test Driven Development : Vous devriez tous savoir ce que c'est mais rappelons le rapidement.
Les règles :
Test d'acceptation : Réalisation d'un test visant à vérifier la conformité d'un produit par rapport aux spécifications définies.
Pendant très longtemps, ces tests étaient réalisées manuellement, soit par l'équipe de développement, soit par une équipe de recettage.
Automatisation :
Comme on l'a rapidement évoqué, le Behavior Driven Development a vu le jour afin de pouvoir directement démarrer des users stories utilisées en méthodes agiles afin de réaliser nos tests d'acceptation directement en tests d'interface, ou en tests unitaires.
User story:
As a visitor
I want to Login
So I can access to profil page
Acceptance Criteria :
Given visitor fill username and password
When visitor click on login button
Then user is connected and is on profil page
Feature : Login
Scenario : Login and go to profil page
Given visitor fill username and password
When visitor click on login button
Then user is connected and is on profil page
User story
Scenario
Feuille de route des exercices
WS_guidé : Partie 1
WS_simple_BDD
WS_guidé :
Partie 2
Cette formation contient peu de théorie, mais beaucoup de pratique. Après avoir analysé ensemble un exemple complet, nous allons réaliser plusieurs workshops.
ATDD
BDD Calculator
BDD
WS_noté :
BDD complète
Tests d'interface avec Selenium
avec Selenium
Pour simplifier la formation vu sa durée assez courte, je préfère vous montrer et vous faire réaliser des tests d'interface classique, sans la partie architecturale qui n'apporte pas grand chose à la formation.
Je vous montrerai et vous expliquerai l'utilité de la partie ATDD et je vous fournirai directement les sources pour que vous puissiez l'exploiter (son but étant surtout d'avoir des helpers qui enveloppent la partie Selenium tout en la testant)
Les tests d'interface vérifient que les développements sont cohérents et fonctionnent sur toutes les plateformes cibles (par exemple, dans le web on vérifie chaque navigateurs)
A savoir :
Selenium est un framework qui va nous permettre de réaliser nos tests d'interface, il permet par exemple d'ouvrir le navigateur, accéder à une URL, vérifier la présence d'un élément, cliquer sur un boutton, remplir un input,...
Une classe des plus utilisé de Selenium est IWebElement, elle permet de réaliser plusieurs opérations sur notre navigateur, ainsi que d'utiliser les éléments qu'elle permet d'identifier.
Les méthodes à connaître sont : FindElement(), FindElements(), Navigate(), Close(), Quit().
Sur un élément récupéré, vous avez des méthodes telles que Click(), SendKeys(), ...
La class By va nous permettre d'identifier de plusieurs façons nos éléments d'interface.
Honnêtement, nous n'allons quasiment qu'utiliser du By.Id() dans cette formation, mais il peut être intéressant pour vous de voir les expressions XPath.
Les packages Nuget
Pour utiliser Selenium, il nous faudra ajouter deux packages Nuget au projet :
GeckoDriver est le driver pour Firefox, il est le plus simple des driver à utiliser car il n'y a pas de soucis de version exacte à matcher.
Créer un WebDriver
La première étape est assez simple, il nous faut créer le WebDriver. Pour l'instant et pour cette étape, vous pouvez faire ça directement depuis votre Program.cs
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
IWebDriver driver = new FirefoxDriver(); // Ou new ChromeDriver() ou new SafariDriver(),...
Accéder à une page
driver.Navigate().GoToUrl("https://example.com");
Vérifier la présence d'un élément
Maintenant, nous pouvons utiliser le Driver pour réaliser différentes opérations relatives à notre interface.
IWebElement element = driver.FindElement(By.Id("my-element-id"));
if (element != null)
Console.WriteLine("L'élément est présent !");
else
Console.WriteLine("L'élément est introuvable.");
Cliquer sur un bouton
IWebElement button = driver.FindElement(By.Id("my-element-id"));
button.Click();
Remplir un input
IWebElement input = driver.FindElement(By.Id("my-element-id"));
input.Clear(); // optionnel, ça clear juste l'input
input.SendKeys("Valeur que je veux mettre dans mon input");
Tester une interface pour remplir des numéros de cartes bancaire
N'hésitez pas à me demander de l'aide
(et autres prérequis)
Les tests d'acceptation que nous allons réaliser sont des scénarios définis par des étapes qui doivent être respectées pour réaliser une opération sur un logiciel.
Ces tests peuvent être et sont très généralement des tests d'interface.
Nous allons voir comment réaliser ces tests d'acceptation sous forme de tests d'interface.
ATDD est souvent associé au BDD et en est l'initiateur, c'est pourquoi nous allons commencer par réaliser une ATDD avant de faire une BDD
C'est un TDD, mais avec notre interface, en gros.
L'objectif est de réaliser des tests d'interface automatisés sur l'intégralité de notre code.
Pour vous montrer le concept d'ATDD, je vais vous présenter un projet de tests d'interface sur l'outil bWAPP.
Nous allons devoir réaliser plusieurs étapes pour y arriver. Vous devrez ensuite réaliser toutes ces étapes en suivant le workshop guidé (sur le jeu du serpent).
Voici un schéma du projet d'exemple (réutilisable en partie pour d'autres projets) de mise en place d'une ATDD sur bWAPP.
ATDD (Tests)
1. Config
Contient les configurations nécessaires du projet
1. Config
Contient les configurations nécessaires du projet
1. Config
Contient les configurations nécessaires du projet
2. Base Class
Démarre et configure le WebDriver gérant notre navigateur
1. Config
Contient les configurations nécessaires du projet
3. Helper
Helper de gestion des composants Web
Contient les tests que l'on réalise pour l'intégralité du projet
MSTest est un framework de tests que l'on va utiliser tout au long de notre formation.
Les choses à savoir :
MSTest est un framework de tests que l'on va utiliser tout au long de notre formation. Au cas où voici la liste des attributs MsTests :
Il est également possible de réaliser des assertions, visant à vérifier qu'un contenu correspond à ce qui est attendu, quelque soit la comparaison effectuée.
Exemples :
Si besoin de plus d'informations sur la réalisation de tests MSTest, visitez :
https://docs.microsoft.com/fr-fr/dotnet/core/testing/unit-testing-with-mstest
Partie 1 : IConfig + ConfigReader + appsettings.json & CustomExceptions
Nous allons avoir besoin d'un fichier de configuration et de pouvoir en lire les propriétés
Ceci se fait en plusieurs étapes :
Comme vu précédemment, elle permet de réaliser plusieurs opérations sur notre navigateur, ainsi que d'utiliser les éléments qu'elle permet d'identifier.
Les méthodes à connaître sont : FindElement(), FindElements(), Navigate(), Close(), Quit().
Sur un élément récupéré, vous avez des méthodes telles que Click(), SendKeys(), ...
La class By va nous permettre d'identifier de plusieurs façons nos éléments d'interface.
Honnêtement, nous n'allons quasiment qu'utiliser du By.Id() dans cette formation, mais il peut être intéressant pour vous de voir les expressions XPath.
Partie 2 : Mise en place de test des navigateurs & IWebDriver
La première chose à faire lors d'une ATDD est de tester le lancement de notre navigateur et l'arrivée sur l'url présente dans notre fichier de configuration. Nous allons avoir besoin de Selenium et des WebDriver pour démarrer le navigateur.
Ceci se fait en plusieurs étapes :
IWebDriver propose plusieurs méthodes qui nous seront utiles : Navigate(), Close(), Quit(),...
Ainsi que des propriétés : Url, Title,...
Partie 3 : BaseClass & ObjectRepository
Ce que l'on souhaite maintenant faire, c'est mettre en place notre base qui va nous permettre de toujours démarrer notre navigateur, sur la bonne url provenant du fichier de config (et en profiter pour se donner un accès simple au ConfigReader)
Ici, ça se fait en :
Partie 4 : Handling WebElement & ComponentHelper
Maintenant, on veut pouvoir interagir avec les composants d'interface et en faire des ComponentHelper pour en faciliter l'utilisation.
Ici, ça se fait en :
Locator : By
Vu dans une slide précedente
ATDD sur bWAPP
Je vous propose un workshop complètement guidé pour réaliser de l'ATDD (que l'on complètera par du BDD dans la partie suivante).
Cette ATDD sera sur une interface de bWAPP qui est une application utilisée dans la sécurité
Ce workshop va être assez long, prenez bien le temps de comprendre et posez moi des questions ! Ne restez pas bloqué.
Partie 1 : Envoyer Guided_Workshop.md
docker run -d -p 80:80 hackersploit/bwapp-docker
Comportements, scénarios &
Langage Gherkin
Une méthodologie basée sur le comportement
On démarre des user stories pour créer des scénarios, ces derniers vont définir des étapes permettant de réaliser le scénario.
On établit donc un projet qui répond exactement à la demande du client selon la définition des scénarios utilisateurs.
Behavior Driven Development prends les principes du TDD et des méthodes agiles.
Les besoins utilisateurs sont traduits en code est sont directement testables.
Incluant un recettage automatisé en intégration continue.
Explique ce qui défini qu'un système fonctionne correctement.
Ecris de manière à ce qu'ils soient toujours en Pass/Fail via une assertion.
Définis les conditions des critères d'acceptations
Définis les étapes du scénario et les sorties voulues (que ce soit en terme de page accédée, en terme de résultat attendu par une étape, etc...)
Ici chaque étape n'est pas forcément une assertion
Structuration de nos scénarios dans une langue compréhensible par un client
C'est un langage spécifique au domaine qui décris les comportements attendus par notre logiciel. Attention, ça n'est que la partie qui en décris le comportement. Il peut être écrit dans n'importe quel langue (français, anglais,...).
Il agit également en tant que documentation de l'application.
On démarre toujours avec un fichier FeatureFile.
Exemple de FeatureFile
Exemple de génération Step Definition plus loin...
Structuration de nos scénarios dans une langue compréhensible par un client
Chaque étape d'un scénario fait office d'un test unique (pour ne pas dire unitaire et confondre avec le test unitaire classique).
Plusieurs mots clés possibles : Given, When, Then,...
Fichier FeatureFile complet
Exemple de génération Step Definition plus loin...
Vous avez la possibilité de passer des arguments à vos tests
Ces arguments vont vous permettre de réaliser des tests avec des paramètres / arguments particuliers pour vos StepDefinitions
Fichier FeatureFile exemple
Exemple de génération Step Definition plus loin...
Vous avez la possibilité de passer des arguments à vos tests
Ces arguments peuvent aussi être mis en place sous forme de tables pour passer plusieurs arguments et donc réaliser le scenario plusieurs fois en fonction du nombre de ligne de votre tableau exemples
Fichier FeatureFile exemple
Exemple de génération Step Definition plus loin...
Vous avez la possibilité de passer des tableaux à vos tests
Ces arguments peuvent aussi être mis en place sous forme de tables pour passer plusieurs arguments et donc réaliser la step avec un ensemble d'éléments différents.
Fichier FeatureFile exemple
Exemple de génération Step Definition plus loin...
En .Net, on va utiliser SpecFlow nous permettant de générer nos StepDefinitions découlant de notre fichier FeatureFile vu précédement.
Exemple simple
Passer des tableaux à ses tests StepDefinitions associées
Ici, l'objectif est donc d'exécuter les tests plusieurs fois avec plusieurs paramètres différents pour chaque exécution de tests.
Fichier Step Definition exemple
Particularité génération auto
Passer des tableaux à son étape
Le tableau permettra de boucler sur un ensemble d'éléments pour en tester leur cohérence (par exemple, une combobox pour choisir le département, puis pouvoir choisir les villes associées au département)
Fichier Step Definition exemple
Tout d'abord SpecFlow utilise Cucumber pour interpréter le Gherkin
Les autres outils pour faire du BDD :
Cucumber est à la fois une automatisation des tests, des spécifications exécutables et de la documentation dite "vivante".
Comment fonctionne Cucumber concrètement ? On démarre de fichier Feature, on définit les scénarios, les étapes. Et ça nous génère les StepDefinitions, le code "behind", et automatise le tout.
Comme vu précédemment, les fichier FeatureFile contiennent la définition des étapes en anglais.
SpecFlow / Cucumber permet de générer le fichier StepDefinition définissant le contenu de nos steps et donc de nos tests
Pour mieux appréhender le BDD, nous allons voir un exemple concret réalisé sur l'ATDD présentée lors d'une partie précédente de cette formation.
BDD Simple Calculator
N'hésitez pas à me demander de l'aide
BDD sur le Jeu du Serpent
Réalisez la seconde partie du Workshop, celle-ci devrait être bien plus simple et rapide que la précédente.
Il se peut que vous ayez quelques soucis de configuration, pas de panique normalement tout est expliqué dans le workshop.
Sinon, demandez de l'aide, n'hésitez pas !
ET réalisez un scénario complet de test du jeu jusqu'à la fin, à vous de trouver un moyen d'y arriver :)
Partie 2 : Utiliser Guided_Workshop.md
Un design pattern définissant une classe correspondante à chaque page de l'interface
Contient :
Schéma rapide pour notre cas d'utilisation
PageBase classe
1. Constructeur initialisant la page
2. Actions & Navigations communes
HomePage
WebElements + Actions spécifiques + Navigations
LoginPage
WebElements + Actions spécifiques + Navigations
EnterBugPage
WebElements + Actions spécifiques + Navigations
Pourquoi un POM ?
Par définition, le POM a pour but de simplifier la gestion de nos interfaces, les actions et interactions de pages,...
C'est pourquoi le Page Object Model est souvent associé à l'ATDD et par induction au Behavior Driven Development.
Il n'est pas difficile à mettre en place, juste très chronophage si l'on l'applique sur une grosse interface utilisateur.
L'image a effectivement aucun rapport...
Ce n'est pas prévu dans ce cours, mais c'est important je trouve.
Il reste deux choses qui me semblent importantes que l'on a pas vu :
BON COURAGE !
(après c'est fini)
Evaluation mise en place d'un Behavior Driven Development
Mise en place d'une BDD pour validation d'un trio d'input simulant l'entrée d'une carte bancaire.
4 scénarios à développer :
Vous devez développer une mini page web pour réaliser du BDD avec des tests d'acceptation comme vu lors de la première partie de ce cours. La mise en place d'un appsettings est en bonus.