BEHAVIOR DRIVEN DEVELOPMENT?
QU’EST-CE QUE C’EST ?
➡ Une méthodologie de développement
3
QU’APPORTE-T-ELLE ?
➡ Une meilleure compréhension du besoin
4
BESOIN CRITÈRES D’ACCEPTATION
TESTS D’ACCEPTATIONDÉVELOPPEMENT
Equipe métier
Equipe projet
QU’APPORTE-T-ELLE ?
➡ Un complément au Test Driven Development (TDD)
5
TEST QUI RÉUSSITTESTQUI ÉCHOUE
Refactoring
TDDTest
d’Acceptation
CAS PRATIQUE
En tant que cuisinier, je souhaite noter une liste de recette La liste des recettes disponibles est représentée sur une page Lorsque je sélectionne une recette, je peux lui attribuer une note comprise entre 0 et 10
He should be able to select oneAnd
LE GHERKIN
7
Given
When
Then
Scenario:List all existing recipes
"shoun" is authenticated
He requests a list of all recipes
He should have a list of recipes
And There is an existing list of recipes
Feature: List recipes
public class RecipeStepdefs { @Given("^\"([^\"]*)\" is authenticated$") public void userIsAuthenticated(String user) throws Throwable { // Your test goes here }
CUCUMBER-JVM
8
public class RecipeStepdefs { @Given("^\"([^\"]*)\" is authenticated$") public void userIsAuthenticated(String user) throws Throwable { // Your test goes here } @When("^He requests a list of all recipes$") public void heRequestsAListOfAllRecipes() throws Throwable { // Your test goes here } @Then("^He should have a list of recipes$") public void heShouldHaveAListOfRecipes() throws Throwable { // Your test goes here }}
public class RecipeStepdefs { @Given("^\"([^\"]*)\" is authenticated$") public void userIsAuthenticated(String user) throws Throwable { // Your test goes here }
CUCUMBER-JVM
8
Expression régulièrepublic class RecipeStepdefs {
@Given("^\"([^\"]*)\" is authenticated$") public void userIsAuthenticated(String user) throws Throwable { // Your test goes here } @When("^He requests a list of all recipes$") public void heRequestsAListOfAllRecipes() throws Throwable { // Your test goes here } @Then("^He should have a list of recipes$") public void heShouldHaveAListOfRecipes() throws Throwable { // Your test goes here }}
public class RecipeStepdefs { @Given("^\"([^\"]*)\" is authenticated$") public void userIsAuthenticated(String user) throws Throwable { // Your test goes here }
CUCUMBER-JVM
8
Expression régulière
Given "shoun" is authenticated
public class RecipeStepdefs { @Given("^\"([^\"]*)\" is authenticated$") public void userIsAuthenticated(String user) throws Throwable { // Your test goes here } @When("^He requests a list of all recipes$") public void heRequestsAListOfAllRecipes() throws Throwable { // Your test goes here } @Then("^He should have a list of recipes$") public void heShouldHaveAListOfRecipes() throws Throwable { // Your test goes here }}
CUCUMBER-JVM - JAVA 8
9
public class RecipeJava8Stepdefs implements En { public RecipeJava8Stepdefs() { Given("^\"([^\"]*)\" is authenticated$", () -> { // Your test goes here }); When("^He requests a list of all recipes$", () -> { // Your test goes here }); Then("^He should have of list of recipes$", () -> { // Your test goes here }); }}
I18N ?
# language: fr
11
# language: frFonctionnalité: noter une recette En tant que cuisinier Je souhaite noter mes recettes Afin de les évaluerScénario: Je peux noter la recette "Salade de concombre" Etant donné que "Shoun" est authentifié Et que les recettes suivantes existent: | Name | Description | | Salade de concombre | Salade à base de concombre | | Salade de crudité | Mélange de salade, tomate et crevettes | Lorsqu' il attribue la note de 8 la recette "Salade de concombre" Alors la recette "Salade de concombre" devrait avoir la note de 8
IMPLÉMENTATION
12
@Etantdonné("^que \"([^\"]*)\" est authentifié$") public void queEstAuthentifié() throws Throwable { // TODO } @Et("^que les recettes suivantes existent:$") public void queLesRecettesSuivantesExistent(List<Recipe> recipes) throws Throwable { // TODO} @Lorsqu("^il attribue la note de (\\d+) la recette \"([^\"]*)\"$") public void ilAttribueLaNoteDeLaRecette(int mark, String recipe) throws Throwable { // TODO} @Alors("^la recette \"([^\"]*)\" devrait avoir la note de (\\d+)$") public void laRecetteDevraitAvoirLaNote(String recipe, int mark) throws Throwable { // TODO}
SOLUTIONS
Retour d’expérience
Mais le BDD, ça fonctionne vraiment ?
Projet existant Java & AngularJS 4 Développeurs 1 Business Analyst 1 Scrum Master
24 Sprints 40% de couverture de tests Client insatisfait Produit jamais utilisé en production
Contexte
16
ContexteÉquipe hétérogène
17
Je connais le produit…
J’ai lu des trucs sur le BDD
C’est vrai? Moi pas du tout..
J’ai un peu d’expérience en
BDD
Mais qu’est-ce que c’est que cette
@&%#$ ??!
… et je suis un super Scrum
Master
DéroulementCérémonie BDD
18
Que pensez-vous
de…Je pense que cette fonctionnalité…
Pourquoi ne faisons-nous
pas…
Si on parlait de…
Meilleure compréhension du besoin Moins de retours client Meilleure couverture des tests Meilleure implication de l’équipe de développement Moins de bugs Meilleure productivité
Bénéfices attendus
19
Bénéfices attendus
19
Meilleure compréhension du besoin Moins de retours client Meilleure couverture des tests Meilleure implication de l’équipe de développement Moins de bugs Meilleure productivité
Quelles en sont les causes ? Écriture des Gherkin Sous-évaluation des tâches Refactoring coûteux sur les anciennes fonctionnalités Coupler BDD et TDD Réticence à l’écriture de scénarios
Pas d’amélioration de la productivité
20
Retour d’expérienceTous les membres de l’équipe doivent s’impliquer Le Product Owner / Business Analyst doit être rigoureux Le temps passé sur les scénarios est utile mais coûteux Si les besoins évoluent le risque de régression est maîtrisé Une nette amélioration qualitative a été remarquée
JGiven ATDD
Alternatives à cucumber ?
22
Pour aller plus loin…
RÉFÉRENCES
http://dannorth.net/introducing-bdd/ http://blog.viseo-bt.com/as-viseo-we-went-to-cukeup-so-we-can-improve-our-bdd/ https://cucumber.io https://github.com/sichida/BDD-examples/tree/agile_france/cucumber-example https://github.com/cucumber/cucumber/wiki/Spoken-languages
Retrouvez-moià Agile France le 17 juin à Agile Laval le 30 juin sur le blog Viseo http://blog.viseo-bt.com/author/s-ichida/ sur Twitter @ishoun
Avez-vous des questions ?
?