Bbd dans le flow nov.2012

143
dans le flux du BDD Guillaume Saint Etienne Guillaume Saint Etienne @guillaume_agile @guillaume_agile Varian Medical Systems Varian Medical Systems

description

Résumé : Au bout de 3 ans de pratique intensive du BDD avec Specflow en C#, je vous propose de passer en revue les avantages et les écueils de cette pratique, mais également partager "trucs et astuces" et surtout les questionnements qui restent en suspend. Bénéfices pour les participants : Apprendre et progresser sur le BDD et l'écriture de logiciel pilotée par les tests comportementalistes. Guillaume, Saint Etienne : Développeur depuis mon premier micro: un ZX81, j’ai endossé également différents rôles, principalement chez des éditeurs logiciels: chef de projet, architecte logiciel, scrum master , et encore maintenant « Senior Software Programmer ».

Transcript of Bbd dans le flow nov.2012

Page 1: Bbd dans le flow nov.2012

dans le flux du BDD

Guillaume Saint EtienneGuillaume Saint Etienne@guillaume_agile@guillaume_agileVarian Medical SystemsVarian Medical Systems

Page 2: Bbd dans le flow nov.2012

ATTENTION

Page 3: Bbd dans le flow nov.2012

MISE AU POINT

Page 4: Bbd dans le flow nov.2012
Page 5: Bbd dans le flow nov.2012
Page 6: Bbd dans le flow nov.2012
Page 7: Bbd dans le flow nov.2012

TDD/BDD is a

design activityKerry Buckley

Page 8: Bbd dans le flow nov.2012
Page 9: Bbd dans le flow nov.2012
Page 10: Bbd dans le flow nov.2012

le test manuel est …

 

http://blog.objectmentor.com/articles/2007/10/17/tdd-with-acceptance-tests-and-unit-tests

Page 11: Bbd dans le flow nov.2012
Page 12: Bbd dans le flow nov.2012

mais il faut apprendre

idée: prenez un coach ;)

Page 13: Bbd dans le flow nov.2012

goOgle est mon ennemi

• Le TOP 50 des résultats pour « BDD » (en français)– Exemples simplistes et enfantins– Pas représentatifs d’un vrai projet logiciel– Pas de vrai retour d’expérience– Articles sur BDD = ATDD (Acceptance testing /

test d’IHM)

Page 14: Bbd dans le flow nov.2012
Page 15: Bbd dans le flow nov.2012

Exception!

• Il faut rendre à César ce qui est à Pierre Irrmann• http://www.arolla.fr/blog/2012/09/bdd-et-

specflow-pour-des-tests-plus-lisibles/• « Gherkin pour écrire des tests en langage

naturel ».• « Lorsqu’on développe en BDD, les tests sont

écrits pour tester des fonctionnalités et des exemples précis de comportements. »

Page 16: Bbd dans le flow nov.2012
Page 17: Bbd dans le flow nov.2012

Parcours empiriqueParcours empirique

Page 18: Bbd dans le flow nov.2012

Ce qu’on voit en 1er

• GHERKIN / CUCUMBER–Given–When–Then

Page 19: Bbd dans le flow nov.2012

Don’t misuse it!

Page 20: Bbd dans le flow nov.2012

Ce que m’apporte la forme BDD

T.U. classique

• ARRANGE• ACT• ASSERT

T.U. Behavioriste

• GIVEN• WHEN • THEN

Page 21: Bbd dans le flow nov.2012

•Given•When•Then

•Given•When•Then

Organisation du BDD

Librairies

Features

Scenarios

Steps

Page 22: Bbd dans le flow nov.2012

Ce qui est trompeur

Page 23: Bbd dans le flow nov.2012

La puce à l’oreille

• La section « Feature » dans Gherkin– In order to– As a– I want to

…ne sert à rien!!!!

Elle n’est pas compilée et donc pas « exécutée »

Page 24: Bbd dans le flow nov.2012

Auteur: Brian Marick

Page 25: Bbd dans le flow nov.2012

Tester c’est comprendre

• du latin « comprehensio »1, de « cum », avec, et « prehendere », prendre: action de saisir ensemble ou de prendre avec soi

Page 26: Bbd dans le flow nov.2012
Page 27: Bbd dans le flow nov.2012

DEBUG BDD

Page 28: Bbd dans le flow nov.2012

BDD = Test Comportementaliste

Page 29: Bbd dans le flow nov.2012

Idées reçues sur le BDD• You want to do acceptance testing rather than

unit testing.• You want to use it as a communication tool

with the stake holder.• You want to do large scale tests rather than

granular tests.• You want non-technical people to write the

tests.http://gojko.net/2012/06/18/bdd-busting-the-myths/ [Gojko Adzic]http://stackoverflow.com/questions/2238176/using-fitnesse-rather-than-nunit

Page 30: Bbd dans le flow nov.2012

You want to do acceptance testing rather than unit testing.

Page 31: Bbd dans le flow nov.2012

You want to do acceptance testing rather than unit testing.

Page 32: Bbd dans le flow nov.2012

You want to do acceptance testing rather than unit testing.•TDD is excellent

Page 33: Bbd dans le flow nov.2012

You want to do acceptance testing rather than unit testing.•TDD is the only way to be agile•BDD is no more than TDD

Page 34: Bbd dans le flow nov.2012

You want to do acceptance testing rather than unit testing.•TDD is the only way to be agile•BDD is no more than TDD•BDD is first doing « unit » testing

Page 35: Bbd dans le flow nov.2012

You want to do acceptance testing rather than unit testing.•TDD is the only way to be agile•BDD is no more than TDD•BDD is first doing « unit » testing•A «non-unit » test is a scam!

– Test only one thing at a time

Page 36: Bbd dans le flow nov.2012

You want to use it as a communication tool with the stake holder.

Page 37: Bbd dans le flow nov.2012

You want to use it as a communication tool with the stake holder.First, use it as a communication with yourself

Page 38: Bbd dans le flow nov.2012

You want to use it as a communication tool with the stake holder.First, use it as a communication with yourself…then your team

Page 39: Bbd dans le flow nov.2012

You want to use it as a communication tool with the stake holder.First, use it as a communication with yourself…then your team…then (maybe) the stakeholder or the users.

Page 40: Bbd dans le flow nov.2012

You want to do large scale tests rather than granular tests.

Page 41: Bbd dans le flow nov.2012

You want to do large scale tests rather than granular tests.

Page 42: Bbd dans le flow nov.2012

You want to do large scale tests rather than granular tests.

http://www.jbrains.ca/permalink/integrated-tests-are-a-scam-part-1

Page 43: Bbd dans le flow nov.2012

Why integrated tests are a scam!Why integrated tests are a scam!

• I use the term integrated test to mean any test whose result (pass or fail) depends on the correctness of the implementation of more than one piece of non-trivial behavior.– J. B. Rainsberger

Page 44: Bbd dans le flow nov.2012

You want non-technical people to write the tests.

Page 45: Bbd dans le flow nov.2012

You want non-technical people to write the tests.

Page 46: Bbd dans le flow nov.2012

You want non-technical people to write the tests.

•I wish I could …

Page 47: Bbd dans le flow nov.2012

You want non-technical people to write the tests.

•I wish I could …•Be pragmatic!

Page 48: Bbd dans le flow nov.2012

You want non-technical people to write the tests.

•I wish I could …•Be pragmatic!•Maybe in the future …

Page 49: Bbd dans le flow nov.2012

Bref, j’ai fait du BDD

• Je passe à une description textuelle• Exemple!

Page 50: Bbd dans le flow nov.2012

Bref, j’ai fait du BDD

Given I initialize the readerAnd jouvre le dossier patient '1'When je veux lire 'nom' Then I dont have errorAnd jobtient une valeur 'Nom 1'

Page 51: Bbd dans le flow nov.2012

Et si? Je n’avais pas fait du BDD

Page 52: Bbd dans le flow nov.2012

DRY

• Mes tests aussi !• Refactoring• Les Steps Given/When/Then sont une façon

de « DRY »• Puissance (et pièges) des expressions

régulières.• Exemple…

Page 53: Bbd dans le flow nov.2012

Given I initialize the readerAnd jouvre le dossier patient '1'When je veux lire 'nom' Then I dont have errorAnd jobtient une valeur 'Nom 1‘

Given I initialize the reader And jouvre le dossier patient '1' When je veux lire 'nais' Then I dont have error And jobtient une valeur '2/1/1973'

Page 54: Bbd dans le flow nov.2012

L’envers du décors: les Steps

Page 55: Bbd dans le flow nov.2012

Given I initialize the readerAnd jouvre le dossier patient '1'When je veux lire 'nom' Then I dont have errorAnd jobtient une valeur 'Nom 1‘

Given I initialize the reader And jouvre le dossier patient '1' When je veux lire 'nais' Then I dont have error And jobtient une valeur '2/1/1973'

Given I initialize the reader And jouvre le dossier patient 'F2' And the log system is initialized with the LogWatch configuration When I read ‘droits' as a Numeric Then I have an error And the previous log messages contains: The field 'droits' couldn't be read as a Decimal

Page 56: Bbd dans le flow nov.2012

Exemple de refactoring

• On fini par gagner énormément de temps

• Fini le copier/coller… dans le code !

• Donc fini les erreurs…. sur le code (technique)

des tests!

• Exemple!

Page 57: Bbd dans le flow nov.2012

1 Feature

Page 58: Bbd dans le flow nov.2012

1 Feature

Page 59: Bbd dans le flow nov.2012

Les Tables Specflow

Page 60: Bbd dans le flow nov.2012

Looks like Fitnesse (a bit)

Page 61: Bbd dans le flow nov.2012
Page 62: Bbd dans le flow nov.2012

Refactoring en BDD

• Nécessité de créer des Steps efficaces• Ils sont exécutables, donc il y a du code

derrière.• Même qualité du code des steps que du reste

du code.• Ré-utilisables

– Then I dont have error

Page 63: Bbd dans le flow nov.2012

Les outils incontournables

– Dummies– Fake– Mocks– Stub– Espions / Spies– Inversion de contrôle / Injection de dépendance– Helpers

– … comme dans le TDD après tout!

Page 64: Bbd dans le flow nov.2012

Fake / Substituts

• De faux objets ayant un comportement similaire à l’objet réel, mais d’une façon simplifiée.

• Il n’agit pas comme un point de contrôle, mais permet d’accélérer l’exécution des tests.

• Par exemple en remplaçant l’accès à la base de données par des données dans un fichier ou en mémoire.

Page 65: Bbd dans le flow nov.2012

Fake• « Doublure » qui fait comme l’original

ORM DB4

Test

Db 4 ObjectFile

Page 66: Bbd dans le flow nov.2012
Page 67: Bbd dans le flow nov.2012

Mocks• Une « leurre » mais pas besoin d’écrire son

code « interne »• Juste décrire ce que l’on attend de lui

Page 68: Bbd dans le flow nov.2012

Mock• Le Mock se contente de bien se « comporter ».• Simulation (Setup)• Vérification du comportement attendu

(optionnelle).

Page 69: Bbd dans le flow nov.2012

outillage contratS.U.T.

comportement attendu

Page 70: Bbd dans le flow nov.2012

Stubs

• Similaires aux MOCKs• La différence principale vient du fait qu’avec le

Stub on vérifie l’état de l’objet alors qu’avec le Mock on en vérifie le comportement (les interactions).

• http://bruno-orsier.developpez.com/mocks-arent-stubs

Page 71: Bbd dans le flow nov.2012

Refactoring steps with helpers

• Une syntaxe pour accéder aux objets (C# 3.5)• Sans:

– When je lis le champs ‘City’ dans la 1e adresse du patient en cours And je lis le champs ‘Type’ dans la 1e adresse du patient en coursAnd je lis le champs ‘Type’ dans la 2e adresse du patient en coursAnd je lis le champs ‘Type’ dans la 3e adresse du patient en cours

• Avec:

Page 72: Bbd dans le flow nov.2012

Au final, qu’est ce que je teste?

• SUT / SCT : System Under Test / Système en Cours de Test

• L’Isolation des tests est indispensable (1 problème à la fois)

• Impossible de se passer des doublures.• Un exemple avec les Spies / Espions

Page 73: Bbd dans le flow nov.2012

Single Responsibility

Page 74: Bbd dans le flow nov.2012

Chainage des vérifications

• Pas besoin de tests automatisé intégrés.• Si tous les mécanismes vu précédemment

sont en place.• Néanmoins, comment en être sûr?

Page 75: Bbd dans le flow nov.2012

S.O.L.I.D.• Single responsibility principle

– the notion that an object should have only a single responsibility.

• Liskov substitution principle– the notion that “objects in a program should be

replaceable with instances of their subtypes without altering the correctness of that program”

• Interface segregation principle– the notion that “many client specific interfaces are

better than one general purpose interface

Page 76: Bbd dans le flow nov.2012

Si mon code est SOLID• Alors mes tests doivent l’être aussi

Page 77: Bbd dans le flow nov.2012

Les CONTRATS sont la clé

Page 78: Bbd dans le flow nov.2012
Page 79: Bbd dans le flow nov.2012

Vérification automatique

• => Outil de couverture de code.

• Néanmoins difficile d’avoir 100% (erreurs de

l’outil, code inatteignable)

• Donne une très bonne mesure de

l’amélioration de la couverture par les tests.

Page 80: Bbd dans le flow nov.2012

Autres vérifications à faire

• Complétude des tests• Les « fakes » doivent être testés à leur tour.• Parcours et vérifications auto. des interfaces:

– Si une doublure (spy/mock/stub) se fait passer pour une interface, et qu’on n’en trouve pas une implémentation qui ne soit pas couverte à 100% par d’autres tests (eux même en parfaite isolation), alors c’est un échec!

– À inventer!

Page 81: Bbd dans le flow nov.2012

Patterns: HUMBLE DIALOG, VISITOR

Tests devenus inutiles: UI

Page 82: Bbd dans le flow nov.2012

Tester à partir des UI?

Page 83: Bbd dans le flow nov.2012

Test the User Interface?• « Tests »

Exploratoires (manuels)– Si Erreurs

détectées: • 5% pb de config• 10% coquilles• 10% I/O - Sys• 75 % manque de

tests

Page 84: Bbd dans le flow nov.2012

L’HEURE DU BILAN

Dans le flux

Page 85: Bbd dans le flow nov.2012

Avant le BDD

Page 86: Bbd dans le flow nov.2012

Après (dans le flux)

Page 87: Bbd dans le flow nov.2012

Ecriture du test: 5 à 30min

Page 88: Bbd dans le flow nov.2012

Steps• Écriture: 5mn à 2h

Page 89: Bbd dans le flow nov.2012

Steps• Refactoring: 1/2 à 1 journée

Page 90: Bbd dans le flow nov.2012

BILAN

La question n'est pas: combien je gagne à faire des tests? Mais,combien je perd à chaque bug en prod. #atmrs2012

Page 91: Bbd dans le flow nov.2012

Summary01/06/2010 10/10/2012 - 1:39:45 PM

8 Applications livrées (+ 6 logiciels d’installation)Tests running (2x day): 1564, Failures: 0, Inconclusive: 0, Time: 2158 seconds

STEPS:167 Given, 183 When, 209 Then 44 R. --- , 77 R.---- , 73 R. ( 26% , 42% , 35%)

Efficacité moyenne 1 groupe de steps couvre 10 scénarios

« Manual » LOC of tests/specs: 12557 / 176595 ( 14%) source monitor

Source Files: 460 (comptage par OpenCover)

Coverage: 74.5% (15% UI 10% autre non couvert)

Covered lines: 9818 (comptage par OpenCover)

Coverable lines: 13161 (comptage par OpenCover)

Total SLOC Executed in tests: 48248 (comptage par OpenCover)

Page 92: Bbd dans le flow nov.2012

BÉNÉFICES OBSERVABLES

Page 93: Bbd dans le flow nov.2012

Charge de travail effective

• Nombre de bugs déclarés en exploration et après livraison:– 1ere année: 51– 2ème année: 27

• Nombre de WorkItems (User Needs, Design Quality)– 1ere année: 98– 2ème année: 100

Page 94: Bbd dans le flow nov.2012

Les tests peuvent être lus

• Ce n’est (presque) plus du code, c’est du texte!!

• On change de perspective (passer de l’impératif au descriptif).

• Je peux échanger avec mon équipe plus vite.• Quelqu’un de non technique pourrait-il les

comprendre? Les écrire ?

Page 95: Bbd dans le flow nov.2012

Mais on est encore très loin du langage naturel

• P.O et skateholders ne comprennent (pour l’instant) pas tout.

Page 96: Bbd dans le flow nov.2012

GAP

GAP

https://docs.google.com/viewer?url=http%3A%2F%2Fwww.scrumalliance.org%2Fsystem%2Fslides%2F118%2Foriginal%2FChristianHossa_SpecificationByExampleWithGherkin.pdf%3F1349824954

Page 97: Bbd dans le flow nov.2012

Qu'est ce que mon test raconte?

• Un scénario.• Même s’il revêt une réalité technique, le

comportement devrait pouvoir être compris et approuvé par quelqu’un de logique.

• Il ne doit cibler qu’une chose à la fois(isolation).

Page 98: Bbd dans le flow nov.2012

MIEUX RACONTER

• Etre rigoureux à l’écriture des Steps• Se conformer au Domaine (Domain Language)• Faire du Domain Driven Design précisément

• Tests qui resteront techniques et ceux qui seront plus proches du fonctionnel

• Masquer la technique tout en permettant une bonne réutilisation des steps (!)

Page 99: Bbd dans le flow nov.2012

Est ce suffisant pour faire une documentation?

Page 100: Bbd dans le flow nov.2012

Souvent!

• Si c’est bien raconté, oui pour spécifications.• Doc Technique = OUI ! SI! YES ! JA ! DA!• Pèsera autant qu’un lourd cahier de tests.• On a gagné des semaines (voir des mois)

hommes de travail de rédaction et de vérifications.

• Export automatique des fichiers Specflow -> Html, Word, Pdf.

Page 101: Bbd dans le flow nov.2012

Décrire

Descriptif n’est pas Impératif

Page 102: Bbd dans le flow nov.2012

C’est s’intéresser à l’essentiel

• On ne voit bien qu'avec le test. L'essentiel est invisible pour les yeux.

Antoine de Saint-Test

Page 103: Bbd dans le flow nov.2012

Tests that saves faith

Page 104: Bbd dans le flow nov.2012

Références

Page 105: Bbd dans le flow nov.2012
Page 106: Bbd dans le flow nov.2012
Page 107: Bbd dans le flow nov.2012

Pardon

• à Antoine de Saint-Exupéry

à relire (souvent)

Page 108: Bbd dans le flow nov.2012

BDD dans le flux2e partie

Du Mythe à la réalité

Page 109: Bbd dans le flow nov.2012

TOUT POUR FACILITER LES TESTS

Page 110: Bbd dans le flow nov.2012

Changement de vision

Page 111: Bbd dans le flow nov.2012

Penser le comportement

Les vertus de l’abstraction

Page 112: Bbd dans le flow nov.2012

Concevoir un comportement

• C’est penser en terme FONCTIONNELS

Page 113: Bbd dans le flow nov.2012

Design émergeant

Page 114: Bbd dans le flow nov.2012

Une affaire de style

Page 115: Bbd dans le flow nov.2012

Changement de style

Page 116: Bbd dans le flow nov.2012

• the system can’t neatly be tested with automated test suites because part of the logic is dependent on often-changing visual details

• http://alistair.cockburn.us/Hexagonal+architecture

Page 117: Bbd dans le flow nov.2012

La gravité

Page 118: Bbd dans le flow nov.2012

Dépendances fatales

Page 119: Bbd dans le flow nov.2012

Modèle sans gravité

Page 120: Bbd dans le flow nov.2012

Domain Driven Design

• C’est le meilleur moyen d’être proche du domaine métier de votre client

• Exemple (description BDD et objet métier)

Page 121: Bbd dans le flow nov.2012

Le Domaine comme modèle agnostique entre les composants

Page 122: Bbd dans le flow nov.2012

Ce que le Domaine n’est pas!

• Gestion des états => • Stateless =>

Page 123: Bbd dans le flow nov.2012

Ce que le domaine n’est pas!

Page 124: Bbd dans le flow nov.2012

Polyglot Data

• Le meilleur moyen d’être Data Storage Agnostic

• Ce n’est plus le DBA qui commande• SQL / NoSQL ?• La persistance est un plus, voila tout.• Exemple: le FakeStorer dans les tests

Page 125: Bbd dans le flow nov.2012

Incidences sur le code1. Ecrire des Interfaces qui décrivent (abstraire)

ce que les tests vont spécifier dans des scénarios mettant en évidence la valeur ajoutée du comportement choisi.

2. Ecrire l’implémentation ensuite.

3. L’intégration continue vérifie tout automatiquement => non régression.

Page 126: Bbd dans le flow nov.2012

Responsabiliser le code

• Isolation = Une seule responsabilitéTester c’est apprivoiser.

• « Tu deviens responsable pour toujours de ce que tu as testé »

Antoine de Saint-Test

Page 127: Bbd dans le flow nov.2012

Toujours plus fluide

• Le style change• On devient plus « fluent »• Le code se lit (presque) comme une phrase en

langage naturel• On se rapproche de la programmation

fonctionnelle (sans changer de langage)• Fluent API + lambda expressions = le chainon

manquant?

Page 128: Bbd dans le flow nov.2012

En Pratique

• des DOJOS pour montrer que bien tester en 1er, et tester par le comportement induit un changement de vision dans le design du logiciel

• Une mise en œuvre des tests et du code par la simplicité, la rigueur et l’efficacité

• des exemples bientôt sur mon site http://www.dotnetguru2.org/gse/

Page 129: Bbd dans le flow nov.2012

LES TESTS D’INTEGRATION SONT ILS UTILES?

Page 130: Bbd dans le flow nov.2012

Comment on a tuer l’intégration

• Créez (ou utilisez) un mécanisme d’intégration automatique

• Testez le!• => plus besoin de tester en intégration• Ajoutez tous les tests qu’il faut pour renforcer

l’intégrité du tout.• Est-ce une bonne chose?

Page 131: Bbd dans le flow nov.2012

Du mythe…

Page 132: Bbd dans le flow nov.2012

A la réalité

Page 133: Bbd dans le flow nov.2012

UN ŒIL SUR LES ESPIONS

En pratique

Page 134: Bbd dans le flow nov.2012
Page 135: Bbd dans le flow nov.2012
Page 136: Bbd dans le flow nov.2012

S.U.TVérification de comportement en parfaite isolation

Page 137: Bbd dans le flow nov.2012
Page 138: Bbd dans le flow nov.2012

SONT-ILS BIEN TESTES?

Page 139: Bbd dans le flow nov.2012

Les pièges à éviter

• Dire « comment » au lieu de « quoi »• Ne pas laisser transparaitre le « software

design »• Le « software design » devrait se fondre dans

les spécifications et devenir naturel• Ne pas se laisser enfermer dans les détails • Ne pas tout tester en même temps (bis

répetita)

Page 140: Bbd dans le flow nov.2012

Pièges (Suite)• Garder les tests parlants… (pour qui?)• Ne pas sur-spécifier (YAGNI sur les tests)• La partie setup/Given devrait rester simple• Utiliser un « ubiquitous languange »• Ne retardez pas l’usage des doublures,

injection de dépendance et autres assistants• Ne pas sous-estimez votre code « assistant »

(testez les aussi bien)

• Introduire une part de travail manuel

Page 141: Bbd dans le flow nov.2012

(suite)

• Se baser sur des données pré-existantes(!!)• Ne pas être certain que chaque test soit

idempotent.• Perdre du sens par soucis de concision

(masquer la réaliter au lieu de la simplifier)

• L’endettement (on fini toujours par payer, et les taux augmentent avec le temps)

Page 142: Bbd dans le flow nov.2012

Trucs• Commencer petit• Progresser à son rythme• Refactorer régulièrement• Le temps est votre allié

DRY! KISS! YAGNI! SOLID!

Page 143: Bbd dans le flow nov.2012

Tests that saves faith