For Test::Unit there is a module called skippy, that allows you to skip for instance slow tests.

I was looking for a way to achieve the same in Rspec. I am currently developing against Rails 3.0.0.rc, and using rspec 2.0.0.beta.19 and could not find anything. So i asked on the rspec mailing list and got a great answer!

It is actually present in rspec2, right out of the box, as a feature they needed for their own tests. Read the description by David himself here. He shows a lot of very good examples, even filtering tests based on ruby-version is now possible. Awesome.

In short, you would do something like :

describe "something", :slow => true do
  it "should be blabla"
end

describe "something else" do
  it "should be a slow test", :slow => true do
    ...
  end

  it "should be a fast test" do
    ..
  end
end

then you can write the following to skip the slow tests :

# in spec/spec_helper.rb
RSpec.configure do |c|
  c.filter_run_excluding :slow => true
end

and to run only the slow tests:

# in spec/spec_helper.rb
RSpec.configure do |c|
  c.filter_run :slow => true
end

and to filter on slow tests, and run all tests if no slow tests are available:

# in spec/spec_helper.rb
RSpec.configure do |c|
  c.filter_run :slow => true
  c.run_all_when_everything_filtered = true
end

Awesome! :)

For the moment there is no command-line support, but in the spec/spec_helper.rb you could also check for any environment variables to do the slow or fast test-set.

What i personally needed, was something that would either run all tests, or run all tests excluding a few (i have a test-suite for an sms-gateway and do not want to send sms-es all the time).

So i handled that like this:

# in spec/spec_helper.rb
RSpec.configure do |config|
  if ENV['SEND_REAL_SMS'] != "true"
    config.filter_run_excluding :send_sms => true
  end
end