No commit activity in last 3 years
No release in over 3 years
Split a big test file into multiple chunks and run them in parallel
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

>= 0.5.13
>= 3.9.0
 Project Readme

Split a big test file into multiple chunks and run them in parallel

Install

gem install parallel_split_test

Usage

1: prepare your databases

To use 1 database per test-process, add this to your config/database.yml

test:
  database: yourproject_test<%= ENV['TEST_ENV_NUMBER'] %>
  • TEST_ENV_NUMBER is '' for the first process and 2 for the 2nd, it reuses your normal test database
  • Optionally install parallel_tests to get database helper tasks like rake parallel:prepare

2: find a slow/big test file

# spec/xxx_spec.rb
require "spec_helper"

describe "X" do
  it {sleep 5}
  it {sleep 5}
  it {sleep 5}
end

3: run

parallel_split_test spec/xxx_spec.rb [regular test options]

Output

parallel_split_test spec/xx_spec.rb

Running examples in 2 processes
.

Finished in 5 seconds
1 example, 0 failures
..

Finished in 1 seconds
2 examples, 0 failures

Summary:
1 example, 0 failures
2 examples, 0 failures
Took 10.06 seconds with 2 processes

TIPS

  • use -o/--out to get unified/clean output from all processes
  • set number of processes to use with PARALLEL_SPLIT_TEST_PROCESSES environment variable
  • unify JUnit output for rspec

before(:all) rspec hooks

The before(:all) hooks in rspec will be executed once for every process that runs a test in an example group. This means if you have more processes than tests in a group, the before(:all) block for that group will be fired N times. For example, this spec has 3 tests and a before(:all) block:

describe "before all behavior"
  before(:all) do
    puts "Process: #{Process.pid} Before ALL"
  end

  it "a" do
  end

  it "b" do
  end

  it "c" do
  end
end

When you run this with 3 or more processes you'll see the before(:all) call is invoked 3 times, once per each process (since "a", "b", and "c" tests are each run on a different process).

$ PARALLEL_SPLIT_TEST_PROCESSES=3 bundle exec parallel_split_test spec/ | grep "Before ALL"
Process: 31539 Before ALL
Process: 31538 Before ALL
Process: 31540 Before ALL

TODO

  • Cucumber support
  • Test::Unit / Minitest support

Authors

Michael Grosser
michael@grosser.it
License: MIT
Build Status