Speedup Test::Unit + RSpec + Cucumber by running parallel on multiple CPUs.
sudo gem install parallel
script/plugin install git://github.com/grosser/parallel_tests.git
test:
database: xxx_test<%= ENV['TEST_ENV_NUMBER'] %>
script/db_console
create database xxx_test2;
...
rake parallel:prepare
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]
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
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.
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 to select separate db/memcache/etc.
[optional] Only run selected files & folders: parallel_test test/bar test/baz/xxx_text.rb
Options are: -n [PROCESSES] How many processes to use, default: available CPUs -p, --path [PATH] run tests inside this path only --no-sort do not sort files before running them -m, --multiply-processes [FLOAT] use given number as a multiplier of processes to run -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 '[OPTIONS]' 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 |
- [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 justspec
(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
thenbundle 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)
- Charles Finkel
- Indrek Juhkam
- Jason Morrison
- jinzhu
- Joakim Kolsjö
- Kevin Scaldeferri
- Kpumuk
- Maksim Horbul
- Pivotal Labs
- Rohan Deshpande
- Tchandy
- Terence Lee
- Will Bryant
Michael Grosser
[email protected]
Hereby placed under public domain, do what you want, just do not hold me accountable...