The document discusses using a behavior-driven development (BDD) approach to software development. It promotes using a ubiquitous language derived from user stories and scenarios to specify, develop, and test software. This helps improve communication between technical and non-technical teams. Examples are provided of automating scenarios written in a Given-When-Then format using tools like Cucumber, Gauge, and RSpec.
7. OK, BUT HOW’S THATGOING TO HELP DESIGN SOFTWARE?
• BUSINESS VALUEIS THE KEY
• WHAT IS THE NEXTIMPORTANT THING THE SYSTEM DOES NOTDO YET?
• USE THE BUSINESS LANGUAGE TO SPECIFY THE SOFTWARE
• USE THE BUSINESS LANGUAGE TO TEST THE SOFTWARE
• USE THE BUSINESS LANGUAGE TO WRITE THE SOFTWARE
• USE THE BUSINESS LANGUAGE TO VALIDATE THE SOFTWARE
8.
9. USER STORIES!!
• AS A …
• I WANT TO ...
• SO THAT ...
• AS A BANK CLIENT
• I WANT TO USE THE CASH MACHINE
• SO THAT I CAN TAKE MONEY FROM MY ACCOUNT
11. BEHAVIOUR SPECIFICATION
• CONTEXT
• ACTIONS
• VERIFICATION
• GIVEN THERE ISMONEY IN MY ACCOUNT
• AND I HAVE A VALID CARD
• AND THE MONEY DISPENSER HASMONEY
• WHEN I ASK THE MACHINE FOR MONEY
• THEN THE MONEYSHOULD BE SUBTRACTED FROM MY
ACCOUNT
• AND THE MONEY SHOULD BEDELIVERED TO ME
• AND MY CARD SHOULD BERETURNED
14. DID YOU REMEMBER WHERE?
• IN TESTER SPREADSHEETS, SOMETIMES WITHCOLUMNS INSTEAD OF OF GIVEN/WHEN/THEN
• IT ISALMOST THE SYNTAX FOR THE GHERKIN LANGUAGE!!
15. WHAT IF I USE THE SAME BUSINESS WORDS TO NAME THINGS IN CODE?
16. LET’S TRY THAT!
• GIVEN THERE ISMONEY IN MY ACCOUNT
• AND I HAVE A VALID CARD
• AND THE MONEY DISPENSER HASMONEY
• WHEN I ASK THE MACHINE FOR MONEY
• THEN THE MONEYSHOULD BE SUBTRACTED FROM MY
ACCOUNT
• AND THE MONEY SHOULD BEDELIVERED TO ME
• AND MY CARD SHOULD BERETURNED
• ACCOUNT.HAS_ENOUGH_MONEY?(VALUE)
• CARD.VALID?
• DISPENSER.HAS_MONEY?
• MACHINE.I_WANT(VALUE)
• ACCOUNT.SUBTRACT(VALUE)
• MACHINE.DELIVER_MONEY(VALUE)
• MACHINE.RETURN_CARD
19. BDD DEVELOPMENT CYCLE
Talk to the client, write a
user story or
Select a user story
Detail the story
into scenarions
Automate scenarios
with selected tool
Run tests and see
them fail
Write ony the
code to make
tests pass
Refactor
Almost the same as TDD?
20. OK, HOW IS THAT DIFFERENT FROM TDD “RED, GREEN,
REFACTOR”?
• THE MAIN FOCUS ISNOT THE TEST, IN REALITY THE AUTOMATE STEP CAN BE SKIPED SOMETIMES
• THE MAIN FOCUS ISON COMMUNICATION
• TEST BUSINESS BEHAVIOUR NOTLANGUAGE DEPENDENT FUNCTIONS
• BEHAVIOUR IS MORE IMPORTANT TO THE SOFTWARE THAN HOW ITWAS IMPLEMENTED
• THE MAIN FOCUS IN USINGA UBIQUITOUSLANGUAGE LIKEIN DDD
• USING THE UBIQUITOUSLANGUAGE, THE USER STORY TEMPLATE ANDTHE SCENARIO TEMPLATE THE
COMMUNICATION WITH THE ENTIRETEAM WILL IMPROVE ALOT
22. THAT SAME CONTEXT SINTAXE CAN BE AUTOMATED BY:
• CUCUMBER USING GHERKIN - HTTPS://CUCUMBER.IO/
• THOUGHTWORKS GAUGE - HTTP://GETGAUGE.IO/
• RSPEC CAN USE THAT SYNTAX TO NAME THE TEST SPECS
• JBEHAVE WAS CREATED THINKINGABOUT THAT
• SPECFLOW USINGGHERKIN - HTTP://WWW.SPECFLOW.ORG/
23. SAMPLE GHERKIN CODE
FEATURE:A SAMPLE CODE FORMY PRESENTATION
AS A SPEAKER
I WANT TO HAVE SOME CODE SAMPLES
SO THAT EVERYONE UNDERSTAND WHAT I'M TALKING ABOUT
SCENARIO: DOING A SIMPLE GOOGLE SEARCH
GIVENI'M ONTHE GOOGLE HOME PAGE
WHENIFILL THE SEARCH FIELD WITH "URUBATAN"
THENIWANT TO SEE "MY WEB PAGE"INTHE RESULTS
AND I WANT TO SEE "MY FACEBOOKPROFILE"INTHE RESULTS
24. SAMPLE CUCUMBERRUBY CODE
GIVEN(/^I'M ONTHE GOOGLE HOME PAGE$/) DO
PENDING # EXPRESSTHE REGEXP ABOVE WITHTHE CODE YOUWISH YOU HAD
END
WHEN(/^IFILL THE SEARCH FIELD WITH "(.*?)"$/) DO |ARG1|
PENDING # EXPRESSTHE REGEXP ABOVE WITHTHE CODE YOUWISH YOU HAD
END
THEN(/^IWANT TO SEE "(.*?)"INTHE RESULTS$/) DO |ARG1|
PENDING # EXPRESSTHE REGEXP ABOVE WITHTHE CODE YOUWISH YOU HAD
END
25. SAMPLE CUCUMBERJAVA CODE
public class MyStepdefs {
@cucumber.api.java.en.Then("^I want to see "([^"]*)" in the results$")
public void iWantToSeeInTheResults(String arg0) throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new cucumber.api.PendingException();
}
@cucumber.api.java.en.When("^I fill the search field with "([^"]*)"$")
public void iFillTheSearchFieldWith(String arg0) throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new cucumber.api.PendingException();
}
@cucumber.api.java.en.Given("^I'm on the google home page$")
public void iMOnTheGoogleHomePage() throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new cucumber.api.PendingException();
}
}
26. SAMPLE GAUGE CODE
A SAMPLE CODE FORMY PRESENTATION
=============
AS A SPEAKER, I WANT TO HAVE SOME CODE SAMPLES, SO THATEVERYONE UNDERSTAND WHATI'M TALKING ABOUT
DOING A SIMPLE GOOGLE SEARCH
-----------
*I'M ONTHE GOOGLE HOME PAGE
*I FILL THE SEARCH FIELD WITH "URUBATAN"
*I WANT TO SEE "MY WEB PAGE"INTHE RESULTS
*I WANT TO SEE "MY FACEBOOKPROFILE"INTHE RESULTS
27. SAMPLE GAUGE JAVA CODE
PUBLIC CLASS SAMPLEGAUGE {
@STEP("I'M ON THE GOOGLE HOME PAGE")
PUBLIC VOID GOTOGOOGLE() {
// STEP IMPLEMENTATION
}
@STEP("I FILL THE SEARCH FIELD WITH <VALUE>")
PUBLIC VOID FILLFIELD(STRING VALUE) {
// STEP IMPLEMENTATION
}
@STEP("I WANT TO SEE <ADDR> IN THE RESULTS")
PUBLIC VOID CHECKVALUE(STRING VALUE) {
// STEP IMPLEMENTATION
}
}
28. SAMPLE GAUGE RUBY CODE
STEP "I'M ONTHE GOOGLE HOME PAGE" DO
END
STEP "I FILL THE SEARCH FIELD WITH<NAME>" DO |NAME|
END
STEP "I WANT TOSEE <ADDRESS> INTHE RESULTS" |ADDRESS|
END