{"id":13463360,"url":"https://github.com/grosser/parallel_tests","last_synced_at":"2025-05-12T05:18:36.484Z","repository":{"id":571389,"uuid":"203076","full_name":"grosser/parallel_tests","owner":"grosser","description":"Ruby: 2 CPUs = 2x Testing Speed for RSpec, Test::Unit and Cucumber","archived":false,"fork":false,"pushed_at":"2025-05-09T16:35:56.000Z","size":32150,"stargazers_count":3428,"open_issues_count":133,"forks_count":506,"subscribers_count":42,"default_branch":"master","last_synced_at":"2025-05-11T10:25:04.501Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"fatih/color","license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/grosser.png","metadata":{"files":{"readme":"Readme.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2009-05-17T10:54:32.000Z","updated_at":"2025-05-09T16:35:58.000Z","dependencies_parsed_at":"2023-07-05T15:02:04.188Z","dependency_job_id":"d1c043d3-0f9c-453c-938e-ae1438aa64ea","html_url":"https://github.com/grosser/parallel_tests","commit_stats":{"total_commits":1447,"total_committers":194,"mean_commits":7.458762886597938,"dds":"0.39184519695922604","last_synced_commit":"d582779a17ffa9a847f99daa7ca2e6d64a867396"},"previous_names":[],"tags_count":263,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grosser%2Fparallel_tests","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grosser%2Fparallel_tests/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grosser%2Fparallel_tests/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grosser%2Fparallel_tests/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/grosser","download_url":"https://codeload.github.com/grosser/parallel_tests/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253568691,"owners_count":21928909,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T13:00:51.965Z","updated_at":"2025-05-12T05:18:36.458Z","avatar_url":"https://github.com/grosser.png","language":"Ruby","readme":"# parallel_tests\n\n[![Gem Version](https://badge.fury.io/rb/parallel_tests.svg)](https://rubygems.org/gems/parallel_tests)\n[![Build status](https://github.com/grosser/parallel_tests/workflows/test/badge.svg)](https://github.com/grosser/parallel_tests/actions?query=workflow%3Atest\u0026branch=master)\n\nSpeedup Minitest + RSpec + Turnip + Cucumber + Spinach by running parallel on multiple CPU cores.\u003cbr/\u003e\nParallelTests splits tests into balanced groups (by number of lines or runtime) and runs each group in a process with its own database.\n\nSetup for Rails\n===============\n[RailsCasts episode #413 Fast Tests](http://railscasts.com/episodes/413-fast-tests)\n\n### Install\n`Gemfile`:\n\n```ruby\ngem 'parallel_tests', group: [:development, :test]\n```\n\n### Add to `config/database.yml`\n\nParallelTests uses 1 database per test-process.\n\u003ctable\u003e\n  \u003ctr\u003e\u003ctd\u003eProcess number\u003c/td\u003e\u003ctd\u003e1\u003c/td\u003e\u003ctd\u003e2\u003c/td\u003e\u003ctd\u003e3\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003eENV['TEST_ENV_NUMBER']\u003c/td\u003e\u003ctd\u003e''\u003c/td\u003e\u003ctd\u003e'2'\u003c/td\u003e\u003ctd\u003e'3'\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n```yaml\ntest:\n  database: yourproject_test\u003c%= ENV['TEST_ENV_NUMBER'] %\u003e\n```\n\n### Create additional database(s)\n    rake parallel:create\n\n### (Multi-DB) Create individual database\n    rake parallel:create:\u003cdatabase\u003e\n    rake parallel:create:secondary\n\n### Copy development schema (repeat after migrations)\n    rake parallel:prepare\n\n### Run migrations in additional database(s) (repeat after migrations)\n    rake parallel:migrate\n\n### (Multi-DB) Run migrations in individual database\n    rake parallel:migrate:\u003cdatabase\u003e\n\n### Setup environment from scratch (create db and loads schema, useful for CI)\n    rake parallel:setup\n\n### Drop all test databases\n    rake parallel:drop\n\n### (Multi-DB) Drop individual test database\n    rake parallel:drop:\u003cdatabase\u003e\n\n### Run!\n    rake parallel:test          # Minitest\n    rake parallel:spec          # RSpec\n    rake parallel:features      # Cucumber\n    rake parallel:features-spinach       # Spinach\n\n    rake \"parallel:test[1]\" --\u003e force 1 CPU --\u003e 86 seconds\n    rake parallel:test    --\u003e got 2 CPUs? --\u003e 47 seconds\n    rake parallel:test    --\u003e got 4 CPUs? --\u003e 26 seconds\n    ...\n\nTest by pattern with Regex (e.g. use one integration server per subfolder / see if you broke any 'user'-related tests)\n\n    rake \"parallel:test[^test/unit]\" # every test file in test/unit folder\n    rake \"parallel:test[user]\"  # run users_controller + user_helper + user tests\n    rake \"parallel:test['user|product']\"  # run user and product related tests\n    rake \"parallel:spec['spec\\/(?!features)']\" # run RSpec tests except the tests in spec/features\n\n\n### Example output\n\n    2 processes for 210 specs, ~ 105 specs per process\n    ... test output ...\n\n    843 examples, 0 failures, 1 pending\n\n    Took 29.925333 seconds\n\n### Run an arbitrary task in parallel\n```Bash\nRAILS_ENV=test parallel_test -e \"rake my:custom:task\"\n# or\nrake \"parallel:rake[my:custom:task]\"\n# limited parallelism\nrake \"parallel:rake[my:custom:task,2]\"\n```\n\n\nRunning setup or teardown once\n===================\n\n```Ruby\nrequire \"parallel_tests\"\n\n# preparation:\n# affected by race-condition: first process may boot slower than the second\n# either sleep a bit or use a lock for example File.lock\nParallelTests.first_process? ? do_something : sleep(1)\n\n# cleanup:\n# last_process? does NOT mean last finished process, just last started\nParallelTests.last_process? ? do_something : sleep(1)\n\nat_exit do\n  if ParallelTests.first_process?\n    ParallelTests.wait_for_other_processes_to_finish\n    undo_something\n  end\nend\n```\n\nEven test group runtimes\n========================\n\nTest groups will often run for different times, making the full test run as slow as the slowest group.\n\n**Step 1**: Use these loggers (see below) to record test runtime\n\n**Step 2**: The next test run will use the recorded test runtimes (use `--runtime-log \u003cfile\u003e` if you picked a location different from below)\n\n**Step 3**: Automate upload/download of test runtime from your CI system [example](https://github.com/grosser/parallel_rails_example/blob/master/.github/workflows/test.yml) (chunks need to be combined, an alternative is [amend](https://github.com/grosser/amend))\n\n### RSpec\n\nRspec: Add to your `.rspec_parallel` (or `.rspec`) :\n\n    --format progress\n    --format ParallelTests::RSpec::RuntimeLogger --out tmp/parallel_runtime_rspec.log\n\nTo use a custom logfile location (default: `tmp/parallel_runtime_rspec.log`), use the CLI: `parallel_test spec -t rspec --runtime-log my.log`\n\n### Minitest\n\nAdd to your `test_helper.rb`:\n```ruby\nrequire 'parallel_tests/test/runtime_logger' if ENV['RECORD_RUNTIME']\n```\n\nresults will be logged to `tmp/parallel_runtime_test.log` when `RECORD_RUNTIME` is set,\nso it is not always required or overwritten.\n\nLoggers\n=======\n\nRSpec: SummaryLogger\n--------------------\n\nLog the test output without the different processes overwriting each other.\n\nAdd the following to your `.rspec_parallel` (or `.rspec`) :\n\n    --format progress\n    --format ParallelTests::RSpec::SummaryLogger --out tmp/spec_summary.log\n\nRSpec: FailuresLogger\n-----------------------\n\nProduce pasteable command-line snippets for each failed example. For example:\n\n```bash\nrspec /path/to/my_spec.rb:123 # should do something\n```\n\nAdd to `.rspec_parallel` or use as CLI flag:\n\n    --format progress\n    --format ParallelTests::RSpec::FailuresLogger --out tmp/failing_specs.log\n\n(Not needed to retry failures, for that pass [--only-failures](https://relishapp.com/rspec/rspec-core/docs/command-line/only-failures) to rspec)\n\n\nRSpec: VerboseLogger\n-----------------------\n\nPrints a single line for starting and finishing each example, to see what is currently running in each process.\n\n```\n# PID, parallel process number, spec status, example description\n[14403] [2] [STARTED] Foo foo\n[14402] [1] [STARTED] Bar bar\n[14402] [1] [PASSED] Bar bar\n```\n\nAdd to `.rspec_parallel` or use as CLI flag:\n\n      --format ParallelTests::RSpec::VerboseLogger\n\n\nCucumber: FailuresLogger\n-----------------------\n\nLog failed cucumber scenarios to the specified file. The filename can be passed to cucumber, prefixed with '@' to rerun failures.\n\nUsage:\n\n    cucumber --format ParallelTests::Cucumber::FailuresLogger --out tmp/cucumber_failures.log\n\nOr add the formatter to the `parallel:` profile of your `cucumber.yml`:\n\n    parallel: --format progress --format ParallelTests::Cucumber::FailuresLogger --out tmp/cucumber_failures.log\n\nNote if your `cucumber.yml` default profile uses `\u003c%= std_opts %\u003e` you may need to insert this as follows `parallel: \u003c%= std_opts %\u003e --format progress...`\n\nTo rerun failures:\n\n    cucumber @tmp/cucumber_failures.log\n\nSetup for non-rails\n===================\n\n    gem install parallel_tests\n    # go to your project dir\n    parallel_test\n    parallel_rspec\n    parallel_cucumber\n    parallel_spinach\n\n - use `ENV['TEST_ENV_NUMBER']` inside your tests to select separate db/memcache/etc. (docker compose: expose it)\n\n - Only run a subset of files / folders:\n\n    `parallel_test test/bar test/baz/foo_text.rb`\n\n - Pass test-options and files via `--`:\n\n    `parallel_rspec -- -t acceptance -f progress -- spec/foo_spec.rb spec/acceptance`\n\n - Pass in test options, by using the -o flag (wrap everything in quotes):\n\n    `parallel_cucumber -n 2 -o '-p foo_profile --tags @only_this_tag or @only_that_tag --format summary'`\n\nOptions are:\n\u003c!-- copy output from bundle exec ./bin/parallel_test -h --\u003e\n    -n PROCESSES                     How many processes to use, default: available CPUs\n    -p, --pattern PATTERN            run tests matching this regex pattern\n        --exclude-pattern PATTERN    exclude tests matching this regex pattern\n        --group-by TYPE              group tests by:\n                                     found - order of finding files\n                                     steps - number of cucumber/spinach steps\n                                     scenarios - individual cucumber scenarios\n                                     filesize - by size of the file\n                                     runtime - info from runtime log\n                                     default - runtime when runtime log is filled otherwise filesize\n    -m, --multiply-processes COUNT   use given number as a multiplier of processes to run\n    -s, --single PATTERN             Run all matching files in the same process\n    -i, --isolate                    Do not run any other tests in the group used by --single(-s)\n        --isolate-n PROCESSES        Use 'isolate'  singles with number of processes, default: 1\n        --highest-exit-status        Exit with the highest exit status provided by test run(s)\n        --failure-exit-code INT      Specify the exit code to use when tests fail\n        --specify-groups SPECS       Use 'specify-groups' if you want to specify multiple specs running in multiple\n                                     processes in a specific formation. Commas indicate specs in the same process,\n                                     pipes indicate specs in a new process. Cannot use with --single, --isolate, or\n                                     --isolate-n.  Ex.\n                                     $ parallel_tests -n 3 . --specify-groups '1_spec.rb,2_spec.rb|3_spec.rb'\n                                       Process 1 will contain 1_spec.rb and 2_spec.rb\n                                       Process 2 will contain 3_spec.rb\n                                       Process 3 will contain all other specs\n        --only-group GROUP_INDEX[,GROUP_INDEX]\n                                     Only run the given group numbers.\n                                     Changes `--group-by` default to 'filesize'.\n    -e, --exec COMMAND               execute this code parallel and with ENV['TEST_ENV_NUMBER']\n    -o, --test-options 'OPTIONS'     execute test commands with those options\n    -t, --type TYPE                  test(default) / rspec / cucumber / spinach\n        --suffix PATTERN             override built in test file pattern (should match suffix):\n                                     '_spec.rb$' - matches rspec files\n                                     '_(test|spec).rb$' - matches test or spec files\n        --serialize-stdout           Serialize stdout output, nothing will be written until everything is done\n        --prefix-output-with-test-env-number\n                                     Prefixes test env number to the output when not using --serialize-stdout\n        --combine-stderr             Combine stderr into stdout, useful in conjunction with --serialize-stdout\n        --non-parallel               execute same commands but do not in parallel, needs --exec\n        --no-symlinks                Do not traverse symbolic links to find test files\n        --ignore-tags PATTERN        When counting steps ignore scenarios with tags that match this pattern\n        --nice                       execute test commands with low priority.\n        --runtime-log PATH           Location of previously recorded test runtimes\n        --allowed-missing COUNT      Allowed percentage of missing runtimes (default = 50)\n        --allow-duplicates           When detecting files to run, allow duplicates\n        --unknown-runtime SECONDS    Use given number as unknown runtime (otherwise use average time)\n        --first-is-1                 Use \"1\" as TEST_ENV_NUMBER to not reuse the default test environment\n        --fail-fast                  Stop all groups when one group fails (best used with --test-options '--fail-fast' if supported\n        --test-file-limit LIMIT      Limit to this number of files per test run by batching (for windows set to ~100 to stay below 8192 max command limit, might have bugs from reusing test-env-number and summarizing partial results)\n        --verbose                    Print debug output\n        --verbose-command            Combines options --verbose-process-command and --verbose-rerun-command\n        --verbose-process-command    Print the command that will be executed by each process before it begins\n        --verbose-rerun-command      After a process fails, print the command executed by that process\n        --quiet                      Print only tests output\n    -v, --version                    Show Version\n    -h, --help                       Show this.\n\nYou can run any kind of code in parallel with -e / --exec\n\n    parallel_test -n 5 -e 'ruby -e \"puts %[hello from process #{ENV[:TEST_ENV_NUMBER.to_s].inspect}]\"'\n    hello from process \"2\"\n    hello from process \"\"\n    hello from process \"3\"\n    hello from process \"5\"\n    hello from process \"4\"\n\n\u003ctable\u003e\n\u003ctr\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003e1 Process\u003c/td\u003e\u003ctd\u003e2 Processes\u003c/td\u003e\u003ctd\u003e4 Processes\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eRSpec spec-suite\u003c/td\u003e\u003ctd\u003e18s\u003c/td\u003e\u003ctd\u003e14s\u003c/td\u003e\u003ctd\u003e10s\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eRails-ActionPack\u003c/td\u003e\u003ctd\u003e88s\u003c/td\u003e\u003ctd\u003e53s\u003c/td\u003e\u003ctd\u003e44s\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\nTIPS\n====\n\n### RSpec\n\n - Add a `.rspec_parallel` to use different options, e.g. **no --drb**\n - Remove `--loadby` from `.rspec`\n - Instantly see failures (instead of just a red F) with [rspec-instafail](https://github.com/grosser/rspec-instafail)\n - Use [rspec-retry](https://github.com/NoRedInk/rspec-retry) (not rspec-rerun) to rerun failed tests.\n - [JUnit formatter configuration](https://github.com/grosser/parallel_tests/wiki#with-rspec_junit_formatter----by-jgarber)\n - Use [parallel_split_test](https://github.com/grosser/parallel_split_test) to run multiple scenarios in a single spec file, concurrently. (`parallel_tests` [works at the file-level and intends to stay that way](https://github.com/grosser/parallel_tests/issues/747#issuecomment-580216980))\n\n### Cucumber\n\n - Add a `parallel: foo` profile to your `config/cucumber.yml` and it will be used to run parallel tests\n - [ReportBuilder](https://github.com/rajatthareja/ReportBuilder) can help with combining parallel test results\n   - Supports Cucumber 2.0+ and is actively maintained\n   - Combines many JSON files into a single file\n   - Builds a HTML report from JSON with support for debug msgs \u0026 embedded Base64 images.\n\n### General\n - [ZSH] use quotes to use rake arguments `rake \"parallel:prepare[3]\"`\n - [Memcached] use different namespaces\u003cbr/\u003e\n   e.g. `config.cache_store = ..., namespace: \"test_#{ENV['TEST_ENV_NUMBER']}\"`\n - Debug errors that only happen with multiple files using `--verbose` and [cleanser](https://github.com/grosser/cleanser)\n - `export PARALLEL_TEST_PROCESSORS=13` to override default processor count\n - `export PARALLEL_TEST_MULTIPLY_PROCESSES=.5` to override default processor multiplier\n - Shell alias: `alias prspec='parallel_rspec -m 2 --'`\n - [Spring] Add the [spring-commands-parallel-tests](https://github.com/DocSpring/spring-commands-parallel-tests) gem to your `Gemfile` to get `parallel_tests` working with Spring.\n - `--first-is-1` will make the first environment be `1`, so you can test while running your full suite.\u003cbr/\u003e\n   `export PARALLEL_TEST_FIRST_IS_1=true` will provide the same result\n - [email_spec and/or action_mailer_cache_delivery](https://github.com/grosser/parallel_tests/wiki)\n - [zeus-parallel_tests](https://github.com/sevos/zeus-parallel_tests)\n - [Distributed Parallel Tests on CI systems)](https://github.com/grosser/parallel_tests/wiki/Distributed-Parallel-Tests-on-CI-systems) learn how `parallel_tests` can run on distributed servers such as Travis and GitLab-CI. Also shows you how to use parallel_tests without adding `TEST_ENV_NUMBER`-backends\n - [Capybara setup](https://github.com/grosser/parallel_tests/wiki)\n - [Sphinx setup](https://github.com/grosser/parallel_tests/wiki)\n - [Capistrano setup](https://github.com/grosser/parallel_tests/wiki/Remotely-with-capistrano) let your tests run on a big box instead of your laptop\n - Rails vs `ArgumentError: secret_key_base`: use `config.secret_key_base = Random.hex(64)`, see [rails issue](https://github.com/rails/rails/issues/53661)\n\nContribute your own gotchas to the [Wiki](https://github.com/grosser/parallel_tests/wiki) or even better open a PR :)\n\nAuthors\n====\ninspired by [pivotal labs](https://blog.pivotal.io/labs/labs/parallelize-your-rspec-suite)\n\n### [Contributors](https://github.com/grosser/parallel_tests/contributors)\n - [Charles Finkel](http://charlesfinkel.com/)\n - [Indrek Juhkam](http://urgas.eu)\n - [Jason Morrison](http://jayunit.net)\n - [jinzhu](http://github.com/jinzhu)\n - [Joakim Kolsjö](http://www.rubyblocks.se)\n - [Kevin Scaldeferri](http://kevin.scaldeferri.com/blog/)\n - [Kpumuk](http://kpumuk.info/)\n - [Maksim Horbul](http://github.com/mhorbul)\n - [Pivotal Labs](http://www.pivotallabs.com)\n - [Rohan Deshpande](http://github.com/rdeshpande)\n - [Tchandy](http://thiagopradi.net/)\n - [Terence Lee](http://hone.heroku.com/)\n - [Will Bryant](http://willbryant.net/)\n - [Fred Wu](http://fredwu.me)\n - [xxx](https://github.com/xxx)\n - [Levent Ali](http://purebreeze.com/)\n - [Michael Kintzer](https://github.com/rockrep)\n - [nathansobo](https://github.com/nathansobo)\n - [Joe Yates](http://titusd.co.uk)\n - [asmega](http://www.ph-lee.com)\n - [Doug Barth](https://github.com/dougbarth)\n - [Geoffrey Hichborn](https://github.com/phene)\n - [Trae Robrock](https://github.com/trobrock)\n - [Lawrence Wang](https://github.com/levity)\n - [Sean Walbran](https://github.com/seanwalbran)\n - [Lawrence Wang](https://github.com/levity)\n - [Potapov Sergey](https://github.com/greyblake)\n - [Łukasz Tackowiak](https://github.com/lukasztackowiak)\n - [Pedro Carriço](https://github.com/pedrocarrico)\n - [Pablo Manrubia Díez](https://github.com/pmanrubia)\n - [Slawomir Smiechura](https://github.com/ssmiech)\n - [Georg Friedrich](https://github.com/georg)\n - [R. Tyler Croy](https://github.com/rtyler)\n - [Ulrich Berkmüller](https://github.com/ulrich-berkmueller)\n - [Grzegorz Derebecki](https://github.com/madmax)\n - [Florian Motlik](https://github.com/flomotlik)\n - [Artem Kuzko](https://github.com/akuzko)\n - [Zeke Fast](https://github.com/zekefast)\n - [Joseph Shraibman](https://github.com/jshraibman-mdsol)\n - [David Davis](https://github.com/daviddavis)\n - [Ari Pollak](https://github.com/aripollak)\n - [Aaron Jensen](https://github.com/aaronjensen)\n - [Artur Roszczyk](https://github.com/sevos)\n - [Caleb Tomlinson](https://github.com/calebTomlinson)\n - [Jawwad Ahmad](https://github.com/jawwad)\n - [Iain Beeston](https://github.com/iainbeeston)\n - [Alejandro Pulver](https://github.com/alepulver)\n - [Felix Clack](https://github.com/felixclack)\n - [Izaak Alpert](https://github.com/karlhungus)\n - [Micah Geisel](https://github.com/botandrose)\n - [Exoth](https://github.com/Exoth)\n - [sidfarkus](https://github.com/sidfarkus)\n - [Colin Harris](https://github.com/aberant)\n - [Wataru MIYAGUNI](https://github.com/gongo)\n - [Brandon Turner](https://github.com/blt04)\n - [Matt Hodgson](https://github.com/mhodgson)\n - [bicarbon8](https://github.com/bicarbon8)\n - [seichner](https://github.com/seichner)\n - [Matt Southerden](https://github.com/mattsoutherden)\n - [Stanislaw Wozniak](https://github.com/sponte)\n - [Dmitry Polushkin](https://github.com/dmitry)\n - [Samer Masry](https://github.com/smasry)\n - [Volodymyr Mykhailyk](https:/github.com/volodymyr-mykhailyk)\n - [Mike Mueller](https://github.com/mmueller)\n - [Aaron Jensen](https://github.com/aaronjensen)\n - [Ed Slocomb](https://github.com/edslocomb)\n - [Cezary Baginski](https://github.com/e2)\n - [Marius Ioana](https://github.com/mariusioana)\n - [Lukas Oberhuber](https://github.com/lukaso)\n - [Ryan Zhang](https://github.com/ryanus)\n - [Rhett Sutphin](https://github.com/rsutphin)\n - [Doc Ritezel](https://github.com/ohrite)\n - [Alexandre Wilhelm](https://github.com/dogild)\n - [Jerry](https://github.com/boblington)\n - [Aleksei Gusev](https://github.com/hron)\n - [Scott Olsen](https://github.com/scottolsen)\n - [Andrei Botalov](https://github.com/abotalov)\n - [Zachary Attas](https://github.com/snackattas)\n - [David Rodríguez](https://github.com/deivid-rodriguez)\n - [Justin Doody](https://github.com/justindoody)\n - [Sandeep Singh](https://github.com/sandeepnagra)\n - [Calaway](https://github.com/calaway)\n - [alboyadjian](https://github.com/alboyadjian)\n - [Nathan Broadbent](https://github.com/ndbroadbent)\n - [Vikram B Kumar](https://github.com/v-kumar)\n - [Joshua Pinter](https://github.com/joshuapinter)\n - [Zach Dennis](https://github.com/zdennis)\n - [Jon Dufresne](https://github.com/jdufresne)\n - [Eric Kessler](https://github.com/enkessler)\n - [Adis Osmonov](https://github.com/adis-io)\n - [Josh Westbrook](https://github.com/joshwestbrook)\n - [Jay Dorsey](https://github.com/jaydorsey)\n - [hatsu](https://github.com/hatsu38)\n - [Mark Huk](https://github.com/vimutter)\n\n[Michael Grosser](http://grosser.it)\u003cbr/\u003e\nmichael@grosser.it\u003cbr/\u003e\nLicense: MIT\n","funding_links":[],"categories":["Testing","Ruby","Parallel execution"],"sub_categories":["Distributed Testing"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrosser%2Fparallel_tests","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgrosser%2Fparallel_tests","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrosser%2Fparallel_tests/lists"}