Cucumber
collaboration   language
discussion      value
customers       acceptance


                             Joseph W...
Why are you here?
Why are you here?
In order ...
Why are you here?
In order ...
As a Underground attendee
Why are you here?
In order ...
As a Underground attendee
I want ...
Why are you here?
In order ...
As a Underground attendee
I want ...
                    I’ll show you a
                  ...
What’s your acceptance
       criteria?
Scenario: Ecstatic Underground attendees
 Given people turned up
 When Joseph talks
 Then everyone should learn something ...
Pass
Fail
Pass
 Fail
How do you know
  your finished?
           You’ll know
            when I’m
             finished
Outside-in
    User
   Browser
Outside-in
    User
   Browser

   Views
Outside-in
     User
   Browser

    Views


  Controllers
   Models
“I believe that the hardest part of software projects, the
most common source of project failure, is
communication with th...
def given_ruby_provides_a_great_dsl(*arg)
  developers.should be_happy
end

given_ruby_provides_a_great_dsl 'run away!'
def given_ruby_provides_a_great_dsl(*arg)
  developers.should be_happy
end

given_ruby_provides_a_great_dsl 'run away!'


...
Why do I
                          quote things?

                            Why can
Underscores!              I not use ...
Customer            Developer




           Tester
Customer            Developer




           Tester
Customer                    Developer



           Microsoft Word




                   Tester
Customer                 Developer



           Cucumber




                Tester
Customer                        Developer

           Plaintext     Ruby




                       Tester
For Cuke Sake Why?
• Token Conversation
• Acceptance Criteria
• Design
• Documentation
• Functional test
• Integration test
Cucumber Feature
             Feature: Be awesome          Not
               Narrative                executed
Example of...
Cucumber Feature
             Feature: Be awesome          Not
               Narrative                executed
Example of...
Plaintext




Ruby               Plaintext
       Plaintext


        Ruby
        Ruby
Plaintext

Step   Given a foaming cuke




              Ruby               Plaintext
                     Plaintext


   ...
Plaintext

  Step      Given a foaming cuke




                   Ruby               Plaintext
                          ...
Plaintext

  Step      Given a foaming cuke




                                               regexp match
              ...
Cucumber provides the
      venue

                       Sinatra




                        Rails
           Cuke4Duke
Cucumber Gateway?
                               World
                             domination?




                      ...
Cucumber   English
Cucumber   English
огурец       Russian
concombre    French
             Japanese
Okurkový     Czech
Gurke        German
Cucumber     English...
огурец       Russian                     Korean
concombre    French
                          gurka          Swedish
     ...
# language: en-au
Crikey: Eating

  Mate: cucumbers
    Ya now how I have 3 cucumbers
    When I eat 2 cucumbers
    Ya go...
How Cucumber
supports 28+ languages
How Cucumber
     supports 28+ languages


grammar Feature
  ...
end
How Cucumber
       supports 28+ languages


grammar Feature
  ...
end


compiled



       Ruby
How Cucumber
       supports 28+ languages


grammar Feature   grammar <%= keywords('grammar_name', true) %>
  ...        ...
"en-lol":                          "en-au":
  name: LOLCAT                       name: Australian
  native: LOLCAT        ...
Webrat
 Love
visit home_path
click_link "Web"
fill_in "Email", :with => "Rat”
click_button "Love"
                         ...
Once more
    unto the breach,
      dear friends
brace yourself
§
Feature Request
I want members to be able to
rent a movie with a priority
indicating how much they
want to see the film
Talk
                   to me




Token for Conversation
Story

Story: Film Member selects a movie to rent with priority
  As a Film member
  I want to add movies to my rental lis...
Story

Story: Film Member selects a movie to rent with priority
  As a Film member
  I want to add movies to my rental lis...
Feature Injection

Feature: Film Member selects a movie to rent with priority
  In order to maximise allocation of films
 ...
Feature Injection
Value
        Feature: Film Member selects a movie to rent with priority
          In order to maximise ...
Feature Injection
Value
        Feature: Film Member selects a movie to rent with priority
          In order to maximise ...
Feature Injection
Value
        Feature: Film Member selects a movie to rent with priority
          In order to maximise ...
Feature Injection
Value
        Feature: Film Member selects a movie to rent with priority
          In order to maximise ...
Are we


   Acceptance
                     done yet?




Definition of Done.
Scenarios
Feature: Film Member selects a movie to rent with priority
  In order to maximise allocation of films
  The Stoc...
Scenarios
Feature: Film Member selects a movie to rent with priority
  In order to maximise allocation of films
  The Stoc...
http://iphonemockup.lkmc.ch
Cuking time

   About
cuking time!
High Res: http://www.screencast.com/t/HbvPTbGy

   Low Res: http://www.vimeo.com/5751831
Here’s one I Cuked
      earlier

 Tasty
High Res: http://www.screencast.com/t/2E4nfzXotZ

    Low Res: http://www.vimeo.com/5751873
Getting Customers
 using Cucumber
Getting Customers
 using Cucumber

           I don’t
            bite
The Art of
       War Plaintext
                   ,                                               ,
                  @"=...
Don’t force
              Feature: Title
                In order to <value>
                As a <role>

 structure      ...
Avoid Noise!
               Given I am able to login
               Given I am able to login
Avoid       Given I login
                Given I authenticate

Inconsistency   Given I gain access
Given   I go to the login page


 Balance
              And I   fill in "username" with "cuke"
              And I   fill ...
Use Language
               Building blocks
Given /I’m logged in/ do
  User.create!(:user => 'josephwilk', :password => "p...
Email        Email-spec

Webpages     Webrat

Forms        Webrat




Java/Swing   Swinger
Gherkin Metrics?
             Lack of narrative
# language: en-au
Crikey: Eating

  Mate: cucumbers                       ...
Need for SPEED


Slick wheels!
Spork
require 'rubygems'
require 'spork'

# Sets up the Rails environment for Cucumber
ENV["RAILS_ENV"] ||= "cucumber"

Sp...
Scaling - TestJour

                        slaves


    master




             features


                              ...
Need for speed
 Webrat 0.8



Celerity                                   12




  Watir                                   ...
Tagging
Eye   Head

         Teeth
        Foam
        Dribble
Tagging
Feature: Verify billing

 @javascript
 Scenario: Missing product description

  Scenario: Several products




 $ ...
Tag Hooks             Before(‘@teleport’) do
                        teleport.prepare
Attach code to tags   end
Focused Testing
                          @teleport
                          Feature: Invent teleportation


  Run just e...
Continuous Integration(WIP)
    Fail
  Work in    Pass
             Done
  Pending
  progress

    add       list    $ cuc...
Limiting Tags in Flow
   Work in
                    Done
   progress

 add add add add
movies movies
   movies movies    ...
Avoiding Unrealistic expectations
Further reading

•   http://cukes.info

•   http://wiki.github.com/
    aslakhellesoy/cucumber

•   http://blog.josephwilk...
Thanks,
                           Call me
                          sometime



                      joe@josephwilk.net
...
Upcoming SlideShare
Loading in …5
×

Cucumber Ru09 Web

7,511 views

Published on

Presentation on Cucumber given at Rails Underground 2009

Published in: Technology, Self Improvement
0 Comments
25 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,511
On SlideShare
0
From Embeds
0
Number of Embeds
521
Actions
Shares
0
Downloads
0
Comments
0
Likes
25
Embeds 0
No embeds

No notes for slide

Cucumber Ru09 Web

  1. Cucumber collaboration language discussion value customers acceptance Joseph Wilk
  2. Why are you here?
  3. Why are you here? In order ...
  4. Why are you here? In order ... As a Underground attendee
  5. Why are you here? In order ... As a Underground attendee I want ...
  6. Why are you here? In order ... As a Underground attendee I want ... I’ll show you a good time
  7. What’s your acceptance criteria?
  8. Scenario: Ecstatic Underground attendees Given people turned up When Joseph talks Then everyone should learn something new And no-one should fall asleep And no cucumbers should be thrown
  9. Pass Fail
  10. Pass Fail
  11. How do you know your finished? You’ll know when I’m finished
  12. Outside-in User Browser
  13. Outside-in User Browser Views
  14. Outside-in User Browser Views Controllers Models
  15. “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
  16. def given_ruby_provides_a_great_dsl(*arg) developers.should be_happy end given_ruby_provides_a_great_dsl 'run away!'
  17. def given_ruby_provides_a_great_dsl(*arg) developers.should be_happy end given_ruby_provides_a_great_dsl 'run away!' Developer
  18. Why do I quote things? Why can Underscores! I not use ‘ $ Customer
  19. Customer Developer Tester
  20. Customer Developer Tester
  21. Customer Developer Microsoft Word Tester
  22. Customer Developer Cucumber Tester
  23. Customer Developer Plaintext Ruby Tester
  24. For Cuke Sake Why? • Token Conversation • Acceptance Criteria • Design • Documentation • Functional test • Integration test
  25. Cucumber Feature Feature: Be awesome Not Narrative executed Example of Scenario: title behaviour which rocks Given <some context> And <yet more context> When <some action> Steps And <more actions> Then <some outcome> And <more outcomes>
  26. Cucumber Feature Feature: Be awesome Not Narrative executed Example of Scenario: title behaviour which rocks Given <some context> And <yet more context> When <some action> Steps And <more actions> Then <some outcome> And <more outcomes>
  27. Plaintext Ruby Plaintext Plaintext Ruby Ruby
  28. Plaintext Step Given a foaming cuke Ruby Plaintext Plaintext Ruby Ruby
  29. Plaintext Step Given a foaming cuke Ruby Plaintext Plaintext Given /^a foaming (.*)$/i do |fruit| Step fruit.should == 'cukes' #assert_equal(fruit, 'cukes') definition end Ruby Ruby
  30. Plaintext Step Given a foaming cuke regexp match Ruby Plaintext Plaintext Given /^a foaming (.*)$/i do |fruit| Step fruit.should == 'cukes' #assert_equal(fruit, 'cukes') definition end Ruby Ruby
  31. Cucumber provides the venue Sinatra Rails Cuke4Duke
  32. Cucumber Gateway? World domination? Cucumber Java Virtual Machine Clojure
  33. Cucumber English
  34. Cucumber English
  35. огурец Russian concombre French Japanese Okurkový Czech Gurke German Cucumber English pepino Spanish cetriolo Italian agurk Danish ‫ﺍﳋﻴﺎﺭ‬ Arabic ketimun Indonesian ‫מְלָפְפֹון‬ Hebrew Cogombre Catalan CUCUMBR LOLCats Agurk Norwegian
  36. огурец Russian Korean concombre French gurka Swedish Japanese castravete Romanian Okurkový Czech ogórek Polish Gurke German Cucumber English Kurk Estonian pepino Spanish dưa chuột Vietnamese cetriolo Italian uhorka Slovak agurk Danish gurķis Latvian ‫ﺍﳋﻴﺎﺭ‬ Arabic Agurkas Lithuanian ketimun Indonesian Salátauborka Hungarian ‫מְלָפְפֹון‬ Hebrew Kurkku Finnish Cogombre Catalan Краставица Bulgarian CUCUMBR LOLCats Agurk Norwegian Pepino Portuguese
  37. # language: en-au Crikey: Eating Mate: cucumbers Ya now how I have 3 cucumbers When I eat 2 cucumbers Ya gotta have 2 cucumbers in the belly N I have 1 cucumber left YaNowHow /^I have (d+) cucumbers$/ do |n| @basket = Basket.new(n.to_i) end When /^I eat (d+) cucumbers$/ do |n| @belly = Belly.new @belly.eat(@basket.take(n.to_i)) end YaGotta /^have (d+) cucumbers in the belly$/ do |n| @belly.cukes.should == n.to_i end
  38. How Cucumber supports 28+ languages
  39. How Cucumber supports 28+ languages grammar Feature ... end
  40. How Cucumber supports 28+ languages grammar Feature ... end compiled Ruby
  41. How Cucumber supports 28+ languages grammar Feature grammar <%= keywords('grammar_name', true) %> ... rule step_keyword end (<%= keywords('given') %>) / (<%= keywords('when') %>) / (<%= keywords('then') %>) / compiled (<%= keywords('and') %>) / (<%= keywords('but') %>) end Ruby ... end
  42. "en-lol": "en-au": name: LOLCAT name: Australian native: LOLCAT native: Australian encoding: UTF-8 encoding: UTF-8 feature: OH HAI feature: Crikey background: B4 background: Background scenario: MISHUN scenario: Mate scenario_outline: MISHUN SRSLY scenario_outline: Blokes examples: EXAMPLZ examples: Cobber given: I CAN HAZ given: Ya know how when: WEN when: When then: DEN then: Ya gotta and: AN and: N but: BUT but: Cept space_after_keyword: true space_after_keyword: true
  43. Webrat Love visit home_path click_link "Web" fill_in "Email", :with => "Rat” click_button "Love" Bansky
  44. Once more unto the breach, dear friends brace yourself
  45. §
  46. Feature Request I want members to be able to rent a movie with a priority indicating how much they want to see the film
  47. Talk to me Token for Conversation
  48. Story Story: Film Member selects a movie to rent with priority As a Film member I want to add movies to my rental list with a priority So that ...
  49. Story Story: Film Member selects a movie to rent with priority As a Film member I want to add movies to my rental list with a priority So that ... Give me the movie NOW!
  50. Feature Injection Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Stock department Wants Film members to add movies to their rental list with a priority
  51. Feature Injection Value Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Stock department Wants Film members to add movies to their rental list with a priority
  52. Feature Injection Value Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Stock department Wants Film members to add movies to their rental list with Role a priority
  53. Feature Injection Value Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Stock department Wants Film members to add movies to their rental list with Role a priority Role
  54. Feature Injection Value Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Stock department Wants Film members to add movies to their rental list with Role a priority Role Feature
  55. Are we Acceptance done yet? Definition of Done.
  56. Scenarios Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Stock department Wants Film members to add movies to their rental list with a priority Scenario: High priority
  57. Scenarios Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Stock department Wants Film members to add movies to their rental list with a priority Scenario: High priority Given I'm logged in And I am viewing the movie "Casshern" When I choose "High priority" And I press "Rent" Then I should see "My rental list" And I should see "Casshern" in my rental list And "Casshern" should be marked as "High priority"
  58. http://iphonemockup.lkmc.ch
  59. Cuking time About cuking time!
  60. High Res: http://www.screencast.com/t/HbvPTbGy Low Res: http://www.vimeo.com/5751831
  61. Here’s one I Cuked earlier Tasty
  62. High Res: http://www.screencast.com/t/2E4nfzXotZ Low Res: http://www.vimeo.com/5751873
  63. Getting Customers using Cucumber
  64. Getting Customers using Cucumber I don’t bite
  65. The Art of War Plaintext , , @"===, ,_____cctI "?AAAAAAAAAAAAAAAA,,,,,,,,,,,,,,,,,,,,,;LLLLLLLLLL ~",,, 1""""""""""""###OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO '"EEEEE, !'"***"~~~~~~"OOOIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ,EEEEE)>"'''???????"WWW!MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM "E.,)+="WWW~~~~~~#"OOO1OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ,~:#")LLL!"+++???????"$$$1==========##/ &LLLLLLLLL;;;;;;;;;;;;,,,/ 1#LLLLLLLLLLLLLLLLLLLLLL! ,!###LLLLLL"'EEEE,'"LLLLL! !######LLL" "EEE" "LLLL" !#########L! "EEJ. "LL! !##########1 "JJ*,l" !############"! ,l" 1##########" 1"~~,~~" !##########" !###########! !###########1 !############! 1############# !"#############" !##############! 1##########"' A magnum, By calendron 1#####"' """""
  66. Don’t force Feature: Title In order to <value> As a <role> structure I want <feature>
  67. Avoid Noise! Given I am able to login Given I am able to login
  68. Avoid Given I login Given I authenticate Inconsistency Given I gain access
  69. Given I go to the login page Balance And I fill in "username" with "cuke" And I fill in "password" with "cuker" And I click "login" Abstraction Given I'm logged in
  70. Use Language Building blocks Given /I’m logged in/ do User.create!(:user => 'josephwilk', :password => "pass") Given 'I fill in "password" with "josephwilk"' Given 'I fill in "password" with "pass"' Given 'I click "login"' end
  71. Email Email-spec Webpages Webrat Forms Webrat Java/Swing Swinger
  72. Gherkin Metrics? Lack of narrative # language: en-au Crikey: Eating Mate: cucumbers Number Ya now how I have 3 cucumbers When I eat 2 cucumbers of steps Ya gotta have 2 cucumbers in the belly N I have 1 cucumber left Number of Semantically noise words similar words
  73. Need for SPEED Slick wheels!
  74. Spork require 'rubygems' require 'spork' # Sets up the Rails environment for Cucumber ENV["RAILS_ENV"] ||= "cucumber" Spork.prefork do $ spork cuc # Load all the heavy stuff... end Spork.each_run do $ cucumber --drb ... # Load the stuff just for this run... Before do Pages.delete_all end end
  75. Scaling - TestJour slaves master features Bonjour
  76. Need for speed Webrat 0.8 Celerity 12 Watir 12 Selenium 12.9 0 3.75 7.5 11.25 15 start-up time (seconds)
  77. Tagging Eye Head Teeth Foam Dribble
  78. Tagging Feature: Verify billing @javascript Scenario: Missing product description Scenario: Several products $ cucumber --tags ~@javascript $ cucumber --tags @javascript
  79. Tag Hooks Before(‘@teleport’) do teleport.prepare Attach code to tags end
  80. Focused Testing @teleport Feature: Invent teleportation Run just enough tests @money Feature: Make lots of money
  81. Continuous Integration(WIP) Fail Work in Pass Done Pending progress add list $ cucumber --wip movies movies --tags @WIP features/ edit movies delete movies
  82. Limiting Tags in Flow Work in Done progress add add add add movies movies movies movies $ cucumber --tags @WIP:3 features/ add add add edit movies movies movies movies limit 3 tags add add add delete movies movies movies movies
  83. Avoiding Unrealistic expectations
  84. Further reading • http://cukes.info • http://wiki.github.com/ aslakhellesoy/cucumber • http://blog.josephwilk.net
  85. Thanks, Call me sometime joe@josephwilk.net http://github.com/josephwilk http://github.com/aslakhellesoy/cucumber

×