Réaliser une bonne recette au concombre - Agile France 2016

Post on 15-Jan-2017

341 views 0 download

Transcript of Réaliser une bonne recette au concombre - Agile France 2016

RÉALISER UNE BONNE RECETTE AU CONCOMBRE

#bdd

shoun.ichida@viseo.comShoun ICHIDA

@ishoun

#AgileFrance2016

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

SOLUTIONS

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

LE GHERKIN

8

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

Feature: List recipes

He should be able to select oneAnd

LE GHERKIN

8

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

9

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

9

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

9

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

10

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

12

# 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

13

@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}

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 17 025 lignes de code, 285 classes, 1196 fonctions

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é

Cumulative Flow diagram

20

Mesure de la qualité du code (1/2)

21

Mesure de la qualité du code (2/2)

22

Meilleure mais… É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

Et la productivité dans tout ça ?

23

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 ?

25

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 http://fr.slideshare.net/ichidashoun/

Retrouvez-moià Culture Kanban le 29 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 ?

?