Cucumber
collaboration language
discussion value
customers acceptance
Joseph Wilk
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
good time
What’s your acceptance
criteria?
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
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 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
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!'
Developer
Why do I
quote things?
Why can
Underscores! I not use ‘ $
Customer
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
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>
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>
Plaintext
Ruby Plaintext
Plaintext
Ruby
Ruby
Plaintext
Step Given a foaming cuke
Ruby Plaintext
Plaintext
Ruby
Ruby
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
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
Cucumber provides the
venue
Sinatra
Rails
Cuke4Duke
Cucumber Gateway?
World
domination?
Cucumber
Java Virtual Machine
Clojure
Cucumber English
Cucumber English
огурец 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
огурец 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
# 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
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) %>
... rule step_keyword
end (<%= keywords('given') %>) /
(<%= keywords('when') %>) /
(<%= keywords('then') %>) /
compiled
(<%= keywords('and') %>) /
(<%= keywords('but') %>)
end
Ruby ...
end
"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
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 list with a priority
So that ...
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!
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
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
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
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 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
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 Stock department
Wants Film members to add movies to their rental list with
a priority
Scenario: High priority
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"
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
, ,
@"===, ,_____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#####"'
"""""
Don’t force
Feature: Title
In order to <value>
As a <role>
structure I want <feature>
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 in "password" with "cuker"
And I click "login"
Abstraction Given I'm logged in
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
Email Email-spec
Webpages Webrat
Forms Webrat
Java/Swing Swinger
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
Need for SPEED
Slick wheels!
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
Scaling - TestJour
slaves
master
features
Bonjour
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)
Tag Hooks Before(‘@teleport’) do
teleport.prepare
Attach code to tags end
Focused Testing
@teleport
Feature: Invent teleportation
Run just enough tests @money
Feature: Make lots of money
Continuous Integration(WIP)
Fail
Work in Pass
Done
Pending
progress
add list $ cucumber --wip
movies movies
--tags @WIP
features/
edit
movies
delete
movies
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
Avoiding Unrealistic expectations
Further reading
• http://cukes.info
• http://wiki.github.com/
aslakhellesoy/cucumber
• http://blog.josephwilk.net
Thanks,
Call me
sometime
joe@josephwilk.net
http://github.com/josephwilk
http://github.com/aslakhellesoy/cucumber
Let LinkedIn power your SlideShare experience
+
Let LinkedIn power your SlideShare experience
Customize SlideShare content based on your interests
We will import your LinkedIn profile and you will be visible on SlideShare.
Keep up to date when your LinkedIn contacts post on SlideShare