SlideShare a Scribd company logo
Aslak Hellesøy - Chief Scientist
http://cukes.info/
twitter.com/aslak_hellesoy
aslak.hellesoy@gmail.com
http://www.flickr.com/photos/cobalt/190883654/
http://www.flickr.com/photos/atomicshark/215358660
THIS IS
REALLY
BAD
NEWS!!
http://www.flickr.com/photos/jelles/2656101758/
85 committers
989 github followers
33000 gem downloads
30 related tools
http://www.flickr.com/photos/twose/887903401/
http://www.flickr.com/photos/purrr/126597849/
It s testing crack.
One serious stab
at using it and
I'm hooked.
features
step_definitions
support
env.rb
webrat_steps.rb
paths.rb
Installing Cucumber
$ gem install cucumber webrat rspec-rails rspec
$ script/generate cucumber
ENV["RAILS_ENV"] ||= "test"
require File.expand_path(File.dirname(__FILE__) +
'/../../config/environment')
require 'cucumber/rails/world'
require 'cucumber/formatter/unicode'
Cucumber::Rails.use_transactional_fixtures
Cucumber::Rails.bypass_rescue
# Plus some more setup stuff.....
env.rb
webrat_steps.rb
Given /^I am on (.+)$/ do |page_name|
visit path_to(page_name)
end
When /^I press "([^"]*)"$/ do |button|
click_button(button)
end
Then /^I should see "([^"]*)"$/ do |text|
response.should contain(text)
end
module NavigationHelpers
# When /^I go to (.+)$/ do |page_name|
def path_to(page_name)
case page_name
when /the homepage/
'/'
when /^(.*)'s profile page$/i
user_profile_path(User.find_by_login($1))
else
raise "Can't find mapping for "#{page_name}""
end
end
end
World(NavigationHelpers)
paths.rb
Outside-In
Quality Code With Cucumber Presentation
Proposal notification
In order to reduce time spent on emailing
Administrators should be able to
mail proposal status to all owners
Given
When
Then
Feature: Proposal notification
In order to reduce time spent on emailing
Administrators should be able to mail
all proposals owners depending on status
Scenario: Email accepted proposal
Given aslak.hellesoy@gmail.com proposed Cucumber
And the Cucumber proposal is approved
When I send proposal emails
Then aslak.hellesoy@gmail.com should get email
"""
Hi aslak.hellesoy@gmail.com
Congratulations, Cucumber was accepted.
See you at RailsConf!
"""
Our First Feature
features/proposal_notification.feature
$ cucumber features/proposal_notification.feature
Run the feature
Feature: Proposal notification
In order to reduce time spent on emailing
Administrators should be able to mail
all proposals owners depending on status
Scenario: Email accepted proposal
Given aslak.hellesoy@gmail.com proposed Cucumber
And the Cucumber proposal is approved
When I send proposal emails
Then aslak.hellesoy@gmail.com should get email
"""
Hi aslak.hellesoy@gmail.com
Congratulations, Cucumber was accepted.
See you at RailsConf!
"""
1 scenario (1 undefined)
4 steps (4 undefined)
Feature: Proposal notification
In order to reduce time spent on emailing
Administrators should be able to mail
all proposals owners depending on status
Scenario: Email accepted proposal
Given aslak.hellesoy@gmail.com proposed Cucumber
And the Cucumber proposal is approved
When I send proposal emails
Then aslak.hellesoy@gmail.com should get email
"""
Hi aslak.hellesoy@gmail.com
Congratulations, Cucumber was accepted.
See you at RailsConf!
"""
1 scenario (1 undefined)
4 steps (4 undefined)
You can implement step definitions for undefined steps
with these snippets:
Given /^aslak.hellesoy@gmail.com proposed Cucumber$/ do
pending
end
Given /^the Cucumber proposal is approved$/ do
pending
end
When /^I send proposal emails$/ do
pending
end
Then /^aslak.hellesoy@gmail.com should get email$/ do
|string|
pending
end
Given /^aslak.hellesoy@gmail.com proposed Cucumber$/ do
pending
end
Given /^the Cucumber proposal is approved$/ do
pending
end
When /^I send proposal emails$/ do
pending
end
Then /^aslak.hellesoy@gmail.com should get email$/ do
|string|
pending
end
Step Definitions
features/step_definitions/proposal_steps.rb
features
step_definitions
support
env.rb
proposal_steps.rb
paths.rb
webrat_steps.rb
proposal_n..n.feature
Feature: Proposal notification
In order to reduce time spent on emailing
Administrators should be able to mail
all proposals owners depending on status
Scenario: Email accepted proposal
Given aslak.hellesoy@gmail.com proposed Cucumber
TODO (Cucumber::Pending)
features/step_definitions/proposal_steps.rb:2
features/proposal_notification.feature:7
And the Cucumber proposal is approved
When I send proposal emails
Then aslak.hellesoy@gmail.com should get email
"""
Hi aslak.hellesoy@gmail.com
Congratulations, Cucumber was accepted.
See you at RailsConf!
"""
Given /^aslak.hellesoy@gmail.com proposed Cucumber$/ do
Proposal.create!({
:email => 'aslak.hellesoy@gmail.com',
:title => 'Cucumber'
})
end
Do what Regexp says
features/step_definitions/proposal_steps.rb
Feature: Proposal notification
In order to reduce time spent on emailing
Administrators should be able to mail
all proposals owners depending on status
Scenario: Email accepted proposal
Given aslak.hellesoy@gmail.com proposed Cucumber
uninitialized constant Proposal (NameError)
features/step_definitions/proposal_steps.rb:2
features/proposal_notification.feature:7
And the Cucumber proposal is approved
When I send proposal emails
Then aslak.hellesoy@gmail.com should get email
"""
Hi aslak.hellesoy@gmail.com
Congratulations, Cucumber was accepted.
See you at RailsConf!
"""
$ script/generate rspec_scaffold proposal 
email:string title:string approved:boolean
$ rake db:migrate db:test:clone
$ cucumber features --no-source
Make it Pass
Feature: Proposal notification
In order to reduce time spent on emailing
Administrators should be able to mail
all proposals owners depending on status
Scenario: Email accepted proposal
Given aslak.hellesoy@gmail.com proposed Cucumber
And the Cucumber proposal is approved
TODO (Cucumber::Pending)
features/step_definitions/proposal_steps.rb:9
features/proposal_notification.feature:8
When I send proposal emails
Then aslak.hellesoy@gmail.com should get email
"""
Hi aslak.hellesoy@gmail.com
Congratulations, Cucumber was accepted.
See you at RailsConf!
"""
Given /^the Cucumber proposal is approved$/ do
proposal = Proposal.find_by_title('Cucumber')
proposal.approved = true
proposal.save!
end
Implement Intention
features/step_definitions/proposal_steps.rb
Feature: Proposal notification
In order to reduce time spent on emailing
Administrators should be able to mail
all proposals owners depending on status
Scenario: Email accepted proposal
Given aslak.hellesoy@gmail.com proposed Cucumber
And the Cucumber proposal is approved
When I send proposal emails
TODO (Cucumber::Pending)
features/step_definitions/proposal_steps.rb:15
features/proposal_notification.feature:9
Then aslak.hellesoy@gmail.com should get email
"""
Hi aslak.hellesoy@gmail.com
Congratulations, Cucumber was accepted.
See you at RailsConf!
"""
When /^I send mass proposal email$/ do
visit(’admin’)
click_button("Send proposal emails")
end
Webrat
Feature: Proposal notification
In order to reduce time spent on emailing
Administrators should be able to mail
all proposals owners depending on status
Scenario: Email accepted proposal
Given aslak.hellesoy@gmail.com proposed Cucumber
And the Cucumber proposal is approved
When I send mass proposal email
No route matches "/admin" with {:method=>:get}
features/step_definitions/proposal_steps.rb:16
features/proposal_notification.feature:9
Then aslak.hellesoy@gmail.com should get email
"""
Hi aslak.hellesoy@gmail.com
Congratulations, Cucumber was accepted.
See you at RailsConf!
"""
Quality Code With Cucumber Presentation
Add the Controller
class AdminController < ApplicationController
def index
end
end
Feature: Proposal notification
In order to reduce time spent on emailing
Administrators should be able to mail
all proposals owners depending on status
Scenario: Email accepted proposal
Given aslak.hellesoy@gmail.com proposed Cucumber
And the Cucumber proposal is approved
When I send mass proposal email
Could not find link "Send proposal emails"
features/step_definitions/proposal_steps.rb:16
features/proposal_notification.feature:9
Then aslak.hellesoy@gmail.com should get email
"""
Hi aslak.hellesoy@gmail.com
Congratulations, Cucumber was accepted.
See you at RailsConf!
"""
Add the link
<%= link_to("Send proposal emails",
:action => 'mass_email') %>
And #mass_email
class AdminController < ApplicationController
def index
end
def mass_email
end
end
Feature: Proposal notification
In order to reduce time spent on emailing
Administrators should be able to mail
all proposals owners depending on status
Scenario: Email accepted proposal
Given aslak.hellesoy@gmail.com proposed Cucumber
And the Cucumber proposal is approved
When I send mass proposal email
Then aslak.hellesoy@gmail.com should get email
"""
Hi aslak.hellesoy@gmail.com
Congratulations, Cucumber was accepted.
See you at RailsConf!
"""
Email-Spec
Then /^... should get email$/ do |body|
open_email('aslak.hellesoy@gmail.com')
current_email.body.should == body
end
class AdminController < ApplicationController
def index
end
def mass_email
approved = Proposal.find_all_by_approved(true)
approved.each do |proposal|
AdminMailer.deliver_notification_email(proposal)
end
end
end
Controller
class AdminMailer < ActionMailer::Base
def notification_email(proposal)
recipients proposal.email
from "confreg@oreilly.com"
subject "Your Railsconf proposal"
body :proposal => proposal
end
end
Mailer
Hi <%= @proposal.email %>
Congratulations, <%= @proposal.title %> was accepted.
See you at RailsConf!
Mailer template
Feature: Proposal notification
In order to reduce time spent on emailing
Administrators should be able to mail
all proposals owners depending on status
Scenario: Email accepted proposal
Given aslak.hellesoy@gmail.com proposed Cucumber
And the Cucumber proposal is approved
When I send mass proposal email
Then aslak.hellesoy@gmail.com should get email
"""
Hi aslak.hellesoy@gmail.com
Congratulations, Cucumber was accepted.
See you at RailsConf!
"""
Scenarios? Steps?
Steps & Step Definitions
Given aslak.hellesoy@gmail.com proposed Cucumber
Given /^aslak.hellesoy@gmail.com proposed Cucumber$/ do
end
Step == Method invocation
Step Definition == Method defnition
Regexp group arguments
Given aslak.hellesoy@gmail.com proposed Cucumber
Given /^(.+) proposed (.+)$/ do |email, proposal_name|
end
Given aslak.hellesoy@gmail.com proposed Cucumber
$CUCUMBER_COLORS
Quoted arguments
Given I have "22" cukes in my belly
Given /^I have "([^"]*)" cukes in my belly$/ do |n|
end
Given I have "2" cukes in my belly
Multiline args (String)
Then aslak.hellesoy@gmail.com should get email
"""
Hi aslak.hellesoy@gmail.com
Congratulations, Cucumber was accepted.
See you at RailsConf!
"""
Then /^(.+) should get email$/ do |email, body|
end
Multiline args (Tables)
Given the following proposals
| email | title |
| aslak.hellesoy@gmail.com | Cucumber |
| bryan@brynary.com | Webrat |
Given /the following proposals$/ do |proposals|
Proposal.create!(proposals.hashes)
end
Scenario Outline: Email accepted proposals
Given the following proposals
| email | title |
| aslak.hellesoy@gmail.com | Cucumber |
| bryan@brynary.com | Webrat |
And the <proposal> proposal is approved
When I send proposal emails
Then <email> should <what>
Examples:
| proposal | email | what |
| Cucumber | aslak.hellesoy@gmail.com | get email |
| Cucumber | bryan@brynary.com | not get email |
| Webrat | bryan@brynary.com | get email |
Scenario Outline
OH HAI: STUFFING
MISHUN: CUCUMBR
I CAN HAZ IN TEH BEGINNIN 3 CUCUMBRZ
WEN I EAT 2 CUCUMBRZ
DEN I HAZ 2 CUCUMBERZ IN MAH BELLY
AN IN TEH END 1 CUCUMBRZ KTHXBAI
$ cucumber -l en-lol stuffing.feature
AIL WITH STYLF E
Then /^I should have "(d+)" cukes my belly$/ do |cukes|
@belly.cukes.length.should == cukes.to_i
end
RSpec
Then /^I should have "(d+)" cukes my belly$/ do |cukes|
@belly.should have(cukes.to_i).cukes
end
Kosher RSpec
Then /^I should have "(d+)" cukes my belly$/ do |cukes|
assert_equal(@cukes.to_i, @belly.cukes.length)
end
Test::Unit
Line numbers
Then bla bla # features/step_definitions/bla_steps.rb:16
Stack traces
When I send mass proposal email
Could not find link "Send proposal emails"
features/step_definitions/proposal_steps.rb:16
features/notification.feature:9
$ cucumber features/notifications.rb:9
Hooks
Before do
end
After do |scenario|
end
World do
end
World(MyModule)
World(HerModule)
support/hooks.rb or support/env.rb
Feature: Notification emails
Background:
Given the following proposals
| email | title |
| aslak.hellesoy@gmail.com | Cucumber |
| bryan@brynary.com | Webrat |
Scenario: Approved
Background: Rejected
Background
Tagged Hooks
Before('@im_special', '@me_too') do
@icecream = true
end
@me_too
Feature: Lorem
Scenario: Ipsum
Scenario: Dolor
Feature: Sit
@im_special
Scenario: Amet
Scenario: Consec
Feature: Take over the world
I want it all
@spanish @french @english
Scenario: Take over Europe
@spanish @english
Scenario: Take over America
@english
Scenario: Take over Australia
cucumber -t spanish doit.featurecucumber -t ~french doit.feature
Tagged Execution
What s
inside?
a.feature
b.feature
x_steps.rb
y_steps.rb
Your
CodeRSpec/Test::Unit/Shoulda
Not doing Rails?
Quality Code With Cucumber Presentation

More Related Content

PPTX
Java spring mysql without hibernate(2) (1)
PDF
Writing Alexa Voice Skills With NodeJS (with a little IoT)
PDF
Github Usage Scenarios
PDF
Hooked on WordPress: WordCamp Columbus
ODP
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
PPT
Introduccion app engine con python
PDF
Serverless in production, an experience report (London DevOps)
Java spring mysql without hibernate(2) (1)
Writing Alexa Voice Skills With NodeJS (with a little IoT)
Github Usage Scenarios
Hooked on WordPress: WordCamp Columbus
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Introduccion app engine con python
Serverless in production, an experience report (London DevOps)

What's hot (6)

PPTX
Araport Workshop Tutorial 2: Authentication and the Agave Profiles Service
PDF
Powershell to the People #suguk
PDF
Advanced WordPress Tooling
KEY
Copycopter Presentation by Joe Ferris at BostonRB
PDF
Start developing Facebook apps in 13 steps
PDF
Spring Boot Omakase: A Fast-Paced “Chef’s Choice” Dive into Fun and Useful To...
Araport Workshop Tutorial 2: Authentication and the Agave Profiles Service
Powershell to the People #suguk
Advanced WordPress Tooling
Copycopter Presentation by Joe Ferris at BostonRB
Start developing Facebook apps in 13 steps
Spring Boot Omakase: A Fast-Paced “Chef’s Choice” Dive into Fun and Useful To...
Ad

Viewers also liked (10)

PDF
Don T Mock Yourself Out Presentation
PPTX
Online Omdømme Del1 Anfo April 2009
PDF
Integrating Flex And Rails With Ruby Amf
PDF
Rails Is From Mars Ruby Is From Venus Presentation 1
PDF
Crate Packaging Standalone Ruby Applications
PDF
Pastorets 2.0
PDF
Monitoring web application behaviour with cucumber-nagios
PDF
Behaviour driven infrastructure
PDF
Story Driven Development With Cucumber
PDF
Acceptance testing with Geb
Don T Mock Yourself Out Presentation
Online Omdømme Del1 Anfo April 2009
Integrating Flex And Rails With Ruby Amf
Rails Is From Mars Ruby Is From Venus Presentation 1
Crate Packaging Standalone Ruby Applications
Pastorets 2.0
Monitoring web application behaviour with cucumber-nagios
Behaviour driven infrastructure
Story Driven Development With Cucumber
Acceptance testing with Geb
Ad

Similar to Quality Code With Cucumber Presentation (16)

PDF
CukeUp! 2012: Michael Nacos on Just enough infrastructure for product develop...
PDF
Rails 3 Beginner to Builder 2011 Week 6
KEY
Sending Email with Rails
PPTX
Action Mailer
 
PDF
Ruby ecosystem applied to agile project
KEY
Rails3 Summer of Code 2010 - Week 6
PDF
Dmitry sharkov - Maturing Your Cucumber Suites
KEY
Story-driven Testing
KEY
Executable Requirements with Behaviour-Driven Development and Cucumber - Euro...
PDF
Cucumber
KEY
More to RoC weibo
PDF
Behavior Driven Development with Cucumber
PDF
Best Practice in Development
PPTX
Ruby on Rails: Coding Guideline
KEY
Cucaruba!
ODP
Cucumber: How I Slice It
CukeUp! 2012: Michael Nacos on Just enough infrastructure for product develop...
Rails 3 Beginner to Builder 2011 Week 6
Sending Email with Rails
Action Mailer
 
Ruby ecosystem applied to agile project
Rails3 Summer of Code 2010 - Week 6
Dmitry sharkov - Maturing Your Cucumber Suites
Story-driven Testing
Executable Requirements with Behaviour-Driven Development and Cucumber - Euro...
Cucumber
More to RoC weibo
Behavior Driven Development with Cucumber
Best Practice in Development
Ruby on Rails: Coding Guideline
Cucaruba!
Cucumber: How I Slice It

More from railsconf (11)

PDF
Smacking Git Around Advanced Git Tricks
PDF
Running The Show Configuration Management With Chef Presentation
PDF
Sd208 Ds%2 C0
PDF
Rails 3 And The Real Secret To High Productivity Presentation
PDF
J Ruby On Rails Presentation
PDF
Gov 2 0 Transparency Collaboration And Participation In Practice Presentation
PDF
Develop With Pleasure Deploy With Fun Glass Fish And Net Beans For A Better...
PDF
Building A Mini Google High Performance Computing In Ruby
PDF
A Z Introduction To Ruby On Rails
PDF
The Even Darker Art Of Rails Engines Presentation
PDF
Below And Beneath Tdd Test Last Development And Other Real World Test Patter...
Smacking Git Around Advanced Git Tricks
Running The Show Configuration Management With Chef Presentation
Sd208 Ds%2 C0
Rails 3 And The Real Secret To High Productivity Presentation
J Ruby On Rails Presentation
Gov 2 0 Transparency Collaboration And Participation In Practice Presentation
Develop With Pleasure Deploy With Fun Glass Fish And Net Beans For A Better...
Building A Mini Google High Performance Computing In Ruby
A Z Introduction To Ruby On Rails
The Even Darker Art Of Rails Engines Presentation
Below And Beneath Tdd Test Last Development And Other Real World Test Patter...

Recently uploaded (20)

PDF
MIND Revenue Release Quarter 2 2025 Press Release
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PPT
Teaching material agriculture food technology
PDF
cuic standard and advanced reporting.pdf
PPTX
Big Data Technologies - Introduction.pptx
PPTX
Spectroscopy.pptx food analysis technology
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Empathic Computing: Creating Shared Understanding
PDF
Electronic commerce courselecture one. Pdf
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
KodekX | Application Modernization Development
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Encapsulation theory and applications.pdf
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
MIND Revenue Release Quarter 2 2025 Press Release
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Teaching material agriculture food technology
cuic standard and advanced reporting.pdf
Big Data Technologies - Introduction.pptx
Spectroscopy.pptx food analysis technology
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Encapsulation_ Review paper, used for researhc scholars
Empathic Computing: Creating Shared Understanding
Electronic commerce courselecture one. Pdf
The AUB Centre for AI in Media Proposal.docx
NewMind AI Weekly Chronicles - August'25 Week I
KodekX | Application Modernization Development
MYSQL Presentation for SQL database connectivity
Encapsulation theory and applications.pdf
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Understanding_Digital_Forensics_Presentation.pptx
Mobile App Security Testing_ A Comprehensive Guide.pdf

Quality Code With Cucumber Presentation

  • 1. Aslak Hellesøy - Chief Scientist http://cukes.info/ twitter.com/aslak_hellesoy aslak.hellesoy@gmail.com
  • 5. 85 committers 989 github followers 33000 gem downloads 30 related tools http://www.flickr.com/photos/twose/887903401/
  • 6. http://www.flickr.com/photos/purrr/126597849/ It s testing crack. One serious stab at using it and I'm hooked.
  • 7. features step_definitions support env.rb webrat_steps.rb paths.rb Installing Cucumber $ gem install cucumber webrat rspec-rails rspec $ script/generate cucumber
  • 8. ENV["RAILS_ENV"] ||= "test" require File.expand_path(File.dirname(__FILE__) + '/../../config/environment') require 'cucumber/rails/world' require 'cucumber/formatter/unicode' Cucumber::Rails.use_transactional_fixtures Cucumber::Rails.bypass_rescue # Plus some more setup stuff..... env.rb
  • 9. webrat_steps.rb Given /^I am on (.+)$/ do |page_name| visit path_to(page_name) end When /^I press "([^"]*)"$/ do |button| click_button(button) end Then /^I should see "([^"]*)"$/ do |text| response.should contain(text) end
  • 10. module NavigationHelpers # When /^I go to (.+)$/ do |page_name| def path_to(page_name) case page_name when /the homepage/ '/' when /^(.*)'s profile page$/i user_profile_path(User.find_by_login($1)) else raise "Can't find mapping for "#{page_name}"" end end end World(NavigationHelpers) paths.rb
  • 13. Proposal notification In order to reduce time spent on emailing Administrators should be able to mail proposal status to all owners
  • 15. Feature: Proposal notification In order to reduce time spent on emailing Administrators should be able to mail all proposals owners depending on status Scenario: Email accepted proposal Given aslak.hellesoy@gmail.com proposed Cucumber And the Cucumber proposal is approved When I send proposal emails Then aslak.hellesoy@gmail.com should get email """ Hi aslak.hellesoy@gmail.com Congratulations, Cucumber was accepted. See you at RailsConf! """ Our First Feature features/proposal_notification.feature
  • 17. Feature: Proposal notification In order to reduce time spent on emailing Administrators should be able to mail all proposals owners depending on status Scenario: Email accepted proposal Given aslak.hellesoy@gmail.com proposed Cucumber And the Cucumber proposal is approved When I send proposal emails Then aslak.hellesoy@gmail.com should get email """ Hi aslak.hellesoy@gmail.com Congratulations, Cucumber was accepted. See you at RailsConf! """ 1 scenario (1 undefined) 4 steps (4 undefined)
  • 18. Feature: Proposal notification In order to reduce time spent on emailing Administrators should be able to mail all proposals owners depending on status Scenario: Email accepted proposal Given aslak.hellesoy@gmail.com proposed Cucumber And the Cucumber proposal is approved When I send proposal emails Then aslak.hellesoy@gmail.com should get email """ Hi aslak.hellesoy@gmail.com Congratulations, Cucumber was accepted. See you at RailsConf! """ 1 scenario (1 undefined) 4 steps (4 undefined)
  • 19. You can implement step definitions for undefined steps with these snippets: Given /^aslak.hellesoy@gmail.com proposed Cucumber$/ do pending end Given /^the Cucumber proposal is approved$/ do pending end When /^I send proposal emails$/ do pending end Then /^aslak.hellesoy@gmail.com should get email$/ do |string| pending end
  • 20. Given /^aslak.hellesoy@gmail.com proposed Cucumber$/ do pending end Given /^the Cucumber proposal is approved$/ do pending end When /^I send proposal emails$/ do pending end Then /^aslak.hellesoy@gmail.com should get email$/ do |string| pending end Step Definitions features/step_definitions/proposal_steps.rb
  • 22. Feature: Proposal notification In order to reduce time spent on emailing Administrators should be able to mail all proposals owners depending on status Scenario: Email accepted proposal Given aslak.hellesoy@gmail.com proposed Cucumber TODO (Cucumber::Pending) features/step_definitions/proposal_steps.rb:2 features/proposal_notification.feature:7 And the Cucumber proposal is approved When I send proposal emails Then aslak.hellesoy@gmail.com should get email """ Hi aslak.hellesoy@gmail.com Congratulations, Cucumber was accepted. See you at RailsConf! """
  • 23. Given /^aslak.hellesoy@gmail.com proposed Cucumber$/ do Proposal.create!({ :email => 'aslak.hellesoy@gmail.com', :title => 'Cucumber' }) end Do what Regexp says features/step_definitions/proposal_steps.rb
  • 24. Feature: Proposal notification In order to reduce time spent on emailing Administrators should be able to mail all proposals owners depending on status Scenario: Email accepted proposal Given aslak.hellesoy@gmail.com proposed Cucumber uninitialized constant Proposal (NameError) features/step_definitions/proposal_steps.rb:2 features/proposal_notification.feature:7 And the Cucumber proposal is approved When I send proposal emails Then aslak.hellesoy@gmail.com should get email """ Hi aslak.hellesoy@gmail.com Congratulations, Cucumber was accepted. See you at RailsConf! """
  • 25. $ script/generate rspec_scaffold proposal email:string title:string approved:boolean $ rake db:migrate db:test:clone $ cucumber features --no-source Make it Pass
  • 26. Feature: Proposal notification In order to reduce time spent on emailing Administrators should be able to mail all proposals owners depending on status Scenario: Email accepted proposal Given aslak.hellesoy@gmail.com proposed Cucumber And the Cucumber proposal is approved TODO (Cucumber::Pending) features/step_definitions/proposal_steps.rb:9 features/proposal_notification.feature:8 When I send proposal emails Then aslak.hellesoy@gmail.com should get email """ Hi aslak.hellesoy@gmail.com Congratulations, Cucumber was accepted. See you at RailsConf! """
  • 27. Given /^the Cucumber proposal is approved$/ do proposal = Proposal.find_by_title('Cucumber') proposal.approved = true proposal.save! end Implement Intention features/step_definitions/proposal_steps.rb
  • 28. Feature: Proposal notification In order to reduce time spent on emailing Administrators should be able to mail all proposals owners depending on status Scenario: Email accepted proposal Given aslak.hellesoy@gmail.com proposed Cucumber And the Cucumber proposal is approved When I send proposal emails TODO (Cucumber::Pending) features/step_definitions/proposal_steps.rb:15 features/proposal_notification.feature:9 Then aslak.hellesoy@gmail.com should get email """ Hi aslak.hellesoy@gmail.com Congratulations, Cucumber was accepted. See you at RailsConf! """
  • 29. When /^I send mass proposal email$/ do visit(’admin’) click_button("Send proposal emails") end Webrat
  • 30. Feature: Proposal notification In order to reduce time spent on emailing Administrators should be able to mail all proposals owners depending on status Scenario: Email accepted proposal Given aslak.hellesoy@gmail.com proposed Cucumber And the Cucumber proposal is approved When I send mass proposal email No route matches "/admin" with {:method=>:get} features/step_definitions/proposal_steps.rb:16 features/proposal_notification.feature:9 Then aslak.hellesoy@gmail.com should get email """ Hi aslak.hellesoy@gmail.com Congratulations, Cucumber was accepted. See you at RailsConf! """
  • 32. Add the Controller class AdminController < ApplicationController def index end end
  • 33. Feature: Proposal notification In order to reduce time spent on emailing Administrators should be able to mail all proposals owners depending on status Scenario: Email accepted proposal Given aslak.hellesoy@gmail.com proposed Cucumber And the Cucumber proposal is approved When I send mass proposal email Could not find link "Send proposal emails" features/step_definitions/proposal_steps.rb:16 features/proposal_notification.feature:9 Then aslak.hellesoy@gmail.com should get email """ Hi aslak.hellesoy@gmail.com Congratulations, Cucumber was accepted. See you at RailsConf! """
  • 34. Add the link <%= link_to("Send proposal emails", :action => 'mass_email') %>
  • 35. And #mass_email class AdminController < ApplicationController def index end def mass_email end end
  • 36. Feature: Proposal notification In order to reduce time spent on emailing Administrators should be able to mail all proposals owners depending on status Scenario: Email accepted proposal Given aslak.hellesoy@gmail.com proposed Cucumber And the Cucumber proposal is approved When I send mass proposal email Then aslak.hellesoy@gmail.com should get email """ Hi aslak.hellesoy@gmail.com Congratulations, Cucumber was accepted. See you at RailsConf! """
  • 37. Email-Spec Then /^... should get email$/ do |body| open_email('aslak.hellesoy@gmail.com') current_email.body.should == body end
  • 38. class AdminController < ApplicationController def index end def mass_email approved = Proposal.find_all_by_approved(true) approved.each do |proposal| AdminMailer.deliver_notification_email(proposal) end end end Controller
  • 39. class AdminMailer < ActionMailer::Base def notification_email(proposal) recipients proposal.email from "confreg@oreilly.com" subject "Your Railsconf proposal" body :proposal => proposal end end Mailer
  • 40. Hi <%= @proposal.email %> Congratulations, <%= @proposal.title %> was accepted. See you at RailsConf! Mailer template
  • 41. Feature: Proposal notification In order to reduce time spent on emailing Administrators should be able to mail all proposals owners depending on status Scenario: Email accepted proposal Given aslak.hellesoy@gmail.com proposed Cucumber And the Cucumber proposal is approved When I send mass proposal email Then aslak.hellesoy@gmail.com should get email """ Hi aslak.hellesoy@gmail.com Congratulations, Cucumber was accepted. See you at RailsConf! """
  • 43. Steps & Step Definitions Given aslak.hellesoy@gmail.com proposed Cucumber Given /^aslak.hellesoy@gmail.com proposed Cucumber$/ do end Step == Method invocation Step Definition == Method defnition
  • 44. Regexp group arguments Given aslak.hellesoy@gmail.com proposed Cucumber Given /^(.+) proposed (.+)$/ do |email, proposal_name| end Given aslak.hellesoy@gmail.com proposed Cucumber $CUCUMBER_COLORS
  • 45. Quoted arguments Given I have "22" cukes in my belly Given /^I have "([^"]*)" cukes in my belly$/ do |n| end Given I have "2" cukes in my belly
  • 46. Multiline args (String) Then aslak.hellesoy@gmail.com should get email """ Hi aslak.hellesoy@gmail.com Congratulations, Cucumber was accepted. See you at RailsConf! """ Then /^(.+) should get email$/ do |email, body| end
  • 47. Multiline args (Tables) Given the following proposals | email | title | | aslak.hellesoy@gmail.com | Cucumber | | bryan@brynary.com | Webrat | Given /the following proposals$/ do |proposals| Proposal.create!(proposals.hashes) end
  • 48. Scenario Outline: Email accepted proposals Given the following proposals | email | title | | aslak.hellesoy@gmail.com | Cucumber | | bryan@brynary.com | Webrat | And the <proposal> proposal is approved When I send proposal emails Then <email> should <what> Examples: | proposal | email | what | | Cucumber | aslak.hellesoy@gmail.com | get email | | Cucumber | bryan@brynary.com | not get email | | Webrat | bryan@brynary.com | get email | Scenario Outline
  • 49. OH HAI: STUFFING MISHUN: CUCUMBR I CAN HAZ IN TEH BEGINNIN 3 CUCUMBRZ WEN I EAT 2 CUCUMBRZ DEN I HAZ 2 CUCUMBERZ IN MAH BELLY AN IN TEH END 1 CUCUMBRZ KTHXBAI $ cucumber -l en-lol stuffing.feature
  • 51. Then /^I should have "(d+)" cukes my belly$/ do |cukes| @belly.cukes.length.should == cukes.to_i end RSpec Then /^I should have "(d+)" cukes my belly$/ do |cukes| @belly.should have(cukes.to_i).cukes end Kosher RSpec Then /^I should have "(d+)" cukes my belly$/ do |cukes| assert_equal(@cukes.to_i, @belly.cukes.length) end Test::Unit
  • 52. Line numbers Then bla bla # features/step_definitions/bla_steps.rb:16
  • 53. Stack traces When I send mass proposal email Could not find link "Send proposal emails" features/step_definitions/proposal_steps.rb:16 features/notification.feature:9 $ cucumber features/notifications.rb:9
  • 54. Hooks Before do end After do |scenario| end World do end World(MyModule) World(HerModule) support/hooks.rb or support/env.rb
  • 55. Feature: Notification emails Background: Given the following proposals | email | title | | aslak.hellesoy@gmail.com | Cucumber | | bryan@brynary.com | Webrat | Scenario: Approved Background: Rejected Background
  • 56. Tagged Hooks Before('@im_special', '@me_too') do @icecream = true end @me_too Feature: Lorem Scenario: Ipsum Scenario: Dolor Feature: Sit @im_special Scenario: Amet Scenario: Consec
  • 57. Feature: Take over the world I want it all @spanish @french @english Scenario: Take over Europe @spanish @english Scenario: Take over America @english Scenario: Take over Australia cucumber -t spanish doit.featurecucumber -t ~french doit.feature Tagged Execution