SlideShare ist ein Scribd-Unternehmen logo
1 von 58
1
Spécification par l'exemple
par l'exemple :
le BDD démystifié
gerald.reinhart@ .com
2
● Introduction
● Constats
● Le BDD, c'est quoi ?
● Exemple complet sur une Bibliothèque
● Conclusion
Spécification par l'exemple
par l'exemple :
le BDD démystifié
gerald.reinhart@ .com
3
But : donner envie d'essayer
ou de réessayer le BDD
Introduction
gerald.reinhart@ .com
4
Un PO lors de la démo du produit
après une itération
Constats
gerald.reinhart@ .com
5
Les tests fonctionnels qui clignotent
Les tests fonctionnels non exhaustifs
Constats
gerald.reinhart@ .com
6
La documentation fonctionnelle
après de nombreuses itérations
et réajustements du besoin
Constats
gerald.reinhart@ .com
7
● Spécification par l'exemple
● Tests fonctionnels
● Documentation exécutable
BDD, c'est quoi ?
gerald.reinhart@ .com
Behavior Driven Development
8
Spécification par l'exemple
  Scenario: les suggestions proposées sont populaires, disponibles
            et adaptées à l'âge de l utilisateur
             
    Etant donné l'utilisateur "Tim"
    Et il a "4" ans
    Et les catégories populaires pour cet âge sont
      | categorieId | nom                    |
      | cat1        | Coloriage              |
      | cat2        | Comptines              |
    Et les livres disponibles pour les catégories "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
9
Tests fonctionnels
BDD, c'est quoi ?
gerald.reinhart@ .com
10
Tests fonctionnels
BDD, c'est quoi ?
gerald.reinhart@ .com
11
Documentation exécutable
BDD, c'est quoi ?
gerald.reinhart@ .com
Bibliothèque User Story à implémenter
gerald.reinhart@ .com
DEVPO
Catégorie
Les catégories des
livres, catégories
populaires par âge
Suggestion
Fournit des
suggestions de livres
Utilisateur
Base utilisateurs,
âge, livres lus...
Recherche
Fournit des livres,
recherche textuelle,
recherche multi-critères
(catégorie, popularité, disponibilité…)
Réservation
Réservation de livres,
Livres disponibles
Utilisateur
Bibliothèque User Story à implémenter
gerald.reinhart@ .com
En tant qu'utilisateur de la bibliothèque,
je souhaite des suggestions de livres
afin de faire des découvertes
En tant qu'utilisateur de la bibliothèque,
je souhaite des suggestions de livres
afin de faire des découvertes
Critères d'acceptance
- Livre non lu par l'utilisateur
- Livre disponible
Critères d'acceptance
- Livre non lu par l'utilisateur
- Livre disponible
Bibliothèque User Story à implémenter
gerald.reinhart@ .com
POPO
Les suggestions doivent
être adaptées à l'âge de
l'utilisateur
Pour une meilleur
découverte, les livres
doivent venir de
différentes catégories
En tant qu'utilisateur de la bibliothèque, Je souhaite des suggestions de livres Afin de faire des découvertesEn tant qu'utilisateur de la bibliothèque, Je souhaite des suggestions de livres Afin de faire des découvertes
User Story
Bibliothèque User Story à implémenter
gerald.reinhart@ .com
DEV
Focalisé sur comment
récupérer les livres, oublie
que le livre doit être non lu
par l'utilisateur
Manière la plus simple :
faire une recherche sur
la popularité des livres
En tant qu'utilisateur de la bibliothèque, je souhaite des suggestions de livres afin de faire des découvertesEn tant qu'utilisateur de la bibliothèque, je souhaite des suggestions de livres afin de faire des découvertes
User Story
Bibliothèque User Story à implémenter
gerald.reinhart@ .com
POPO
  Scenario: fournir des suggestions de livres
    Etant donné un utilisateur
    Quand on demande suggestions
    Alors les suggestions proposées sont populaires, disponibles 
          et adaptées à l âge de l utilisateur 
    Et    les suggestions proviennent de catégories différentes
Manque : des exemples !
Bibliothèque Écrire les scénarios
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 liés à l'utilisateur
Exemple non parlant
Bibliothèque Écrire les scénarios
gerald.reinhart@ .com
  Scenario: fournir des suggestions de livres
             
    Etant donné l'utilisateur "Tim"
    Et il a "4" ans
    Et les catégories populaires pour cet âge sont
      | categorieId | nom                    |
      | cat1        | Coloriage              |
      | cat2        | Comptines              |
      | cat3        | Histoires pour le dodo |
    Et les livres disponibles pour les catégories "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 : catégories différentes
DEVPOPO
Bibliothèque Écrire les scénarios
gerald.reinhart@ .com
  Scenario: fournir des suggestions de livres
             
    Etant donné l'utilisateur "Tim"
    Et il a "4" ans
    Et les catégories populaires pour cet âge sont
      | categorieId | nom                    |
      | cat1        | Coloriage              |
      | cat2        | Comptines              |
      | cat3        | Histoires pour le dodo |
    Et les livres disponibles pour les catégories "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        |
     
DEVPOPO
limite nombre
suggestions
3
2
Bibliothèque Écrire les scénarios
gerald.reinhart@ .com
Manque : jamais lus
Manque : catégories différentes
  Scenario: fournir des suggestions de livres
             
    Etant donné l'utilisateur "Tim"
    Et il a "4" ans
    Et les catégories populaires pour cet âge sont
      | categorieId | nom                    |
      | cat1        | Coloriage              |
      | cat2        | Comptines              |
      | cat3        | Histoires pour le dodo |
    Et les livres disponibles pour les catégories "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
DEVPOPO
4
2
catégories différentes
Bibliothèque Écrire les scénarios
gerald.reinhart@ .com
  Scenario: fournir des suggestions de livres
             
    Etant donné l'utilisateur "Tim"
    Et il a "4" ans
    Et les catégories populaires pour cet âge sont
      | categorieId | nom                    |
      | cat1        | Coloriage              |
      | cat2        | Comptines              |
      | cat3        | Histoires pour le dodo |
    Et les livres disponibles pour les catégories "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 déja 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       |
DEVPOPO
On teste quoi au juste ?
5
2
jamais lus
Bibliothèque Écrire les scénarios
gerald.reinhart@ .com
  Scenario: les suggestions proposées sont populaires, disponibles
            et adaptées à l'âge de l utilisateur
             
    Etant donné l'utilisateur "Tim"
    Et il a "4" ans
    Et les catégories populaires pour cet âge sont
      | categorieId | nom                    |
      | cat1        | Coloriage              |
      | cat2        | Comptines              |
      | cat3        | Histoires pour le dodo |
    Et les livres disponibles pour les catégories "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        |
DEVPOPO
Scenario 1 : cas nominal
=> minimal
Bibliothèque Écrire les scénarios
gerald.reinhart@ .com
  Scenario: limiter le nombre de suggestions
             
    Etant donné l'utilisateur "Tim"
    Et il a "4" ans
    Et les catégories populaires pour cet âge sont
      | categorieId | nom                    |
      | cat1        | Coloriage              |
      | cat2        | Comptines              |
      | cat3        | Histoires pour le dodo |
         Et les livres disponibles pour les catégories "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        |
DEVPOPO
Scenario 2 : cas nominal
2
3
Bibliothèque Écrire les scénarios
Simplifions encore le scenario
gerald.reinhart@ .com
  Scenario: limiter le nombre de suggestions
             
    Etant donné un utilisateur
    Et "3" livres  sont disponibles pour 
           les catégories populaires pour cet âge
  
    When on demande "2" suggestions
    Then "2" suggestions sont proposées 
             parmi les livres précédents
      
DEVPOPO
Scenario 2 : cas nominal
Bibliothèque Écrire les scénarios
gerald.reinhart@ .com
  Scenario: l'utilisateur n'a jamais réservé les livres 
              qu'on lui suggère
             
    Etant donné l'utilisateur "Tim"
    Et il a "4" ans
    Et les catégories populaires pour cet âge sont
      | categorieId | nom                    |
      | cat1        | Coloriage              |
      | cat2        | Comptines              |
    Et les livres disponibles pour les catégories "cat1,cat2" sont
      | livreId | titre                 | categorieId |
      | lv11    | Colorier les poules   | cat1        |
      | lv21    | Comptines de la ferme | cat2        |
    Et l'utilisateur a déja 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        |
DEVPOPO
Scenario 3 : cas nominal
Déroulons l'algo
Bibliothèque Écrire les scénarios
gerald.reinhart@ .com
  Scenario: les livres suggérés proviennent de catégories différentes
             
    Etant donné l'utilisateur "Tim"
    Et il a "4" ans
    Et les catégories populaires pour cet âge sont
      | categorieId | nom                    |
      | cat1        | Coloriage              |
      | cat2        | Comptines              |
    Et les livres disponibles pour les catégories "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        |
DEVPOPO
Scenario 4 : cas nominal
Déroulons l'algo
Bibliothèque Écrire les scénarios
  Scenario: s'il n y a pas assez de suggestions, 
             on propose des livres de mêmes catégories
        Etant donné l'utilisateur "Tim"
    Et il a "4" ans
    Et les catégories populaires pour cet âge sont
      | categorieId | nom                    |
      | cat1        | Coloriage              |
      | cat2        | Comptines              |
    Et les livres disponibles pour les catégories "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       |
DEVPOPO
Scenario 5 : cas limite
Déroulons l'algo
Bibliothèque Écrire les scénarios
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 proposée
DEVPOPO
Scenario 6 : cas limite
Bibliothèque Écrire les scénarios
gerald.reinhart@ .com
  Scenario: un service pour lequel le système dépend est indisponible
             
    Etant donné l'utilisateur "Tim"
    Et impossible de récupérer les informations de l utilisateur
    Quand on demande "3" suggestions
    Alors le système est temporairement indisponible
DEVPOPO
Scenario 7 : cas d'erreur
Bibliothèque Écrire les scénarios
gerald.reinhart@ .com
  Scenario: les suggestions proposées sont populaires, disponibles
            et adaptées à 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 catégories 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        |     
DEVPOPO
Scenario 1 version technique
Bibliothèque Écrire les scénarios
gerald.reinhart@ .com
DEVPOPO
Scenario 7
En tant qu'utilisateur de la bibliothèque,
je souhaite des suggestions de livres
afin de faire des découvertes
En tant qu'utilisateur de la bibliothèque,
je souhaite des suggestions de livres
afin de faire des découvertes
Scenario 1 Scenario 2
Scenario 3
Scenario 4
Scenario 5
Scenario 6
Scenario 1 Scenario 6
Scenario 7
Scenario 0
Bibliothèque Organiser les scénarios
gerald.reinhart@ .com
DEVPOPO
Scenario 7
En tant qu'utilisateur de la bibliothèque,
Je souhaite des suggestions de livres
Afin de faire des découvertes
En tant qu'utilisateur de la bibliothèque,
Je souhaite des suggestions de livres
Afin de faire des découvertes
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
Bibliothèque Organiser les scénarios
gerald.reinhart@ .com
User Story Critères
acceptances
Implémentation
Démonstration
Implémentation
Implémentation
Les suggestions
doivent être
liées à
l'utilisateur !
2 ou 3 semaines
POPO
DEVDEV
Bibliothèque Sans spécification par l'exemple
gerald.reinhart@ .com
DEV
User Story
Démonstration
2 ou 3 semaines
@limit @error@nominal
@level_0
@level_1
@level_2
Scenario
Scenario
Scenario
Scenario Scenario
Scenario Scenario
Écriture
Scénario2 ou 3
heures
BDD
Critères
acceptances
BDD
BDD
POPO
@level_2
@level_1 DEVDEV
DEV
POPO
Bibliothèque Feuille de route
gerald.reinhart@ .comgerald.reinhart@ .com
36
Rendre exécutable
le scenario
Scenario
validé
BDD
Modifier
le code
principal
TDD
Écrire un test
Réusinage
du code
TDD
TDD
DEV
TDD
Bibliothèque Rendre exécutable les scénarios
gerald.reinhart@ .com
Catégorie
Suggestion
Utilisateur
Réservation
Utilisateur
Catégories
populaire
pour un âge
Livres disponibles
pour des catégories
DEV
nom
suggestions
Recherche
Bibliothèque Rendre exécutable les scénarios
gerald.reinhart@ .com
Age et
Réservations
déjà effectuées
Exécuter
Variables
de contexte
Etant donné
Catégorie
Suggestion
Code de production
Code permettant le BDD
Utilisateur
Recherche
Réservation
DEV
Bibliothèque Rendre exécutable les scénarios
gerald.reinhart@ .com
Avoir un code flexible
pour simuler les
comportements
Mocker
Mocker
Mocker
Vérifier
Alors
Appel
Quand
39
DEV
Bibliothèque Rendre exécutable les scénarios
Le développeur est
complétement guidé
gerald.reinhart@ .com
BDD
40
DEV
Pont entre l'étape du
scénario et le code
Bibliothèque Rendre exécutable les scénarios
Variables de contexte
gerald.reinhart@ .com
BDD
41
DEV
Bibliothèque Rendre exécutable les scénarios
Définition du comportement des mocks
gerald.reinhart@ .com
BDD
42
DEV
Bibliothèque Rendre exécutable les scénarios
Activation du code réel
gerald.reinhart@ .comgerald.reinhart@ .com
BDD
43
DEV
Bibliothèque Rendre exécutable les scénarios
Le code principal
n'existe pas….
Vérification du résultat
gerald.reinhart@ .com
BDD
44
DEV
Bibliothèque Implémenter les scénarios
Écrivons réellement le code
gerald.reinhart@ .com
BDD
45
DEV
Bibliothèque Implémenter les scénarios
Premier scénario
implémenté !
Le code est activé dans les
conditions de production
gerald.reinhart@ .com
BDD
46
DEV
Bibliothèque Implémenter les scénarios
gerald.reinhart@ .com
BDD
BDD
Réutilisation de phrase exécutable d'un
niveau d'abstraction inférieur
47
Bibliothèque Implémenter les scénarios
Réutilisation de phrase exécutable
DEV
gerald.reinhart@ .com
BDD
BDDBDD
48
DEV
Bibliothèque Implémenter les scénarios
Générer des données
pour rendre le scenario
plus lisible
gerald.reinhart@ .com
BDD
BDDBDD
49
DEV
Bibliothèque Implémenter les scénarios
gerald.reinhart@ .com
Implémenter un scénario de
haut niveau d'abstraction
BDD
BDDBDD
50
DEV
Bibliothèque Implémenter les scénarios
Fin du cycle d'implémentation
gerald.reinhart@ .com
BDD
BDDBDD
51
Bibliothèque Tests de non régression
DEV
@limit @error@nominal
@level_0
@level_1
@level_2
Scenario
Scenario
Scenario
Scenario Scenario
Scenario Scenario
Code versionné
Intégration
continue
Non régression régulière
Scenarios BBD
gerald.reinhart@ .com
52
Bibliothèque Exposer la documentation générée
DEV
@limi @erro@nomin
al@level_0
@level_
@lev
Sc
en
ari
o
Code
versionné
Intégration
continue
Scenarios
BBD
POPO
@level_0
@level_2
@level_1
Génère
Import
Import
Documentation
projet
@level_0
@nominal
@limit
@error
Inclusion de la documentation générée dans la
documentation projet en fonction du niveau
d'abstraction et du type de scenario gerald.reinhart@ .com
53
Bibliothèque Exposer la documentation générée
gerald.reinhart@ .com
54
Conclusion
gerald.reinhart@ .com
● Spécification par l'exemple
– collaboration étroite DEV / PO est nécessaire
– utiliser des exemples permet d'ouvrir la discussion et de trouver de
nombreux cas
– permet une boucle de rétroaction très rapide
● Tests fonctionnels
– tests stables et rapides
– le développeur est guidé, le code est tiré par les tests
– le code doit être flexible pour mocker les interactions extérieures
● Documentation exécutable
– issue du code, la documentation est à jour toujours
– documentation exhaustive
55
Conclusion
gerald.reinhart@ .com
● Équipe plus soudée autour du projet
– même niveau de compréhension pour tout le monde
– les scenarios constituent un contrat clair
● Confiance
● Vélocité
– Boucle de rétroaction très courte pour le PO
– En cas de changement d'orientation produit la
modification des tests et du code est plus rapide
56
Conclusion
gerald.reinhart@ .com
● Facteur d'échec
– DEV ou PO non impliqués
– BDD appliqué en cours de projet,
doit être fait en premier
57
Conclusion
gerald.reinhart@ .com
Essayez !
(ou réessayez !)
Questions ?
58
Conclusion (détails)
gerald.reinhart@ .com
● Spécification par l'exemple
– collaboration étroite DEV / PO est nécessaire
– utiliser des exemples permet d'ouvrir la discussion et de trouver de nombreux cas
– permet une boucle de rétroaction très rapide
– définition au plus tôt de toutes les entrées sorties nécessaires
– une User Story est déclinée en nombreux scénarios
– les phrases exécutables sont réutilisables
– découper les scénarios
– garder uniquement le nécessaire
– garder en tête la lisibilité
– les données non nécessaires à la lisibilité peuvent être définies dans le code de test
– ne pas hésiter à dérouler l'algorithme à partir des exemples du scénario
– envisager différents cas : cas nominal, cas limite, cas d'erreur
– organiser les scénarios : niveau d'abstraction, différents cas
● Tests fonctionnels
– le développeur est guidé, le code est tiré par les tests
– on écrit uniquement le code nécessaire ni plus ni moins
– tests exhaustifs
– le code doit être flexible pour mocker les interactions extérieures
– une boucle BDD induit plusieurs boucles TDD
– tests stables : les interactions extérieures sont mockées
● Documentation exécutable
– issue du code, la documentation est à jour toujours
– les niveaux d'abstraction permettent d'inclure une documentation adaptée au contexte de la documentation projet

Weitere ähnliche Inhalte

Was ist angesagt?

우아한유스방
우아한유스방우아한유스방
우아한유스방BYUNGHOKIM10
 
Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기영우 박
 
Vert.x for Microservices Architecture
Vert.x for Microservices ArchitectureVert.x for Microservices Architecture
Vert.x for Microservices ArchitectureIdan Fridman
 
[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3
[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3
[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3Ji-Woong Choi
 
Docker and the Linux Kernel
Docker and the Linux KernelDocker and the Linux Kernel
Docker and the Linux KernelDocker, Inc.
 
Uber Cadence Fault Tolerant Actor Framework
Uber Cadence Fault Tolerant Actor FrameworkUber Cadence Fault Tolerant Actor Framework
Uber Cadence Fault Tolerant Actor FrameworkMaxim Fateev
 
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민Hyunjik Bae
 
Profiling your Java Application
Profiling your Java ApplicationProfiling your Java Application
Profiling your Java ApplicationVictor Rentea
 
신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판hyeonjae Cheon
 
Odoo - Create themes for website
Odoo - Create themes for websiteOdoo - Create themes for website
Odoo - Create themes for websiteOdoo
 
[243]kaleido 노현걸
[243]kaleido 노현걸[243]kaleido 노현걸
[243]kaleido 노현걸NAVER D2
 
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기Kiyoung Moon
 
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들Chris Ohk
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드Insub Lee
 
HTML5 Apps on AGL Platform with the Web Application Manager (Automotive Grade...
HTML5 Apps on AGL Platform with the Web Application Manager (Automotive Grade...HTML5 Apps on AGL Platform with the Web Application Manager (Automotive Grade...
HTML5 Apps on AGL Platform with the Web Application Manager (Automotive Grade...Igalia
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
[NDC16] Effective Git
[NDC16] Effective Git[NDC16] Effective Git
[NDC16] Effective GitChanwoong Kim
 
User Story Mapping
User Story MappingUser Story Mapping
User Story MappingNaresh Jain
 

Was ist angesagt? (20)

우아한유스방
우아한유스방우아한유스방
우아한유스방
 
Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기
 
Vert.x for Microservices Architecture
Vert.x for Microservices ArchitectureVert.x for Microservices Architecture
Vert.x for Microservices Architecture
 
[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3
[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3
[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3
 
Docker and the Linux Kernel
Docker and the Linux KernelDocker and the Linux Kernel
Docker and the Linux Kernel
 
Uber Cadence Fault Tolerant Actor Framework
Uber Cadence Fault Tolerant Actor FrameworkUber Cadence Fault Tolerant Actor Framework
Uber Cadence Fault Tolerant Actor Framework
 
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
 
Profiling your Java Application
Profiling your Java ApplicationProfiling your Java Application
Profiling your Java Application
 
신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판
 
Odoo - Create themes for website
Odoo - Create themes for websiteOdoo - Create themes for website
Odoo - Create themes for website
 
[243]kaleido 노현걸
[243]kaleido 노현걸[243]kaleido 노현걸
[243]kaleido 노현걸
 
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
 
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
 
Angular Directives
Angular DirectivesAngular Directives
Angular Directives
 
Sprint backlog
Sprint backlogSprint backlog
Sprint backlog
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드
 
HTML5 Apps on AGL Platform with the Web Application Manager (Automotive Grade...
HTML5 Apps on AGL Platform with the Web Application Manager (Automotive Grade...HTML5 Apps on AGL Platform with the Web Application Manager (Automotive Grade...
HTML5 Apps on AGL Platform with the Web Application Manager (Automotive Grade...
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
[NDC16] Effective Git
[NDC16] Effective Git[NDC16] Effective Git
[NDC16] Effective Git
 
User Story Mapping
User Story MappingUser Story Mapping
User Story Mapping
 

Andere mochten auch

BDD (Behavior Driven Development) - Une voie vers l'agilité
BDD (Behavior Driven Development) - Une voie vers l'agilitéBDD (Behavior Driven Development) - Une voie vers l'agilité
BDD (Behavior Driven Development) - Une voie vers l'agilitéCARA_Lyon
 
TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)
TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)
TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)French Scrum User Group
 
Pizza party 30-09-2011 bdd-cucumber
Pizza party 30-09-2011 bdd-cucumberPizza party 30-09-2011 bdd-cucumber
Pizza party 30-09-2011 bdd-cucumberHervé Leclerc
 
Spécification par l'exemple & Tests d'Acceptance Agile avec cucumber
Spécification par l'exemple & Tests d'Acceptance Agile  avec cucumberSpécification par l'exemple & Tests d'Acceptance Agile  avec cucumber
Spécification par l'exemple & Tests d'Acceptance Agile avec cucumberJean-Michel Garnier
 
Réaliser une bonne recette au concombre - Agile Testing Paris
Réaliser une bonne recette au concombre - Agile Testing ParisRéaliser une bonne recette au concombre - Agile Testing Paris
Réaliser une bonne recette au concombre - Agile Testing ParisShoun Ichida
 
C# Async, un an après
C# Async, un an aprèsC# Async, un an après
C# Async, un an aprèsMicrosoft
 
Mode offline et Synchronisation avec Windows Phone et Windows 8.1
Mode offline et Synchronisation avec Windows Phone et Windows 8.1Mode offline et Synchronisation avec Windows Phone et Windows 8.1
Mode offline et Synchronisation avec Windows Phone et Windows 8.1Microsoft
 
Softfluent speig mdday2010
Softfluent speig mdday2010Softfluent speig mdday2010
Softfluent speig mdday2010MD DAY
 
Keynote "PME & Startups : concurrents ou exemples à suivre ?"
Keynote "PME & Startups : concurrents ou exemples à suivre ?"Keynote "PME & Startups : concurrents ou exemples à suivre ?"
Keynote "PME & Startups : concurrents ou exemples à suivre ?"Microsoft pour les PME
 
Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Microsoft
 
LMB Entrepreneurs' Boot Camp Handbook 16 May 2011
LMB Entrepreneurs' Boot Camp Handbook 16 May 2011LMB Entrepreneurs' Boot Camp Handbook 16 May 2011
LMB Entrepreneurs' Boot Camp Handbook 16 May 2011CumberlandEllis
 
Test du futur avec Spock
Test du futur avec SpockTest du futur avec Spock
Test du futur avec SpockCARA_Lyon
 
Iut agile lyon 20 nov. 2013 - bdd
Iut agile lyon   20 nov. 2013 - bddIut agile lyon   20 nov. 2013 - bdd
Iut agile lyon 20 nov. 2013 - bddagnes_crepet
 
Aumentando reaproveitamento de código com MvvmCross
Aumentando reaproveitamento de código com MvvmCrossAumentando reaproveitamento de código com MvvmCross
Aumentando reaproveitamento de código com MvvmCrossakamud
 
.NET 2015, ASP.NET 5, C# 6 e tudo mais
.NET 2015, ASP.NET 5, C# 6 e tudo mais.NET 2015, ASP.NET 5, C# 6 e tudo mais
.NET 2015, ASP.NET 5, C# 6 e tudo maisakamud
 
Decouvrir CQRS (sans Event sourcing) par la pratique
Decouvrir CQRS (sans Event sourcing) par la pratiqueDecouvrir CQRS (sans Event sourcing) par la pratique
Decouvrir CQRS (sans Event sourcing) par la pratiqueThomas Pierrain
 

Andere mochten auch (20)

BDD (Behavior Driven Development) - Une voie vers l'agilité
BDD (Behavior Driven Development) - Une voie vers l'agilitéBDD (Behavior Driven Development) - Une voie vers l'agilité
BDD (Behavior Driven Development) - Une voie vers l'agilité
 
TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)
TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)
TDD/BDD: ou comment j’ai appris à ne plus m’en faire avec les tests (et la doc)
 
Pizza party 30-09-2011 bdd-cucumber
Pizza party 30-09-2011 bdd-cucumberPizza party 30-09-2011 bdd-cucumber
Pizza party 30-09-2011 bdd-cucumber
 
Test acceptance
Test acceptanceTest acceptance
Test acceptance
 
Spécification par l'exemple & Tests d'Acceptance Agile avec cucumber
Spécification par l'exemple & Tests d'Acceptance Agile  avec cucumberSpécification par l'exemple & Tests d'Acceptance Agile  avec cucumber
Spécification par l'exemple & Tests d'Acceptance Agile avec cucumber
 
Réaliser une bonne recette au concombre - Agile Testing Paris
Réaliser une bonne recette au concombre - Agile Testing ParisRéaliser une bonne recette au concombre - Agile Testing Paris
Réaliser une bonne recette au concombre - Agile Testing Paris
 
C# Async, un an après
C# Async, un an aprèsC# Async, un an après
C# Async, un an après
 
Mode offline et Synchronisation avec Windows Phone et Windows 8.1
Mode offline et Synchronisation avec Windows Phone et Windows 8.1Mode offline et Synchronisation avec Windows Phone et Windows 8.1
Mode offline et Synchronisation avec Windows Phone et Windows 8.1
 
Softfluent speig mdday2010
Softfluent speig mdday2010Softfluent speig mdday2010
Softfluent speig mdday2010
 
Keynote "PME & Startups : concurrents ou exemples à suivre ?"
Keynote "PME & Startups : concurrents ou exemples à suivre ?"Keynote "PME & Startups : concurrents ou exemples à suivre ?"
Keynote "PME & Startups : concurrents ou exemples à suivre ?"
 
Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5
 
LMB Entrepreneurs' Boot Camp Handbook 16 May 2011
LMB Entrepreneurs' Boot Camp Handbook 16 May 2011LMB Entrepreneurs' Boot Camp Handbook 16 May 2011
LMB Entrepreneurs' Boot Camp Handbook 16 May 2011
 
Test du futur avec Spock
Test du futur avec SpockTest du futur avec Spock
Test du futur avec Spock
 
Abes Adbs2411
Abes Adbs2411Abes Adbs2411
Abes Adbs2411
 
Iut agile lyon 20 nov. 2013 - bdd
Iut agile lyon   20 nov. 2013 - bddIut agile lyon   20 nov. 2013 - bdd
Iut agile lyon 20 nov. 2013 - bdd
 
Dot Net Core
Dot Net CoreDot Net Core
Dot Net Core
 
Le WEB 2.0 en bibliothèque
Le WEB 2.0 en bibliothèqueLe WEB 2.0 en bibliothèque
Le WEB 2.0 en bibliothèque
 
Aumentando reaproveitamento de código com MvvmCross
Aumentando reaproveitamento de código com MvvmCrossAumentando reaproveitamento de código com MvvmCross
Aumentando reaproveitamento de código com MvvmCross
 
.NET 2015, ASP.NET 5, C# 6 e tudo mais
.NET 2015, ASP.NET 5, C# 6 e tudo mais.NET 2015, ASP.NET 5, C# 6 e tudo mais
.NET 2015, ASP.NET 5, C# 6 e tudo mais
 
Decouvrir CQRS (sans Event sourcing) par la pratique
Decouvrir CQRS (sans Event sourcing) par la pratiqueDecouvrir CQRS (sans Event sourcing) par la pratique
Decouvrir CQRS (sans Event sourcing) par la pratique
 

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

Hinweis der Redaktion

  1. Qui suis je : développeur décomplexé ayant eu des expériences diverses avec le BDD (échecs et succès) But: donner envie d'essayer ou de réessayer le BDD Spécification par l'exemple par l'exemple Retirer la magie Trucs et astuces issu de la pratique Pour ceux qui l'on pratiquer : une approche différente
  2. L'expression des besoins est difficile : Des éléments sous entendu peuvent être oublié lors du développement Des cas d'erreur ou cas limites peuvent être géré que lors du développement Sans cas précis, l'interprétation du besoin exprimé peut divergé du besoin réel La boucle de rétro action est trop longue entre l'expression du besoin et la démonstration du produit
  3. Lors que les tests fonctionnels sont écrit après : Ne sont pas exhaustifs Sont difficiles à écrire Peuvent clignoter s'ils sont basés sur les données vivantes
  4. Documentation fonctionnelle : peu de confiance Dans un cycle itératif de développement la documentation suit difficilement l'état réel du produit. On ne peut jamais savoir si la documentation est juste, même si elle l'est.
  5. Spécification par l'exemple collaboration étroite DEV / PO est nécessaire utiliser des exemples permet d'ouvrir la discussion et de trouver de nombreux cas permet une boucle de rétroaction très rapide définition au plus tôt de toutes les entrées sorties nécessaires une User Story est déclinée en nombreux scénarios les phrases exécutables sont réutilisables découper les scénarios garder uniquement le nécessaire garder en tête la lisibilité les données non nécessaires à la lisibilité peuvent être définies dans le code de test ne pas hésiter à dérouler l'algorithme à partir des exemples du scénario envisager différents cas : cas nominal, cas limite, cas d'erreur organiser les scénarios : niveau d'abstraction, différents cas Tests fonctionnels le développeur est guidé, le code est tiré par les tests on écrit uniquement le code nécessaire ni plus ni moins tests exhaustifs le code doit être flexible pour mocker les interactions extérieures une boucle BDD induit plusieurs boucles TDD tests stables : les interactions extérieures sont mockées Documentation exécutable issue du code, la documentation est à jour toujours les niveaux d'abstraction permettent d'inclure une documentation adaptée au contexte de la documentation projet