Skip to content
This repository

HTTPS clone URL

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…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 bin
Octocat-spinner-32 lib
Octocat-spinner-32 spec
Octocat-spinner-32 .gitignore
Octocat-spinner-32 README.markdown
Octocat-spinner-32 Rakefile
Octocat-spinner-32 VERSION
Octocat-spinner-32 parallel_tests.gemspec
README.markdown

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

Setup for Rails

sudo gem install parallel
script/plugin install git://github.com/grosser/parallel_tests.git

1: Add to config/database.yml

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

2: Create additional database(s)

script/db_console
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 ...

Results:
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_spec.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 18s 14s 10s
Rails-ActionPack 88s 53s 44s

TIPS

  • [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]"

TODO

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

Authors

inspired by pivotal labs

Contributors (alphabetical)

Michael Grosser
grosser.michael@gmail.com
Hereby placed under public domain, do what you want, just do not hold me accountable...

Something went wrong with that request. Please try again.