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