L'ABC du BDD (Behavior Driven Development)

3,288 views

Published on

Une introduction au Behavior Driven Development, avec plein d'idées pour tout de suite! et applicable à tout projet. Il sera question:

* de passer de l'incompréhension à savoir qu'on ne sait pas
* des westerns spaghetti aux Three Amigos,
* de reléguer le Comment au second plan pour laisser sa place au Pourquoi!
* de rendre des spécifications exécutables
* de découvrir qu'un concombre n'est pas qu'un Cucurbitacée aux feuilles tri-lobées
* d'automatisation comme outil de non-regression

Au cours de cette session, nous expliquerons ce qu'est le BDD. Nous verrons qu'il n'est pas question d'outils ou de tests, mais de collaboration et de discussion entre les différentes parties prenantes: du métier aux développeurs en passant par les testeurs. Cette presentation s'adresse à l'ensemble de ces populations en expliquant l'importance qu'il y a à se comprendre, et qu'il n'est pas nécessaire d'avoir des outils sophistiqués pour avoir des bénéfices immédiats.

Nous verrons quelques pratiques de discussion qui permettent d'arriver à une meilleure compréhension et à une description du besoin. Nous verrons aussi comment des exemples concrets permettent de s'assurer d'une compréhension commune et comment ils permettent de construire un langage unique et non ambigu. Nous verrons comment rendre ces spécifications executables en réutilisant les exemples construits précédemment et en les automatisant. Ceux-ci viendront renforcer les tests d'acceptance et devenir des tests de non regressions. Enfin, nous verrons que cette démarche nous permettra d'avoir une documentation vivante et toujours à jour de notre système.

Idées pour tout de suite

Communication, Clarification par des Exemples concrets, Spécifications exécutables

Published in: Software

L'ABC du BDD (Behavior Driven Development)

  1. 1. BA CL’ BDDCE QUE C’est OU Ce QUE C’est pas… Arnauld Loyer @aloyer 2014 du
  2. 2. http://pencilink.blogspot.fr/2010/10/iron-man-160-jim-starlin-cover-steve.html It’s NOT about tools It’s about Communication and Behavior! @aloyer
  3. 3. http://ungoliantschilde.tumblr.com/post/78793890826/ungoliantschilde-barry-windsor-smith-that It’s NOT about Testing It’s about Exploring the Unknown @aloyer
  4. 4. It’s not about Silo!Or Acceptance Criteria It’s about Sharing and Understanding @aloyer
  5. 5. It’s about Driven Development! @aloyer
  6. 6. Qu'est ce qui se passe? Modèle Mental @aloyer @aloyer @aloyer
  7. 7. Qu'est ce qui se passe? Modèle Mental Ce qui est expliqué Ce qui n'est pas retranscrit Modèle Mental @aloyer @aloyer @aloyer
  8. 8. Qu'est ce qui se passe? Modèle Mental Ce qui est expliqué Ce qui n'est pas retranscrit Modèle Mental Ce que l'autre comprend @aloyer @aloyer @aloyer
  9. 9. Qu'est ce qui se passe? Ce qui est spécifié @aloyer @aloyer @aloyer
  10. 10. Qu'est ce qui se passe? Ce qui va être testé @aloyer @aloyer @aloyer @aloyer
  11. 11. Qu'est ce qui se passe? Ce qui va être testé Ce qui est réalisé @aloyer @aloyer @aloyer @aloyer
  12. 12. Qu'est ce qui se passe? @aloyer @aloyer @aloyer
  13. 13. Qu'est ce qui se passe? @aloyer @aloyer @aloyer
  14. 14. Qu'est ce qui se passe? Correspond à l'idée initiale Ce qui a été réalisé @aloyer @aloyer
  15. 15. Qu'est ce qui se passe? Correspond à l'idée initiale Ce qui a été réalisé NNNAaannnnnn vs @aloyer @aloyer
  16. 16. "is this a bug or is this not a bug” a bug? a feature? an enhancement? a beature? @aloyer
  17. 17. @aloyer
  18. 18. @aloyer
  19. 19. @aloyer
  20. 20. 3 steps 3 model 3 interpretations @aloyer
  21. 21. 3 visions 1 model 1 goal @aloyer
  22. 22. Three Amigos @aloyer
  23. 23. http://paintings-art-picture.com/paintings/archives/85/marvel-comics-retro-captain-america-comic-panel-fighting-phase-1-so-far-so-good-aged BDD is writing software that matters @aloyer
  24. 24. @aloyer @aloyer
  25. 25. BDD is about conversation @aloyer @aloyer
  26. 26. @aloyer
  27. 27. @aloyer
  28. 28. Why? Goal? Business Value? Intention What? How! @aloyer @aloyer
  29. 29. Why? Goal? Business Value? In order to <achieve the vision> Feature: ... As a <stakeholder> I want <value> Intention As a <role> I want <goal> So that <value> User focused What? How! @aloyer @aloyer
  30. 30. No Narrative No Business Value Unnecessary Feature ! @aloyer
  31. 31. 22 http://devjam.com/2010/08/05/dudes-law-gordon-pask-shoveler/
  32. 32. In order to... Feature: ... As a... I want to... Scenario: ... Given <a context> When <an event happens> Then <an outcome should occur> BDD uses examples to illustrate behavior @aloyer @aloyer
  33. 33. Why do YOU like should? It encourages debate, and constant Questioning of the premise of the application you are developing. Dan North, March 2005 @aloyer
  34. 34. Feature: Account Holder withdraws cash from an ATM ! In the following scenario, ATM will stands for Automatic Teller Machine in other word a “Cash machine”. ! In order to get money at any time, even when the bank is closed As an Account Holder I want to withdraw cash from an ATM ! Scenario: Account has sufficient funds Given the account balance is 100€ When the Account Holder requests 20€ Then the ATM should dispense 20€ And the account balance should be 80€ And the card should be returned @aloyer
  35. 35. Scenario: Account has insufficient funds Given the account balance is 10€ And the card is valid And the machine contains enough money When the Account Holder requests 30€ Then the ATM should not dispense any money And the ATM should say there are insufficient funds And the account balance should still be 10€ And the card should be returned @aloyer
  36. 36. Scenario: Account has insufficient funds Given the account balance is 10€ And the card is valid And the machine contains enough money When the Account Holder requests 30€ Then the ATM should not dispense any money And the ATM should say there are insufficient funds And the account balance should still be 10€ And the card should be returned FOCUS On the BEHAVIOR DESCRIBED! @aloyer
  37. 37. @aloyer
  38. 38. Feature: Interpolate ! In order to interpolate values As an Trader I want to interpolate values in a range of Market data Why this feature ? @aloyer
  39. 39. Feature: Linear Interpolation In order to fill the gaps and provide a value for any maturity As a trader responsible for market-making I want to interpolate linearly values within a range of points And I want a flat extrapolation outside of the range of points Why this feature ? @aloyer
  40. 40. Scenario: Change the negotiation price from positive to negative => soulte cashflow appears and premium cashflow is modified ! Given an FUNKY_EXOTIC And deal way is sell And deal nature is TOMATO And trade value date is 2012/07/01 And nominal is 100 JPY And negotiation price is 0.20 JPY When I validate the deal Then there are 1 Price cashflows And there are 0 fee cashflows When I change the negotiation price to -0.3 JPY And I validate the deal Then there are 1 Price cashflows And there are 1 fee cashflows And the trade cashflow's payment date is 2012/07/01 And the trade cashflow's way is receive And the trade cashflow's amount is 30 JPY And the fee cashflow's payment date is 2012/07/01 And the fee cashflow's way is give And the fee cashflow's amount is 60 JPY What about this scenario @aloyer
  41. 41. What about this scenario d = new Deal(); d.SetWay(Sell); d.SetNature(Tomato); d.SetValueDate(new Date(...)); d.SetNominal(100, JPY); d.SetNegotiationPrice(0.20, JPY); cf = d.GetCashFlows(); AssertThat(IsEqual(...); ... Scenario: Change the negotiation price from positive to negative => soulte cashflow appears and premium cashflow is modified ! Given an FUNKY_EXOTIC And deal way is sell And deal nature is TOMATO And trade value date is 2012/07/01 And nominal is 100 JPY And negotiation price is 0.20 JPY When I validate the deal Then there are 1 Price cashflows And there are 0 fee cashflows When I change the negotiation price to -0.3 JPY And I validate the deal Then there are 1 Price cashflows And there are 1 fee cashflows And the trade cashflow's payment date is 2012/07/01 And the trade cashflow's way is receive And the trade cashflow's amount is 30 JPY And the fee cashflow's payment date is 2012/07/01 And the fee cashflow's way is give And the fee cashflow's amount is 60 JPY @aloyer
  42. 42. SCEnARIO: Fee and Price cashflows when the negotiation price is set to a negative value ! Given a sell for a nominal 100 JPY on FUNKY_EXOTIC TOMATO negotiation price 0.20 JPY traded on 2012/07/01 When the middle officer validates the deal Then the trade has one Price cashflow and no Fee cashflow When the middle officer changes the negotiation price to -0.3 JPY And the middle officer validates the deal Then the trade has the following cashflows: What about this scenario Communicate With the Business People !!! FlowType Price Fee Way Receive Give Amount 30 60 Currency JPY JPY Payment Date 2012/07/01 2012/07/01 Remarks 100*abs(-0.3) 100*2*abs(-0.3) @aloyer
  43. 43. Low Tech Scenario @aloyer @aloyer
  44. 44. @aloyer @aloyer
  45. 45. @aloyer Domain Driven Design - Eric Evans @aloyer
  46. 46. In order to... Feature: ... As a... I want to... Scenario: ... Given <a context> When <an event happens> Then <an outcome should occur> Examples help discover things early @aloyer @aloyer
  47. 47. In order to... Feature: ... As a... I want to... Scenario: ... Given <a context> When <an event happens> Then <an outcome should occur> One may discover that one doesn't know but others do! @aloyer @aloyer
  48. 48. WHAT About Automation !?! The Green Thing ? @aloyer
  49. 49. GLUECODE BDDFRAMEWORK SCENARIO APPLICATION "End to End" UI FEST, Selenium, Fluentlenium, HtmlUnit, Watir... @aloyer
  50. 50. GLUECODE BDDFRAMEWORK SCENARIO APPLICATION "End to End" Services Web, WCF, ... @aloyer
  51. 51. GLUECODE BDDFRAMEWORK SCENARIO APPLICATION Sub-Module runtime @aloyer
  52. 52. GLUECODE BDDFRAMEWORK SCENARIO APPLICATION "Quasi-Unitaire" runtime @aloyer
  53. 53. GLUECODE BDDFRAMEWORK SCENARIO APPLICATION "Quasi-Unitaire" runtime Mock, Stubs... @aloyer
  54. 54. GLUECODE BDDFRAMEWORK SCENARIO APPLICATION @aloyer
  55. 55. Scenario: Account has sufficient funds! Given the account balance is 100€! When the Account Holder requests 20€ Then the ATM should dispense 20€! And the account balance should be 80€! And the card should be returned SCENARIO GLUECODE BDDFRAMEWORK APPLICATION @aloyer
  56. 56. Scenario: Account has sufficient funds! Given the account balance is 100€! When the Account Holder requests 20€ Then the ATM should dispense 20€! And the account balance should be 80€! And the card should be returned SCENARIO GLUECODE BDDFRAMEWORK APPLICATION @aloyer
  57. 57. Scenario: Account has sufficient funds! Given the account balance is 100€! When the Account Holder requests 20€ Then the ATM should dispense 20€! And the account balance should be 80€! And the card should be returned SCENARIO @Given("^the account balance is (d+)€$") public void defineAccountBalanceInEuro(BigDecimal balance) { throw new PendingException("Implements me!"); } ! @When("^the Account Holder request (d+)€$") public void withdrawInEuro (BigDecimal amount) { throw new PendingException("Implements me!"); } ! @Then("^the ATM should dispense (d+)€$") public void assertMoneyDispensedInEuro (BigDecimal amount) { throw new PendingException("Implements me!"); } ! ! ! @Then("^the account balance should be (d+)€$") public void assertBalanceInEuro(BigDecimal amount) { throw new PendingException("Implements me!"); } ! GLUE CODE APPLICATION BDDFRAMEWORK @aloyer
  58. 58. Scenario: Account has sufficient funds! Given the account balance is 100€! When the Account Holder requests 20€ Then the ATM should dispense 20€! And the account balance should be 80€! And the card should be returned SCENARIO @Given("^the account balance is (d+)€$") public void defineAccountBalanceInEuro(BigDecimal balance) { account().setBalance(euro(balance)); } ! @When("^the Account Holder request (d+)€$") public void withdrawInEuro (BigDecimal amount) { atm().withdraw(account(), euro(amount)); } ! @Then("^the ATM should dispense (d+)€$") public void assertMoneyDispensedInEuro (BigDecimal amount) { TransactionLog txLog = atm().transactionLog();! Money dispensed = txLog.lastAmountDispensed();! assertThat(dispensed).isEqualTo(euro(amount)); }! ! @Then("^the account balance should be (d+)€$") public void assertBalanceInEuro(BigDecimal amount) { Money actualBalance = account().balance();! assertThat(actualBalance).isEqualTo(euro(amount)); } GLUE CODE APPLICATION BDDFRAMEWORK @aloyer
  59. 59. And that’s all Folks… for the Green Thing! but remember, you can automate from unit level to end-to-end level @aloyer
  60. 60. THE Point If only one thing must remain @aloyer
  61. 61. BDD = Shared understanding by discussing Examples @aloyer
  62. 62. BDD = Shared understanding by discussing Examples Three AmiGOS @aloyer
  63. 63. BDD = Shared understanding by discussing Examples Scenario Three AmiGOS @aloyer @aloyer
  64. 64. Questions? http://rozmaryn.deviantart.com/art/Hellboy-bw-52117973 @aloyer

×