BA CL’
BDDCE QUE C’est
OU
Ce QUE C’est pas…
Arnauld Loyer
@aloyer
2014
du
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
http://ungoliantschilde.tumblr.com/post/78793890826/ungoliantschilde-barry-windsor-smith-that
It’s NOT about Testing
It’s about Exploring the Unknown
@aloyer
It’s not about Silo!Or Acceptance
Criteria
It’s about
Sharing
and
Understanding
@aloyer
It’s about Driven Development!
@aloyer
Qu'est ce qui se passe?
Modèle
Mental
@aloyer
@aloyer
@aloyer
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
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
Qu'est ce qui se passe?
Ce qui est
spécifié
@aloyer
@aloyer
@aloyer
Qu'est ce qui se passe?
Ce qui va
être testé
@aloyer
@aloyer
@aloyer
@aloyer
Qu'est ce qui se passe?
Ce qui va
être testé
Ce qui est
réalisé
@aloyer
@aloyer
@aloyer
@aloyer
Qu'est ce qui se passe?
@aloyer
@aloyer
@aloyer
Qu'est ce qui se passe?
@aloyer
@aloyer
@aloyer
Qu'est ce qui se passe?
Correspond à l'idée initiale
Ce qui a été réalisé
@aloyer
@aloyer
Qu'est ce qui se passe?
Correspond à l'idée
initiale
Ce qui a été réalisé
NNNAaannnnnn
vs
@aloyer
@aloyer
"is this a bug or is this not a bug”
a bug?
a feature?
an enhancement?
a beature?
@aloyer
@aloyer
@aloyer
@aloyer
3 steps
3 model
3 interpretations
@aloyer
3 visions
1 model
1 goal
@aloyer
Three Amigos @aloyer
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
@aloyer
@aloyer
BDD is about conversation
@aloyer
@aloyer
@aloyer
@aloyer
Why?
Goal?
Business Value?
Intention What?
How!
@aloyer
@aloyer
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
No Narrative
No Business Value
Unnecessary Feature !
@aloyer
22
http://devjam.com/2010/08/05/dudes-law-gordon-pask-shoveler/
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
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
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
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
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
@aloyer
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
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
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
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
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
Low Tech
Scenario
@aloyer
@aloyer
@aloyer
@aloyer
@aloyer
Domain Driven Design - Eric Evans @aloyer
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
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
WHAT About Automation !?!
The
Green
Thing
?
@aloyer
GLUECODE
BDDFRAMEWORK
SCENARIO
APPLICATION
"End to End"
UI
FEST, Selenium, Fluentlenium,
HtmlUnit, Watir...
@aloyer
GLUECODE
BDDFRAMEWORK
SCENARIO
APPLICATION
"End to End"
Services
Web, WCF, ...
@aloyer
GLUECODE
BDDFRAMEWORK
SCENARIO
APPLICATION
Sub-Module
runtime
@aloyer
GLUECODE
BDDFRAMEWORK
SCENARIO
APPLICATION
"Quasi-Unitaire"
runtime
@aloyer
GLUECODE
BDDFRAMEWORK
SCENARIO
APPLICATION
"Quasi-Unitaire"
runtime
Mock, Stubs...
@aloyer
GLUECODE
BDDFRAMEWORK
SCENARIO
APPLICATION
@aloyer
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
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
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
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
And that’s all Folks…
for the Green Thing!
but remember,
you can
automate from
unit level to
end-to-end
level
@aloyer
THE Point
If only one thing must remain
@aloyer
BDD = Shared understanding
by discussing Examples
@aloyer
BDD = Shared understanding
by discussing Examples
Three AmiGOS
@aloyer
BDD = Shared understanding
by discussing Examples
Scenario
Three AmiGOS
@aloyer
@aloyer
Questions?
http://rozmaryn.deviantart.com/art/Hellboy-bw-52117973
@aloyer

L'ABC du BDD (Behavior Driven Development)

  • 1.
    BA CL’ BDDCE QUEC’est OU Ce QUE C’est pas… Arnauld Loyer @aloyer 2014 du
  • 2.
  • 3.
  • 4.
    It’s not aboutSilo!Or Acceptance Criteria It’s about Sharing and Understanding @aloyer
  • 5.
    It’s about DrivenDevelopment! @aloyer
  • 6.
    Qu'est ce quise passe? Modèle Mental @aloyer @aloyer @aloyer
  • 7.
    Qu'est ce quise passe? Modèle Mental Ce qui est expliqué Ce qui n'est pas retranscrit Modèle Mental @aloyer @aloyer @aloyer
  • 8.
    Qu'est ce quise 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.
    Qu'est ce quise passe? Ce qui est spécifié @aloyer @aloyer @aloyer
  • 10.
    Qu'est ce quise passe? Ce qui va être testé @aloyer @aloyer @aloyer @aloyer
  • 11.
    Qu'est ce quise passe? Ce qui va être testé Ce qui est réalisé @aloyer @aloyer @aloyer @aloyer
  • 12.
    Qu'est ce quise passe? @aloyer @aloyer @aloyer
  • 13.
    Qu'est ce quise passe? @aloyer @aloyer @aloyer
  • 14.
    Qu'est ce quise passe? Correspond à l'idée initiale Ce qui a été réalisé @aloyer @aloyer
  • 15.
    Qu'est ce quise passe? Correspond à l'idée initiale Ce qui a été réalisé NNNAaannnnnn vs @aloyer @aloyer
  • 16.
    "is this abug or is this not a bug” a bug? a feature? an enhancement? a beature? @aloyer
  • 17.
  • 18.
  • 19.
  • 20.
    3 steps 3 model 3interpretations @aloyer
  • 21.
    3 visions 1 model 1goal @aloyer
  • 22.
  • 23.
  • 24.
  • 25.
    BDD is aboutconversation @aloyer @aloyer
  • 26.
  • 27.
  • 28.
  • 29.
    Why? Goal? Business Value? In orderto <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.
    No Narrative No BusinessValue Unnecessary Feature ! @aloyer
  • 31.
  • 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.
    Why do YOU likeshould? It encourages debate, and constant Questioning of the premise of the application you are developing. Dan North, March 2005 @aloyer
  • 34.
    Feature: Account Holderwithdraws 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.
    Scenario: Account hasinsufficient 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.
    Scenario: Account hasinsufficient 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.
  • 38.
    Feature: Interpolate ! In orderto interpolate values As an Trader I want to interpolate values in a range of Market data Why this feature ? @aloyer
  • 39.
    Feature: Linear Interpolation Inorder 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.
    Scenario: Change thenegotiation 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.
    What about thisscenario 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.
    SCEnARIO: Fee andPrice 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.
  • 44.
  • 45.
    @aloyer Domain Driven Design- Eric Evans @aloyer
  • 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.
    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.
    WHAT About Automation!?! The Green Thing ? @aloyer
  • 49.
    GLUECODE BDDFRAMEWORK SCENARIO APPLICATION "End to End" UI FEST,Selenium, Fluentlenium, HtmlUnit, Watir... @aloyer
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
    Scenario: Account hassufficient 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.
    Scenario: Account hassufficient 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.
    Scenario: Account hassufficient 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.
    Scenario: Account hassufficient 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.
    And that’s allFolks… for the Green Thing! but remember, you can automate from unit level to end-to-end level @aloyer
  • 60.
    THE Point If onlyone thing must remain @aloyer
  • 61.
    BDD = Sharedunderstanding by discussing Examples @aloyer
  • 62.
    BDD = Sharedunderstanding by discussing Examples Three AmiGOS @aloyer
  • 63.
    BDD = Sharedunderstanding by discussing Examples Scenario Three AmiGOS @aloyer @aloyer
  • 64.