But : Donner envie d'essayer ou de réessayer le BDD Public : Product Owner ET Développeurs Constats que l'on peut faire dans de nombreux projets : - les fonctionnalités développées ne correspondent pas à ce qu'avait le Product Owner en tête - les tests fonctionnels sont instables, on n'a pas vraiment confiance en eux - la documentation fonctionnelle n'est pas à jour La pratique de la spécification par l'exemple (~= BDD) peut améliorer tout ça ! On va s'affranchir de la théorie : on va appliquer le principe de la spécification par l'exemple à la présentation elle même : on va dérouler un exemple complet. Dans le contexte d'une bibliothèque, on va dérouler le BDD sur une User Story : - écrire les scénarios - organiser les scénarios - rendre exécutable les scénarios - implémenter les scénarios - rendre les tests fonctionnels automatiques - exposer la documentation générée Les différents étapes, trucs et astuces seront synthétisés en conclusion. (c'est une présentation classique, pas un atelier)
Code disponible : https://github.com/GeReinhart/dojo-bdd-library-ws-java
2. 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. 3
But : donner envie d'essayer
ou de réessayer le BDD
Introduction
gerald.reinhart@ .com
4. 4
Un PO lors de la démo du produit
après une itération
Constats
gerald.reinhart@ .com
5. 5
Les tests fonctionnels qui clignotent
Les tests fonctionnels non exhaustifs
Constats
gerald.reinhart@ .com
13. 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
14. 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
15. 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
16. 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
32. 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
33. 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
38. 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
45. 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. 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
51. 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. 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
54. 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. 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
58. 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
Hinweis der Redaktion
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
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
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
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.
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