Behavior Driven Development
Manodnya Lele
Ben Maynard
About Litle & Co.
• Litle & Co. is a leading financial technology company
• One of the largest, private, non-bank proprietary processing platforms serving the Card-not-Presentmarketplace
• Specific expertise in Card-not-Present transactions, deep knowledge of Best Practices, Card Association Regulations, PCI and Data Security requirements
• Litle Vault is the 2011 Stevie Award Winner in New Product & Services (Web/IVR) category
Outline
• What is BDD?
• History
• Why not TDD?
• The Story
• Tools: Compare and Contrast
• Comments and Questions
What is BDD?
BDD can turn an idea for a requirement into implemented, tested, production-ready code simply and effectively, as long as the requirement is specific enough that everyone knows what’s going on.
-Dan North
What is BDD?
BDD can turn an idea for a requirement into implemented, tested, production-ready code simply and effectively, as long as the requirement is specific enough that everyone knows what’s going on.
-Dan North
What is BDD?
BDD can turn an idea for a requirement into implemented, tested, production-ready code simply and effectively, as long as the requirement is specific enough that everyone knows what’s going on.
-Dan North
What is BDD?
BDD can turn an idea for a requirement into implemented, tested, production-ready code simply and effectively, as long as the requirement is specific enough that everyone knows what’s going on.
-Dan North
History
1999
Test First
Development
2003
Behavior Driven
Development
History
1999
Test First
Development
2003
Behavior Driven
Development
Kent Beck
History
Dan NorthKent Beck
Why not TDD?
BAs / Program Managers Techies
Why not TDD?
BAs / Program Managers
• Requirements docs not technical enough
Techies
Why not TDD?
BAs / Program Managers
• Requirements docs not technical enough
Techies
• Test cases and unit tests too technical
Why not TDD?
Why not TDD?
BDDGiven… When… Then…
Why not TDD?
TDD
BDD
Why not TDD?
TDDBuilding the thing right
BDD
Why not TDD?
TDDBuilding the thing right
BDDBuilding the right thing
BDD:The Story
BDD: The Story
• A way to describe the requirement such that everyone
the business folks,
the analyst,
the developer,
the tester,
and others
has a common understanding of the scope of the work.
• A description of a requirement and its business benefit, and a set of criteria by which we all agree that it is “done”.
• Remember: Given… When… Then…
BDD: The Story
• The title should describe an activity
Describes actual behavior by a user of the system.
• The narrative should include a role, a feature and a benefit
“As a [role] I want [feature] so that [benefit]“
• The scenario should be described in terms of givens, eventsand outcomes
Given… When… Then…
BDD: The Story
Scenario 1: Smooth Checkout Process
Given our world class web sales app
And items in my shopping cart
When a user clicks “checkout”
Then the user will move through checkout
with a maximum of two page clicks
And maintain an https session with our site
Scenario 2: Better Site Uptime
Given that a potential buyer
When a user enters our URL into a browser
Then the site will be available over 99.97%
of the time
TitleEasier user experience with online site
NarrativeAs a(n) active, participating member of my companyI want a better online websiteSo that users can easily use and purchase on our website
BDD Tool Overview
Motivating Example
FizzBuzz
• Simple program that outputs a number and expects the player to guess which word applies:
– Divisible by 3: “Fizz”
– Divisible by 5: “Buzz”
– Divisible by 3 and 5: “FizzBuzz”
jbehave
http://jbehave.org
How to write a BDD test in jbehave
• Write the story in a file with a <story_name>.story name
• Create the implementation in Java in a class named <StoryName>Steps.java
• Create an Runner, extending JUnitStory to link the story to the implementation
• Runner also can specify other details such as output formats
jbehave Story
• Story: Play fizz-buzzAs a math game player
I would like to play fizz-buzz
So that I can learn how to calculate multiples
Scenario: When to fizz
Given a fizz-buzz player
When I ask to fizz-buzz for 3
Then I should get a fizz
Scenario: When to fizz-buzz
Given a fizz-buzz player
When I ask to fizz-buzz for <value>
Then I should get a <display>
• Examples:
|value|display|
|1|1|
|2|2|
|3|fizz|
|4|4|
|5|buzz|
|6|fizz|
|7|7|
|8|8|
|9|fizz|
|10|buzz|
|15|fizz-buzz|
|30|fizz-buzz|
jbehave Test Code
public class PlayFizzBuzzSteps
{
private FizzBuzzer fb;
private String answer;
@Given("a fizz-buzz player")
public void givenAFizzBuzzPlayer()
{ fb = new FizzBuzzer(3, 5);
}
@When("I ask to fizz-buzz for <value>")
@Alias("I ask to fizz-buzz for $value")
public void answer(@Named("value") final int value)
{ answer = fb.answer(value);
}
@Then("I should get a <display>")
@Alias("I should get a $display")
public void isBuzz(@Named("display") final String display)
{
assertThat(answer, is(display));
}
jbehave Runner
public class PlayFizzBuzz extends JUnitStory {
public PlayFizzBuzz()
{
addSteps(new InstanceStepsFactory(configuration(), new PlayFizzBuzzSteps())
.createCandidateSteps());
}
@Override
public Configuration configuration()
{
return super.configuration()
.useStoryReporterBuilder(new StoryReporterBuilder().withFormats(Format.CONSOLE,
Format.TXT,
Format.HTML));
}
}
easybhttp://easyb.org
FizzBuzz with easyb
narrative "while playing fizz-buzz", {
as_a "fizz-buzz player"
i_want "to automate my responses"
so_that "i always win"
}
scenario "fizzing", {
given "a fizz-buzz player", {
fb = new sf.projects.fizzbuzz.FizzBuzzer(3, 5)
}
when "3", {
display = fb.answer(3);
}
then "should fizz", { display.shouldBe "fizz" }
}
Cucumberhttp://cukes.info
Cucumber Feature
Feature: Play Fizz Buzz
As a math game player
I would like to play fizz-buzz
So that I can learn how to calculate multiples
Scenario: When to fizz
Given a fizz-buzz player
When I ask to fizz-buzz for 3
Then I should get a fizz
Cucumber Test Code
Given /a fizz-buzz player/ do |n|
@fb = FizzerBuzzer.new
end
When /I ask to fizz-buzz for 3/ do |op|
@result = @fb.answer op
end
Then /I should get a fizz/ do |result|
@result.should == result.to_f
end
Compare and Contrast
Criteria jbehave easyb Cucumber
Language written in
Java Groovy Ruby
Languages supported
Any language on the JVM
Any language on the JVM
Ruby or (with Cuke4Duke) Java
Writing the story and test
Separate files Single file Separate files
Running tests Commandline, Ant, Maven, IDEs like Eclipse, JUnit
Commandline, Ant, Maven, IDEs like Eclipse, JUnit
Commandline or (with Cuke4Duke) Ant, Maven, IDEs like Eclipse
Criteria jbehave easyb Cucumber
Pending tests feature
Supported Supported Supported
Running multiple tests
Supported Supported Supported
Assertion feature Can use Hamcrestmatchers for assertion
Uses ‘ensure’ syntax, similar to assert
Uses Ruby framework
Installation Easy Easy Fair
Documentation support
Good Extremely good No documentation but good community support
Year of inception 2003 2009 2008
Author Dan North Andy Glover Aslak Hellesøy
Summary
Given that you have heard this presentation
And discovered that BDD is really fun
When you are thinking about testing strategies
Then you should give BDD a chance!
• Questions /Comments are welcome….
• Contacts
– Ben Maynard: [email protected]
– Manodnya Lele: [email protected]
Materials
Ready-made BDD project (Sualeh Fatehi)
http://code.google.com/p/test-fizzbuzz/