bdd, cucumber and freinds
TRANSCRIPT
Frank Duan
Kinesis
2010
Introduction to BDD
Introduction to Cucumber
Stories and Cucumber features
Building Cucumber Scenarios and Steps
Tools
Slicing Cucumber
Cucumber Catalyst
FAIL
“I believe that the hardest part of software projects, the most common source of project failure, is communication with the customers and users of that software.
By providing a clear yet precise language to deal with domains, a DSL can help improve this communication.”
Martin Fowler
To meet requirement
To guarantee quality
verify confidence Design Behaviour
GAP
Outside-In
Feature
Scenario
Scenario: title
Given [Context]
And [More Context]
When [Action]
And [Other Action]
Then [Expected Outcome]
But [Unexpected Outcome]
A story
Token for Conversation
Meet Gherkin
Scenario: search by director
Given the store has movies directed by “Steven Spielberg”
When I search for “Steven Spielberg”
Then I should see all of the movies directed by “Steven Spielberg”
Meet Advanced Gherkin –TABLEScenario: search by directorGiven the following movies are in stock:| Title | Director | Year || Jaws | Steven Spielberg | 1975 || Star Wars | George Lucas | 1975 || Dawn of the Dead | George Romero | 1978 || E.T. | Steven Spielberg | 1982 |
When I search for "Spielberg" under "Director"Then I should see the following table:
| Title | Director | Year || Jaws | Steven Spielberg | 1975 || E.T. | Steven Spielberg | 1982 |
Meet Advanced Gherkin –Multi-Line String
Scenario: register successfully
Given I am on on the registration page
When I sign up as "Jojo Binks"
Then I should receive the following email:
"""
Thanks for signing up Jojo!
Important information about here.
"""
Meet Advanced Gherkin –Scenario Outlines
Scenario Outline: search by director
Given the following movies are in stock:
| Title | Director | Year |
| Jaws | Steven Spielberg | 1975 |
| Star Wars | George Lucas | 1975 |
| Dawn of the Dead | George Romero | 1978 |
| E.T. | Steven Spielberg | 1982 |
When I search for "<Director Query>" under "Director"
Then I the search results should be "<Search Results>"
Examples:
| Director Query | Search Results |
| Steve | E.T., Jaws |
| George | Dawn of the Dead, Star Wars |
| Lucas | Star Wars |
Building step definition (Example)
Scenario: Create a new company
Given I am logged in
When I create a new company named Acme
Then I should see that a company named Acme exists
Building step definition – Given
Given == Setup
Given "I am logged in" douser = Factory(:user)
visits new_session_path
fills_in ‘Login’, :with => user.login
fills_in ‘Password’, :with => user.password
clicks_button ‘Login’
end
Building step definition – When
When == Change
When "I create a new company named $name" do |name|
visits new_company_path
fills_in 'Name', :with => name
clicks_button 'Create'
end
Building step definition – Then
Then == Outcome
Then "I should see that a company named $name exists" do |name|
response.body.should =~ Regexp.new(name)
end
Hooks – Before and After Generic hooks or hooks by tags
Background
Adpating rspec DSL for validation
DOESN’T adpate rspec mock module
Use factory_girl instead
factory_girl: load data into database for test
Given "I am logged in" douser = Factory(:user)visits new_session_pathfills_in ‘Login’, :with => user.loginfills_in ‘Password’, :with => user.passwordclicks_button ‘Login’
end Factory.sequence(:email) {|n| "user#{n}@example.com" }Factory.define :user do |user|
user.name 'User'user.email { Factory.next(:email) }user.login {|u| u.email }user.password 'password'user.password_confirmation 'password'
end
Simulating or drive Browsers
Feature on Javascript test
Flexibility on switching drivers to achieve different test demand
Flexibility on switching between css and xpath selector
Covering most of the popular browser driving
Remote calling (for IE test on VM)
Highlight keywords in Gherkin
Autocomplete by hotkey
Run by hotkey and present visual report
A DRb server for testing frameworks (RSpec / Cucumber currently) that forks before each run to ensure a clean testing state.
Soren knows all about that : s
Lazy coverage-aware running of Cucumber acceptance tests
Run a scenario if it needs to
Distributed testing framework
Spread your tests over processors and/or multiple machines to test your code faster
Don’t force structure
Avoid Noise!
Avoid Inconsistency
Balance Abstraction
Building step abstraction from steps
Tagging
Tagging for focused testing
Tagging for categorizing test by purpose and environs
Tagging for loading capybara configuration
Slow builds are the enemy of continuous integration
Reuse – Spork, Cucover
Run Just Enough Tests
Slicing Features with tags
Just enough Database and try NullDB
Distributed testing - hydra
The Rspec Book
http://www.slideshare.net/josephwilk/rocket-fuelled-cucumbers
http://www.slideshare.net/bkeepers/behavior-driven-development-with-cucumber-presentation
http://www.slideshare.net/josephwilk/cucumbered
http://www.slideshare.net/bmabey/cucumber-automating-the-requirements-language-you-already-speak
Thanks for your patience