Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Rails: 2 CPUs = 2x Testing Speed for RSpec, Test::Unit and Cucumber

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.


Speedup Test::Unit + RSpec + Cucumber by running parallel on multiple CPUs.

Setup for Rails

sudo gem install parallel
script/plugin install git://

1: Add to config/database.yml

  database: xxx_test<%= ENV['TEST_ENV_NUMBER'] %>

2: Create additional database(s)

create database xxx_test2;

3: Copy development schema (repeat after migrations)

rake parallel:prepare

4: Run!

rake parallel:test          # Test::Unit
rake parallel:spec          # RSpec
rake parallel:features      # Cucumber

rake parallel:test[1] --> force 1 CPU --> 86 seconds
rake parallel:test    --> got 2 CPUs? --> 47 seconds
rake parallel:test    --> got 4 CPUs? --> 26 seconds

Test just a subfolder (e.g. use one integration server per subfolder) rake parallel:test[models] rake parallel:test[something/else]

partial paths are OK too...
rake parallel:test[functional] == rake parallel:test[fun]

Example output

2 processes for 210 specs, ~ 105 specs per process
... test output ...

877 examples, 0 failures, 11 pending
843 examples, 0 failures, 1 pending

Took 29.925333 seconds

Even process runtimes (for specs only atm)

Add to your spec/parallel_specs.opts (or spec/spec.opts) : --format ParallelSpecs::SpecRuntimeLogger:tmp/parallel_profile.log It will log test runtime and partition the test-load accordingly.

Setup for non-rails

sudo gem install parallel_tests
# go to your project dir
parallel_test OR parallel_spec OR parallel_cucumber
# [Optional] use ENV['TEST_ENV_NUMBER'] inside your tests for separate db/resources/etc.

Options are: -n [PROCESSES] How many processes to use, default: available CPUs -p, --path [PATH] run tests inside this path only -r, --root [PATH] execute test commands from this path -e, --exec [COMMAND] execute this code parallel and with ENV['TEST_ENV_NUM'] -o, --test-options [SOMETHING] execute test commands with those options -t, --type [TYPE] which type of tests to run? test, spec or features -v, --version Show Version -h, --help Show this.

You can run any kind of code with -e / --execute parallel_test -n 5 -e 'ruby -e "puts %[hello from process #{ENV[:TEST_ENV_NUMBER.to_s].inspect}]"' hello from process "2" hello from process "" hello from process "3" hello from process "5" hello from process "4"

1 Process 2 Processes 4 Processes
RSpec spec-suite 18 14 10
Rails-ActionPack 88 53 44


  • [RSpec] add a spec/parallel_spec.opts to use different options, e.g. no --drb (default: spec/spec.opts)
  • [RSpec] if something looks fishy try to delete script/spec
  • [RSpec] if script/spec is missing parallel:spec uses just spec (which solves some issues with double-loaded environment.rb)
  • [RSpec] 'script/spec_server' or spork do not work in parallel
  • [RSpec] ./script/generate rspec if you are running rspec from gems (this plugin uses script/spec which may fail if rspec files are outdated)
  • [Bundler] if you have a .bundle/environment.rb then bundle exec xxx will be used to run tests
  • with zsh this would be rake "parallel:prepare[3]"


  • build parallel:bootstrap idea/basics
  • make jRuby compatible basics
  • make windows compatible (does anyone care ?)


inspired by pivotal labs

Contributors (alphabetical)

Michael Grosser
Hereby placed under public domain, do what you want, just do not hold me accountable...

Something went wrong with that request. Please try again.