"Spécification par l'exemple" par l'exemple : le BDD démystifié

download "Spécification par l'exemple" par l'exemple : le BDD démystifié

If you can't read please download the document

Transcript of "Spécification par l'exemple" par l'exemple : le BDD démystifié

Spcification par l'exemple

par l'exemple:

le BDD dmystifi

gerald.reinhart@ .com

Introduction

Constats

Le BDD, c'est quoi?

Exemple complet sur une Bibliothque

Conclusion

Spcification par l'exemple
par l'exemple :
le BDD dmystifi

gerald.reinhart@ .com

But : donner envie d'essayer ou de ressayer le BDD

Introduction

gerald.reinhart@ .com

Qui suis je: dveloppeur dcomplex ayant eu des expriences diverses avec le BDD (checs et succs)But: donner envie d'essayer ou de ressayer le BDD Spcification par l'exemple par l'exempleRetirer la magieTrucs et astuces issu de la pratiquePour ceux qui l'on pratiquer: une approche diffrente

Un PO lors de la dmo du produit
aprs une itration

Constats

gerald.reinhart@ .com

L'expression des besoins est difficile:Des lments sous entendu peuvent tre oubli lors du dveloppement

Des cas d'erreur ou cas limites peuvent tre gr que lors du dveloppement

Sans cas prcis, l'interprtation du besoin exprim peut diverg du besoin rel

La boucle de rtro action est trop longue entre l'expression du besoin et la dmonstration du produit

Les tests fonctionnels qui clignotent
Les tests fonctionnels non exhaustifs

Constats

gerald.reinhart@ .com

Lors que les tests fonctionnels sont crit aprs:Ne sont pas exhaustifs

Sont difficiles crire

Peuvent clignoter s'ils sont bass sur les donnes vivantes

La documentation fonctionnelle
aprs de nombreuses itrations
et rajustements du besoin

Constats

gerald.reinhart@ .com

Documentation fonctionnelle: peu de confianceDans un cycle itratif de dveloppement la documentation suit difficilement l'tat rel du produit.

On ne peut jamais savoir si la documentation est juste, mme si elle l'est.

Spcification par l'exemple

Tests fonctionnels

Documentation excutable

BDD, c'est quoi?

gerald.reinhart@ .com

Behavior Driven Development

Spcification par l'exemple

Scenario: les suggestions proposes sont populaires, disponibles et adaptes l'ge de l utilisateur Etant donn l'utilisateur "Tim" Et il a "4" ans Et les catgories populaires pour cet ge sont | categorieId | nom | | cat1 | Coloriage | | cat2 | Comptines | Et les livres disponibles pour les catgories "cat1,cat2" sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 | Quand on demande "2" suggestions Alors les suggestions sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 |

BDD, c'est quoi?

gerald.reinhart@ .com

Tests fonctionnels

BDD, c'est quoi?

gerald.reinhart@ .com

Tests fonctionnels

BDD, c'est quoi?

gerald.reinhart@ .com

Documentation excutable

BDD, c'est quoi?

gerald.reinhart@ .com

Bibliothque

User Story implmenter

gerald.reinhart@ .com

DEV

PO

CatgorieLes catgories des livres, catgories populaires par ge

SuggestionFournit des suggestions de livres

UtilisateurBase utilisateurs,
ge, livres lus...

RechercheFournit des livres,
recherche textuelle,
recherche multi-critres
(catgorie, popularit, disponibilit)

RservationRservation de livres,Livres disponibles

Utilisateur

Bibliothque

User Story implmenter

gerald.reinhart@ .com

En tant qu'utilisateur de la bibliothque,
je souhaite des suggestions de livres afin de faire des dcouvertes

Critres d'acceptance - Livre non lu par l'utilisateur - Livre disponible

Bibliothque

User Story implmenter

gerald.reinhart@ .com

PO

PO

Les suggestions doivent tre adaptes l'ge de l'utilisateur

Pour une meilleur dcouverte, les livres doivent venir de diffrentes catgories

En tant qu'utilisateur de la bibliothque, Je souhaite des suggestions de livres Afin de faire des dcouvertes

User Story

Bibliothque

User Story implmenter

gerald.reinhart@ .com

DEV

Focalis sur comment rcuprer les livres, oublie que le livre doit tre non lu par l'utilisateur

Manire la plus simple: faire une recherche sur la popularit des livres

En tant qu'utilisateur de la bibliothque, je souhaite des suggestions de livres afin de faire des dcouvertes

User Story

Bibliothque

User Story implmenter

gerald.reinhart@ .com

PO

PO

Scenario: fournir des suggestions de livres

Etant donn un utilisateur Quand on demande suggestions Alors les suggestions proposes sont populaires, disponibles et adaptes l ge de l utilisateur Et les suggestions proviennent de catgories diffrentes

Manque: des exemples!

Bibliothque

crire les scnarios

gerald.reinhart@ .com

Scenario: fournir des suggestions de livres Etant donn l'utilisateur depuis le web service http://my.library.com/user/user1 | cl | valeur | | userId | user1 | | ge | 4 | Et les livres depuis le web service http://my.library.com/search?popular=true&available=true | livreId | titre | categorieId | | lv11 | livre11 | cat1 | | lv21 | livre21 | cat2 | | lv31 | livre31 | cat3 | Quand on appelle http://localhost:9998/suggestions?userId=user1&maxResults=2 Alos le code http retourn est "200" Et les suggestions sont | livreId | titre | categorieId | | lv11 | livre11 | cat1 | | lv21 | livre21 | cat2 |

DEV

Un peu trop technique

limite nombre suggestions

Pas lis l'utilisateur

Exemple non parlant

Bibliothque

crire les scnarios

gerald.reinhart@ .com

Scenario: fournir des suggestions de livres Etant donn l'utilisateur "Tim" Et il a "4" ans Et les catgories populaires pour cet ge sont | categorieId | nom | | cat1 | Coloriage | | cat2 | Comptines | | cat3 | Histoires pour le dodo | Et les livres disponibles pour les catgories "cat1,cat2,cat3" sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 | | lv31 | Histoires de la mer | cat3 | Quand on demande "3" suggestions Alors les suggestions sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 | | lv31 | Histoires de la mer | cat3 |

Manque: limite nombre suggestions

Manque: jamais lus

Manque: catgories diffrentes

DEV

PO

PO

Bibliothque

crire les scnarios

gerald.reinhart@ .com

Scenario: fournir des suggestions de livres Etant donn l'utilisateur "Tim" Et il a "4" ans Et les catgories populaires pour cet ge sont | categorieId | nom | | cat1 | Coloriage | | cat2 | Comptines | | cat3 | Histoires pour le dodo | Et les livres disponibles pour les catgories "cat1,cat2,cat3" sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 | | lv31 | Histoires de la mer | cat3 | Quand on demande "2" suggestions Alors les suggestions sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 |

DEV

PO

PO

limite nombre suggestions

32Bibliothque

crire les scnarios

gerald.reinhart@ .com

Manque: jamais lus

Manque: catgories diffrentes

Scenario: fournir des suggestions de livres Etant donn l'utilisateur "Tim" Et il a "4" ans Et les catgories populaires pour cet ge sont | categorieId | nom | | cat1 | Coloriage | | cat2 | Comptines | | cat3 | Histoires pour le dodo | Et les livres disponibles pour les catgories "cat1,cat2,cat3" sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv12 | Colorier les vaches | cat1 | | lv21 | Comptines de la ferme | cat2 | | lv31 | Histoires de la mer | cat3 | Quand on demande "2" suggestions Alors les suggestions sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | | | | | lv21 | Comptines de la ferme | cat2 |

Manque: jamais lus

DEV

PO

PO

42

catgories diffrentes

Bibliothque

crire les scnarios

gerald.reinhart@ .com

Scenario: fournir des suggestions de livres Etant donn l'utilisateur "Tim" Et il a "4" ans Et les catgories populaires pour cet ge sont | categorieId | nom | | cat1 | Coloriage | | cat2 | Comptines | | cat3 | Histoires pour le dodo | Et les livres disponibles pour les catgories "cat1,cat2,cat3" sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv12 | Colorier les vaches | cat1 | | lv13 | Colorier les chevaux | cat1 | | lv21 | Comptines de la ferme | cat2 | | lv31 | Histoires de la mer | cat3 | Et l'utilisateur a dja reserv les livres suivants | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | When on demande "2" suggestions Then les suggestions sont | livreId | titre | categorieId | | | | | | lv12 | Colorier les vaches | cat1 | | lv21 | Comptines de la ferme | cat2 |

DEV

PO

PO

On teste quoi au juste?

52

jamais lus

Bibliothque

crire les scnarios

gerald.reinhart@ .com

Scenario: les suggestions proposes sont populaires, disponibles et adaptes l'ge de l utilisateur Etant donn l'utilisateur "Tim" Et il a "4" ans Et les catgories populaires pour cet ge sont | categorieId | nom | | cat1 | Coloriage | | cat2 | Comptines | | cat3 | Histoires pour le dodo | Et les livres disponibles pour les catgories "cat1,cat2,cat3" sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 | | lv31 | Histoires de la mer | cat3 | Quand on demande "3" suggestions Alors les suggestions sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 | | lv31 | Histoires de la mer | cat3 |

DEV

PO

PO

Scenario 1: cas nominal
=> minimal

Bibliothque

crire les scnarios

gerald.reinhart@ .com

Scenario: limiter le nombre de suggestions Etant donn l'utilisateur "Tim" Et il a "4" ans Et les catgories populaires pour cet ge sont | categorieId | nom | | cat1 | Coloriage | | cat2 | Comptines | | cat3 | Histoires pour le dodo | Et les livres disponibles pour les catgories "cat1,cat2,cat3" sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 | | lv31 | Histoires de la mer | cat3 | When on demande "2" suggestions Then les suggestions sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 |

DEV

PO

PO

Scenario 2: cas nominal

23Bibliothque

crire les scnarios

Simplifions encore le scenario

gerald.reinhart@ .com

Scenario: limiter le nombre de suggestions Etant donn un utilisateur Et "3" livres sont disponibles pour
les catgories populaires pour cet ge When on demande "2" suggestions Then "2" suggestions sont proposes
parmi les livres prcdents

DEV

PO

PO

Scenario 2: cas nominal

Bibliothque

crire les scnarios

gerald.reinhart@ .com

Scenario: l'utilisateur n'a jamais rserv les livres qu'on lui suggre Etant donn l'utilisateur "Tim" Et il a "4" ans Et les catgories populaires pour cet ge sont | categorieId | nom | | cat1 | Coloriage | | cat2 | Comptines | Et les livres disponibles pour les catgories "cat1,cat2" sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 | Et l'utilisateur a dja reserv les livres suivants | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | Quand on demande "1" suggestions Alors les suggestions sont | livreId | titre | categorieId | | | | | | lv21 | Comptines de la ferme | cat2 |

DEV

PO

PO

Scenario 3: cas nominal

Droulons l'algo

Bibliothque

crire les scnarios

gerald.reinhart@ .com

Scenario: les livres suggrs proviennent de catgories diffrentes Etant donn l'utilisateur "Tim" Et il a "4" ans Et les catgories populaires pour cet ge sont | categorieId | nom | | cat1 | Coloriage | | cat2 | Comptines | Et les livres disponibles pour les catgories "cat1,cat2" sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv12 | Colorier les vaches | cat1 | | lv21 | Comptines de la ferme | cat2 | Quand on demande "2" suggestions Alors les suggestions sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 |

DEV

PO

PO

Scenario 4: cas nominal

Droulons l'algo

Bibliothque

crire les scnarios

Scenario: s'il n y a pas assez de suggestions, on propose des livres de mmes catgories

Etant donn l'utilisateur "Tim" Et il a "4" ans Et les catgories populaires pour cet ge sont | categorieId | nom | | cat1 | Coloriage | | cat2 | Comptines | Et les livres disponibles pour les catgories "cat1,cat2" sont | livreId | titre | categoryId | | lv11 | Colorier les poules | cat1 | | lv12 | Colorier les vaches | cat1 | | lv21 | Comptines de la ferme | cat2 | Quand on demande "3" suggestions Alors les suggestions sont | livreId | titre | categoryId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 | | lv12 | Colorier les vaches | cat1 |

DEV

PO

PO

Scenario 5: cas limite

Droulons l'algo

Bibliothque

crire les scnarios

gerald.reinhart@ .com

Scenario: pas de suggestion pour les utilisateurs inconnus Etant donn l'utilisateur "Lise" Et l'utilisateur est inconnu Quand on demande "3" suggestions Alors aucune suggestion est propose

DEV

PO

PO

Scenario 6: cas limite

Bibliothque

crire les scnarios

gerald.reinhart@ .com

Scenario: un service pour lequel le systme dpend est indisponible Etant donn l'utilisateur "Tim" Et impossible de rcuprer les informations de l utilisateur Quand on demande "3" suggestions Alors le systme est temporairement indisponible

DEV

PO

PO

Scenario 7: cas d'erreur

Bibliothque

crire les scnarios

gerald.reinhart@ .com

Scenario: les suggestions proposes sont populaires, disponibles et adaptes l'ge de l utilisateur

Etant donn l'utilisateur depuis le web service http://my.library.com/user/Tim | cl | valeur | | userId | Tim | | ge | 4 | Et les catgories depuis le web service
http://my.library.com/category?popular=true&age=4 | categorieId | nom | | cat1 | Coloriage | | cat2 | Comptines | | cat3 | Histoires pour le dodo | Et les livres depuis le web service
http://my.library.com/search?categories=cat1,cat2,cat3&available=true | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 | | lv31 | Histoires de la mer | cat3 | Et les livres depuis le web service http://my.library.com/user/Tim/books | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | Quand on appelle http://localhost:9998/suggestions?userId=Tim&maxResults=3 Alors le code http retourn est "200" Et les suggestions sont | livreId | titre | categorieId | | lv11 | Colorier les poules | cat1 | | lv21 | Comptines de la ferme | cat2 | | lv31 | Histoires de la mer | cat3 |

DEV

PO

PO

Scenario 1version technique

Bibliothque

crire les scnarios

gerald.reinhart@ .com

DEV

PO

PO

Scenario 7

En tant qu'utilisateur de la bibliothque,
je souhaite des suggestions de livres afin de faire des dcouvertes

Scenario 1

Scenario 2

Scenario 3

Scenario 4

Scenario 5

Scenario 6

Scenario 1

Scenario 6

Scenario 7

Scenario 0

Bibliothque

Organiser les scnarios

gerald.reinhart@ .com

DEV

PO

PO

Scenario 7

En tant qu'utilisateur de la bibliothque,
Je souhaite des suggestions de livres Afin de faire des dcouvertes

Scenario 1

Scenario 2

Scenario 3

Scenario 4

Scenario 5

Scenario 6

@limit_case

@error_case

@nominal_case

@level_0_
high_level

@level_1_
specification

@level_2_
technical

Scenario 1

Scenario 6

Scenario 7

Scenario 0

Bibliothque

Organiser les scnarios

gerald.reinhart@ .com

User Story

Critres
acceptances

Implmentation

Dmonstration

Implmentation

Implmentation

Les suggestions doivent tre lies l'utilisateur!

2 ou 3 semaines

PO

PO

DEV

DEV

Bibliothque

Sans spcification par l'exemple

gerald.reinhart@ .com

DEV

User Story

Dmonstration

2 ou 3 semaines

@limit

@error

@nominal

@level_0

@level_1

@level_2

Scenario

Scenario

Scenario

Scenario

Scenario

Scenario

Scenario

criture
Scnario

2 ou 3
heures

BDD

Critres
acceptances

BDD

BDD

PO

PO

@level_2

@level_1

DEV

DEV

DEV

PO

PO

Bibliothque

Feuille de route

gerald.reinhart@ .com

gerald.reinhart@ .com

Rendre excutable le scenario

Scenario valid

BDD

Modifier
le code
principal

TDD

crire un test

Rusinage du code

TDD

TDD

DEV

TDD

Bibliothque

Rendre excutable les scnarios

gerald.reinhart@ .com

CatgorieSuggestionUtilisateurRservation

Utilisateur

Catgories
populaire
pour un ge

Livres disponibles
pour des catgories

DEV

nom

suggestions

RechercheBibliothque

Rendre excutable les scnarios

gerald.reinhart@ .com

Age et Rservations dj effectues

Excuter

Variables
de contexte

Etant donn

Catgorie

Suggestion

Code de production

Code permettant le BDD

UtilisateurRechercheRservation

DEV

Bibliothque

Rendre excutable les scnarios

gerald.reinhart@ .com

Avoir un code flexible pour simuler les comportements

MockerMockerMockerVrifierAlors

AppelQuand

DEV

Bibliothque

Rendre excutable les scnarios

Le dveloppeur est compltement guid

gerald.reinhart@ .com

BDD

DEV

Pont entre l'tape du scnario et le code

Bibliothque

Rendre excutable les scnarios

Variables de contexte

gerald.reinhart@ .com

BDD

DEV

Bibliothque

Rendre excutable les scnarios

Dfinition du comportement des mocks

gerald.reinhart@ .com

BDD

DEV

Bibliothque

Rendre excutable les scnarios

Activation du code rel

gerald.reinhart@ .com

gerald.reinhart@ .com

BDD

DEV

Bibliothque

Rendre excutable les scnarios

Le code principal n'existe pas.

Vrification du rsultat

gerald.reinhart@ .com

BDD

DEV

Bibliothque

Implmenter les scnarios

crivons rellement le code

gerald.reinhart@ .com

BDD

DEV

Bibliothque

Implmenter les scnarios

Premier scnario implment!

Le code est activ dans les conditions de production

gerald.reinhart@ .com

BDD

DEV

Bibliothque

Implmenter les scnarios

gerald.reinhart@ .com

BDD

BDD

Rutilisation de phrase excutable d'un niveau d'abstraction infrieur

Bibliothque

Implmenter les scnarios

Rutilisation de phrase excutable

DEV

gerald.reinhart@ .com

BDD

BDD

BDD

DEV

Bibliothque

Implmenter les scnarios

Gnrer des donnes pour rendre le scenario plus lisible

gerald.reinhart@ .com

BDD

BDD

BDD

DEV

Bibliothque

Implmenter les scnarios

gerald.reinhart@ .com

Implmenter un scnario de haut niveau d'abstraction

BDD

BDD

BDD

DEV

Bibliothque

Implmenter les scnarios

Fin du cycle d'implmentation

gerald.reinhart@ .com

BDD

BDD

BDD

Bibliothque

Tests de non rgression

DEV

@limit

@error

@nominal

@level_0

@level_1

@level_2

Scenario

Scenario

Scenario

Scenario

Scenario

Scenario

Scenario

Code versionn

Intgration
continue

Non rgression rgulire

Scenarios BBD

gerald.reinhart@ .com

Bibliothque

Exposer la documentation gnre

DEV

@limi

@erro

@nominal

@level_0

@level_

@lev

Scenario

Code versionn

Intgration
continue

Scenarios BBD

PO

PO

@level_0

@level_2

@level_1

Gnre

Import

Import

Documentationprojet

@level_0

@nominal

@limit

@error

Inclusion de la documentation gnre dans la documentation projet en fonction du niveau d'abstraction et du type de scenario

gerald.reinhart@ .com

Bibliothque

Exposer la documentation gnre

gerald.reinhart@ .com

Conclusion

gerald.reinhart@ .com

Spcification par l'exemplecollaboration troite DEV / PO est ncessaire

utiliser des exemples permet d'ouvrir la discussion et de trouver de nombreux cas

permet une boucle de rtroaction trs rapide

Tests fonctionnelstests stables et rapides

le dveloppeur est guid, le code est tir par les tests

le code doit tre flexible pour mocker les interactions extrieures

Documentation excutableissue du code, la documentation est jour toujours

documentation exhaustive

Spcification par l'exemplecollaboration troite DEV / PO est ncessaire

utiliser des exemples permet d'ouvrir la discussion et de trouver de nombreux cas

permet une boucle de rtroaction trs rapide

dfinition au plus tt de toutes les entres sorties ncessaires

une User Story est dcline en nombreux scnarios

les phrases excutables sont rutilisables

dcouper les scnarios

garder uniquement le ncessaire

garder en tte la lisibilit

les donnes non ncessaires la lisibilit peuvent tre dfinies dans le code de test

ne pas hsiter drouler l'algorithme partir des exemples du scnario

envisager diffrents cas: cas nominal, cas limite, cas d'erreur

organiser les scnarios: niveau d'abstraction, diffrents cas

Tests fonctionnelsle dveloppeur est guid, le code est tir par les testson crit uniquement le code ncessaire ni plus ni moins

tests exhaustifs

le code doit tre flexible pour mocker les interactions extrieures

une boucle BDD induit plusieurs boucles TDD

tests stables: les interactions extrieures sont mockes

Documentation excutableissue du code, la documentation est jour toujours

les niveaux d'abstraction permettent d'inclure une documentation adapte au contexte de la documentation projet

Conclusion

gerald.reinhart@ .com

quipe plus soude autour du projet mme niveau de comprhension pour tout le monde

les scenarios constituent un contrat clair

Confiance

VlocitBoucle de rtroaction trs courte pour le PO

En cas de changement d'orientation produit la modification des tests et du code est plus rapide

Conclusion

gerald.reinhart@ .com

Facteur d'checDEV ou PO non impliqus

BDD appliqu en cours de projet, doit tre fait en premier

Conclusion

gerald.reinhart@ .com

Essayez!
(ou ressayez!)

Questions?

Conclusion (dtails)

gerald.reinhart@ .com

Spcification par l'exemplecollaboration troite DEV / PO est ncessaire

utiliser des exemples permet d'ouvrir la discussion et de trouver de nombreux cas

permet une boucle de rtroaction trs rapide

dfinition au plus tt de toutes les entres sorties ncessaires

une User Story est dcline en nombreux scnarios

les phrases excutables sont rutilisables

dcouper les scnarios

garder uniquement le ncessaire

garder en tte la lisibilit

les donnes non ncessaires la lisibilit peuvent tre dfinies dans le code de test

ne pas hsiter drouler l'algorithme partir des exemples du scnario

envisager diffrents cas: cas nominal, cas limite, cas d'erreur

organiser les scnarios: niveau d'abstraction, diffrents cas

Tests fonctionnelsle dveloppeur est guid, le code est tir par les tests

on crit uniquement le code ncessaire ni plus ni moins

tests exhaustifs

le code doit tre flexible pour mocker les interactions extrieures

une boucle BDD induit plusieurs boucles TDD

tests stables: les interactions extrieures sont mockes

Documentation excutableissue du code, la documentation est jour toujours

les niveaux d'abstraction permettent d'inclure une documentation adapte au contexte de la documentation projet