Getting started with Story Driven Development for Rails with Cucumber
I've been hearing about Story Driven Development (SDD) for a while but I haven't tried it out because I was under the impression that there was a huge amount to learn and setup before I could get going. I'm not sure if that used to be true, but I started using Cucumber yesterday and it was really easy.
Install and configure
You'll need to install a bunch of RubyGems.
sudo gem install nokogiri term-ansicolor treetop diff-lcs hpricot cucumber
Install Cucumber into your Rails app.
ruby script/generate cucumber
Install WebRAT. Unfortuantely this doesn't seem to be available as a RubyGem. If you're using Git then install this as a submodule instead. We're not so I clone the repository then
svn add it.
git clone git://github.com/brynary/webrat.git vendor/plugin/webrat
Writing your first story
Stories have three components: a business value, the role of a person that uses the feature and some description of the feature.
In order to [do something with business value] As [role] Should [describe the feature]
An example might be the ability to order a pizza from the online ordering system of a pizza delivery company.
Feature: Order Pizza In order to get some hot, tasty pizza A hungry pizza lover Should be able to order pizza
Next we need to define some scenarios. Scenarios are things that can happen during the story. Most pizza places aren't open 24 hours a day so two simple scenarios are (1) the pizza shop is closed, and (2) the pizza shop is open.
Scenario: The pizza shop is closed Given the pizza shop is closed And I am on the home page And I click "Feed Me!" Then I should see "Sorry, the shop is closed" Scenario: The pizza shop is open Given the pizza shop is open And I am on the home page And I click "Feed Me!" Then I should see "Your pizza will be with you soon"
The above description should go in a file called something like
features/order_pizza.feature where it is lovely and version controlled and safe.
So, we now have a story that describes how a feature should behave. How does that get turned into acceptance tests? Well, you could pass these descriptions off to your testing team, or you could turn them into part of your test suite.
Automated tests: better than cake
You might notice that when installing Cucumber you got the directory
features/steps. That's where you tell your test suite how to understand your stories. There are already two files here:
common_webrat.rb which gives your test suite a few funky things like the ability to click links and
env.rb which does pretty much the same stuff as
spec/spec_helper.rb except for Cucumber. You can ignore
common_webrat.rb will provide a few examples of how to start writing story steps.
Create a new file,
order_pizza_steps.rb. This is where you define the steps involved in ordering pizza. It's pretty much just regular expressions which match each line of a scenario to some Ruby code.
Given /the pizza shop is open/ do PizzaShop.open = true end Given /the pizza shop is closed/ do PizzaShop.open = false end And /I am on the home page/ do visits "/" end
That's all we need to do. The common WebRAT steps provide the necessary mapping for clicking buttons and checking for feedback.
Running your stories
This is pretty simple: run
rake features. You should get some rather pretty coloured output, and if anything has gone wrong Cucumber is pretty good at suggesting ways to fix it.
Found this article useful?
If you enjoyed this article I'd appreciate recommendations at Working with Rails.
Disagree? Found a typo? Got a question? If you'd like to have a conversation about this post, email email@example.com. I don't bite.