Mind the gap – European Software Tester magazine article
June 4th, 2009
I recently wrote an article for ‘The European Software Tester’ magazine which looked at ways Cucumber, Acceptance tests in general and practices around Behaviour Driven Development can help avoid the gap between what the customer wants and what they get. I’m happy to say the article has been published and is also available digitally:
Cucumber, Tags and Continuous Integration oh my!
April 12th, 2009
We want to be able to commit our code frequently to prevent merge headaches.
“the longer you wait, the more your code will diverge from your teammates. If you don’t commit often you rob them of the opportunity to reduce merge hell.” Aslak Hellesøy
When dealing with Cucumber and Features/Scenarios we may find we want to commit part way through a scenario but we won’t because:
- We don’t want to break the build
- We don’t want to pollute the build with lots of pending steps.
A common solution to this problem is to create two streams for running the features:
- In-progress
- If an in-progress scenario fails then the build carries on.
- If an in-progress scenario passes then the build fails (This is very similar to how Rspec works with pending)
- Finished
- If a completed scenario fails it causes the build to fail.
We can implement this model using Cucumber’s new Tag feature. We can tag Scenarios and Features with @in-progress and use this tag to help exclude in-progress Features/Scenarios from the finished build.
@in-progress
Feature:
In order to avoid merge headaches
As a developer
I want to tag my features and scenarios with a in-progress tag
@in-progress
Scenario: I'm not finished yet
Given ...
When ...
Then ...
The Rake tasks
Finished features/scenarios task
We prefix tags with ~ to exclude features or scenarios having that tag
desc "Run finished features"
Cucumber::Rake::Task.new(:finished) do |t|
t.cucumber_opts = "--format progress --tags ~in-progress"
end
In-progress features/scenarios task
desc "Run in-progress features"
Cucumber::Rake::Task.new(:in_progress) do |t|
t.cucumber_opts = "--require formatters/ --format Cucumber::Formatter::InProgress --tags in-progress"
end
We require a special formatter Cucumber::Formatter::InProgress which is essential for making the task work. This formatter as well as giving helpful output changes the command line exit codes of Cucumber. This is kind of crazy but only within the formatter do we have enough information to decided if we should fail or pass. The formatter only returns a failure exit code if there were any scenarios which passed. So unlike the default exit codes failing steps will not cause a failure exit code.
Full Source Code
Also available at: http://github.com/josephwilk/cucumber_cocktails/tree/master
Outside-in Development with Cucumber and Rspec
March 30th, 2009
I was speaking in Edinburgh at Scotland on Rails 2009 about Cucumber and Rspec.
You can watch the recorded full talk.
I’ve also posted the slides from the presentation and uploaded the screencasts used in the presentation in both high and low resolutions. They are accessible from links within the presentation.
Here are some of the useful links from the presentation:
- Cuke’s official website – http://cukes.info
- Cucumer’s github wiki – http://wiki.github.com/aslakhellesoy/cucumber
- Rspec’s website – http://rspec.info
- The Rspec book – Pragmatic book store – http://www.pragprog.com/titles/achbd/the-rspec-book
- In-memory browser testing – Webrat – http://wiki.github.com/brynary/webrat
- Browser based testing – Watir – http://wtr.rubyforge.org/
- Browser based testing – Selenium – http://seleniumhq.org/
- Headless Browser testing – Celerity – http://celerity.rubyforge.org/
- Using Celerity from within Ruby – Culerity – http://upstream-berlin.com/2009/01/28/culerity-full-stack-rails-testing-with-cucumber-and-celerity/
- Website for checking regular expressions – Rubular – http://www.rubular.com/
I would like to thank the organisers, everyone who came to listen and speak at the conference. It was a pleasure to be a part of such an enthusiastic group of people in such a beautiful venue.
Cucumber waves goodbye to GivenScenario
February 16th, 2009
Cucumber as of version 0.2 has removed the GivenScenario feature. GivenScenario was introduced in the original story runner to allow calling a scenario from another within the same feature.
Scenario: setup
Given ...
Scenario: example
GivenScenario setup
...
I initially thought this was a great feature (as mentioned in Rspec stories from the trenches). However when I was using GivenScenario I was thinking as a programmer, which is usually where you start going off the tracks when writing features.
Lets look at an example of GivenScenario
Read the rest of this entry »
Speaking at Scotland on Rails 2009
January 17th, 2009
I’m really excited to be giving a talk at this years Scotland on Rails conference in Edinburgh.
I’ll be talking about working outside-in with Cucumber and RSpec. Having used Cucumber and as a member of the Cucumber core developer team I hope to share lots of experiences and lessons about getting the most out of the tool.
It’s looking like a great line up with with some really interesting presentations across a broad number of topics. The keynotes speakers are Michael Feathers and Marcel Molina, Jnr.
If you’re going to be in Edinburgh for the conference or have any burning questions about Cucumber, let me know.
Latent Semantic Analysis in Ruby
November 21st, 2008
I’ve had lots of requests for a Ruby version to follow up my Latent Semantic Analysis in Python article. So I’ve rewritten the code and article for Ruby. I wrote LSA from scratch this time and test driven so it has some subtle differences from the Python version.
What is LSA?
Latent Semantic Analysis (LSA) is a mathematical method that tries to bring out latent relationships within a collection of documents. Rather than looking at each document isolated from the others it looks at all the documents as a whole and the terms within them to identify relationships.
An example of LSA:
Using a search engine search for “ruby“.
Documents are returned which do not contain the search term “ruby” but contains terms like “rails“.
LSA has identified a latent relationship, “ruby” is semantically close to “rails“.
How does it work?
Given a set of word documents, each word in those documents represents a point in the semantic space. LSA uses a mathematical technique called Singular value decomposition to take the documents/words represented as a matrix and produce a reduced approximation of this matrix. In doing this it reduces the overall noise in the semantic space bringing words together. Hence after applying LSA some words share similar points in the semantic space, they are semantically similar.
These groups of semantically similar words form concepts and those concepts in turn relate to documents.
Term a < -----------> Term b < -----------> Concept d < ---------> Document e Term c < ----------->
Rboss RubyGem for Yahoo! Search BOSS
August 23rd, 2008
With Search BOSS (Build your Own Search Service) Yahoo has freed up a lot of the restrictions on their previous search service. Like removing the cap on the number of searches and allowing re-purposing of results. I’ve been doing some work on using the service in Ruby. I wrote a little RubyGem called Rboss which wraps around the BOSS webservice. It makes life nice and easy using Ruby and BOSS.
require 'rubygems'
require 'boss'
api = Boss::Api.new('boss-api-key-got-from-yahoo')
#Find news articles that are not older than 7 days
results = api.search_news('monkeys', :age => '7d')
results.each do |news|
puts news.title
puts news.abstract
puts news.date
puts news.url
end
Install Gem from GitHub:
- Add github to gem sources
- Install the gem:
- If you don’t already have a BOSS api key signup for one: http://developer.yahoo.com/wsregap
gem sources -a http://gems.github.com
sudo gem install eshopworks-rboss
Checkout the Rboss documentation and example usage at: http://github.com/eshopworks/rboss-gem
Thanks to eShopworks for sponsoring this project.
Telling a good story – Rspec stories from the trenches
August 15th, 2008
I’ve been developing multiple systems using Rspec stories for a little while now. There are a lot of great resources to get you started with a taste of what you can do with stories. Some of the resources I found useful where:
- http://peepcode.com/products/rspec-user-stories
- http://blog.davidchelimsky.net/2008/6/16/slides-from-railsconf
- http://www.benmabey.com/2008/02/04/rspec-plain-text-stories-webrat-chunky-bacon/
- http://dannorth.net/whats-in-a-story
- http://evang.eli.st/blog/2007/10/8/story-runner-top-to-bottom-screencast
However once I had understood the basic idea I struggled to find practical examples and general guidance on writing real stories. So I’ve collected some of the lessons I’ve learnt along the way with story examples taken from real systems and how I’ve improved them as I learnt. Most examples are from web based applications.
Ruby/Rails interview questions
July 25th, 2008
I’ve recently been helping interview some ruby/rails developers. I searched the web for some inspiration but I could not find any example questions that had real depth to them. I like my questions to be a point of discussion rather than one word answers. Most importantly I want a wide enough scope to let those talented individuals shine through. So here are some of the questions I’ve been trying out recently.
Rspec-rails is a rails plugin which brings the Rspec Ruby Behaviour Driven Development framework to rails along with some rails specific helpers. One of these hugely useful helper functions is:
mock_model(model_class, options_and_stubs = {})
This creates a mock object with the common methods stubbed out. It also allows you to specify other methods you want to stub.
Read the rest of this entry »



