Using parallel builds with RSpec in CircleCI? Yeah!
Perhaps you need a way to output what was actually run?
A ready-to-paste CLI invocation.
TL;DR: YAML example for RSpec in parallel on CircleCI with explicit --seed
and reproducible CLI invocation.
What’s in the steps?
CircleCI steps start out looking a bit like these:
- Run the tests
When CircleCI runs your tests in parallel, it offers a “split up the test suite” system based on earlier tests’ timings. The timings are gleaned from a JUnit XML format.
- Run the tests
- with a JUnit XML formatter
When the splitting the test suite selection now can be done by the CircleCI tool, pass the selections to RSpec.
- Run the tests
- with a JUnit XML-based formatter
- on a subset of the files
When RSpec starts, you have set it to run in random order,
to expose sequence-related bugs. Now, we are going to need to see this
value, so in order to do that, we pick a number ourselves. Then you set
the --seed
to a given value, e.g. an integer between one and a million.
- Run the tests
- with a JUnit XML-based formatter
- with a given ordering seed
- on a subset of the files
Now when a test has failed, you, the human reader, needs a pasteable command-line invocation, to reproduce the error in your local computer environment.
- Output a command of what will run
- Run the tests
- with a JUnit XML-based formatter
- with a given ordering seed
- on a subset of the files
Example YAML steps
This example is real-world: creates the necessary directories, stores artifacts.
- run: mkdir -p test-results/rspec
- run:
name: run rspec tests
command: |
TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \
circleci tests split --split-by=timings)"
SEED_NUMBER="$(shuf -i 1-1000000 -n 1)"
TEST_FILES_SPACE_SEPARATED="$(echo $TEST_FILES | paste -s -d ' ' -)"
echo "INCLUDE_SLOW_SPECS=1 bundle exec rspec --seed ${SEED_NUMBER} ${TEST_FILES_SPACE_SEPARATED}"
bundle exec rspec \
--seed $SEED_NUMBER \
--format progress \
--format RspecJunitFormatter \
--out test-results/rspec/results.xml \
--format progress \
$TEST_FILES
- store_test_results:
path: test-results
- store_artifacts:
path: test-results
destination: test-results
- store_artifacts:
path: coverage
destination: coverage