Cucumbered

9,511 views

Published on

Presentation on Cucumber given at FutureRuby

Published in: Technology, Self Improvement
2 Comments
11 Likes
Statistics
Notes
No Downloads
Views
Total views
9,511
On SlideShare
0
From Embeds
0
Number of Embeds
6,181
Actions
Shares
0
Downloads
233
Comments
2
Likes
11
Embeds 0
No embeds

No notes for slide

Cucumbered

  1. 1. Cucumbered collaboration language discussion value customers acceptance Joseph Wilk
  2. 2. Why are you here?
  3. 3. Why are you here? In order ...
  4. 4. Why are you here? In order ... As a FutureRuby attendee
  5. 5. Why are you here? In order ... As a FutureRuby attendee I want ...
  6. 6. Why are you here? In order ... As a FutureRuby attendee I want ... I’ll show you a good time
  7. 7. What’s your acceptance criteria?
  8. 8. Scenario: Ecstatic FutureRuby 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. 9. Pass Fail
  10. 10. Pass Fail
  11. 11. Outside-in Users interface
  12. 12. “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
  13. 13. def given_ruby_provides_a_great_dsl(*arg) developers.should be_happy end given_ruby_provides_a_great_dsl 'run away!'
  14. 14. def given_ruby_provides_a_great_dsl(*arg) developers.should be_happy end given_ruby_provides_a_great_dsl 'run away!' Developer
  15. 15. Why do I quote things? Why can Underscores! I not use ‘ $ Customer
  16. 16. Customer Developer Tester
  17. 17. Customer Developer Cucumber Tester
  18. 18. Customer Developer Plaintext Ruby Tester
  19. 19. For Cuke Sake Why? • Token Conversation • Acceptance Criteria • Design • Documentation • Functional test • Integration test
  20. 20. 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>
  21. 21. Plaintext Ruby Ruby
  22. 22. Plaintext Step Given we like cukes Ruby Ruby
  23. 23. Plaintext Step Given we like cukes Given /^we like (.*)$/i do |fruit| Step fruit.should == 'cukes' #assert_equal(fruit, 'cukes') definition end Ruby Ruby
  24. 24. Plaintext Step Given we like cukes regexp match Given /^we like (.*)$/i do |fruit| Step fruit.should == 'cukes' #assert_equal(fruit, 'cukes') definition end Ruby Ruby
  25. 25. Cucumber provides the venue Sinatra Rails Cuke4Duke
  26. 26. Cucumber Gateway? World domination? Cucumber Java Virtual Machine Clojure
  27. 27. Cucumber English
  28. 28. Cucumber English
  29. 29. огурец 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
  30. 30. огурец 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
  31. 31. # language: en-lol OH HAI: STUFFING MISHUN: CUCUMBR I CAN HAZ IN TEH BEGINNIN 3 CUCUMBRZ WEN I EAT 2 CUCUMBRZ DEN I HAS 2 CUCUMBERZ IN MAH BELLY AN IN TEH END 1 CUCUMBRZ KTHXBAI ICANHAZ /^IN TEH BEGINNIN (d+) CUCUMBRZ$/ do |n| @basket = Basket.new(n.to_i) end WEN /^I EAT (d+) CUCUMBRZ$/ do |n| @belly = Belly.new @belly.eat(@basket.take(n.to_i)) end DEN /^I HAS (d+) CUCUMBERZ IN MAH BELLY$/ do |n| @belly.cukes.should == n.to_i end
  32. 32. How Cucumber supports 28+ languages
  33. 33. How Cucumber supports 28+ languages grammar Feature ... end
  34. 34. How Cucumber supports 28+ languages grammar Feature ... end compiled Ruby
  35. 35. 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
  36. 36. "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
  37. 37. Once more unto the breach, dear friends brace yourself
  38. 38. §
  39. 39. Feature Request I want members to be able to rent a movie with a priority indicating how much they want to see the film
  40. 40. Talk to me Token for Conversation
  41. 41. Feature Injection Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Film member Needs to add movies to their rental list with a priority
  42. 42. Feature Injection Value Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Film member Needs to add movies to their rental list with a priority
  43. 43. Feature Injection Value Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Film member Needs to add movies to their rental list with a priority Role
  44. 44. Feature Injection Value Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Film member Needs to add movies to their rental list with a priority Role Feature
  45. 45. Are we Acceptance done yet? Definition of Done.
  46. 46. Scenarios Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Film member Needs to add movies to their rental list with a priority Scenario: High priority
  47. 47. Scenarios Feature: Film Member selects a movie to rent with priority In order to maximise allocation of films The Film member Needs to add movies to their rental list with a priority Scenario: High priority Given I'm logged in When I touch the movie "Casshern" And I touch the "Rent High priority" button Then I should see "Movie added to rental list" And I should see "Casshern" in my rental list And "Casshern" should be marked as "High priority"
  48. 48. http://iphonemockup.lkmc.ch
  49. 49. Cuking time About cuking time!
  50. 50. Low Res: http://www.vimeo.com/5642761 High Res: http://www.screencast.com/t/cZZ2cofHupn
  51. 51. Here’s one I Cuked earlier Tasty
  52. 52. Low Res: http://www.vimeo.com/5642687 High Res: http://www.screencast.com/t/4JV2VQGMj2G
  53. 53. Getting Customers using Cucumber
  54. 54. Getting Customers using Cucumber I don’t bite
  55. 55. 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#####"' """""
  56. 56. Don’t force Feature: Title In order to <value> As a <role> structure I want <feature>
  57. 57. Avoid Noise! Given I am able to login Given I am able to login
  58. 58. Avoid Given I login Given I authenticate Inconsistency Given I gain access
  59. 59. 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
  60. 60. 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
  61. 61. Tagging Eye Head Teeth Foam Dribble
  62. 62. Tagging Feature: Verify billing @done Scenario: Missing product description @in-progress Scenario: Several products $ cucumber --tags ~@in-progress $ cucumber --tags @done
  63. 63. Focused Testing @teleport Feature: Invent teleportation Run just enough tests @money Feature: Make lots of money
  64. 64. Continuous Integration(WIP) Fail Work in Pass Done Pending progress add list $ cucumber --wip movies movies --tags @WIP features/ edit movies delete movies
  65. 65. 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 add add add delete movies movies movies movies
  66. 66. Further reading • http://cukes.info • http://wiki.github.com/ aslakhellesoy/cucumber • http://blog.josephwilk.net
  67. 67. Thanks, Call me sometime joe@josephwilk.net http://github.com/josephwilk http://github.com/aslakhellesoy/cucumber

×