Using the --only-failures
option
The --only-failures
option filters what examples are run so that only those that failed the last time they ran are executed. To use this option, you first have to configure config.example_status_persistence_file_path
, which RSpec will use to store the status of each example the last time it ran.
There’s also a --next-failure
option, which is shorthand for --only-failures --fail-fast --order defined
. It allows you to repeatedly focus on just one of the currently failing examples, then move on to the next failure, etc.
Either of these options can be combined with another a directory or file name; RSpec will run just the failures from the set of loaded examples.
Background
Given a file named “spec/spec_helper.rb” with:
RSpec.configure do |c|
c.example_status_persistence_file_path = "examples.txt"
end
And a file named “.rspec” with:
--require spec_helper
--order random
--format documentation
And a file named “spec/array_spec.rb” with:
RSpec.describe 'Array' do
it "checks for inclusion of 1" do
expect([1, 2]).to include(1)
end
it "checks for inclusion of 2" do
expect([1, 2]).to include(2)
end
it "checks for inclusion of 3" do
expect([1, 2]).to include(3) # failure
end
end
And a file named “spec/string_spec.rb” with:
RSpec.describe 'String' do
it "checks for inclusion of 'foo'" do
expect("food").to include('foo')
end
it "checks for inclusion of 'bar'" do
expect("food").to include('bar') # failure
end
it "checks for inclusion of 'baz'" do
expect("bazzy").to include('baz')
end
it "checks for inclusion of 'foobar'" do
expect("food").to include('foobar') # failure
end
end
And a file named “spec/passing_spec.rb” with:
puts "Loading passing_spec.rb"
RSpec.describe "A passing spec" do
it "passes" do
expect(1).to eq(1)
end
end
And I have run rspec
once, resulting in “8 examples, 3 failures”.
Running rspec --only-failures
loads only spec files with failures and runs only the failures
When I run rspec --only-failures
Then the output from “rspec –only-failures” should contain “3 examples, 3 failures”
And the output from “rspec –only-failures” should not contain “Loading passing_spec.rb”.
Combine --only-failures
with a file name
When I run rspec spec/array_spec.rb --only-failures
Then the output should contain “1 example, 1 failure”
When I run rspec spec/string_spec.rb --only-failures
Then the output should contain “2 examples, 2 failures”.
Use --next-failure
to repeatedly run a single failure
When I run rspec --next-failure
Then the output should contain “1 example, 1 failure”
And the output should contain “checks for inclusion of 3”
When I fix “spec/arrayspec.rb” by replacing “to include(3)” with “notto include(3)”
And I run rspec --next-failure
Then the output should contain “2 examples, 1 failure”
And the output should contain “checks for inclusion of 3”
And the output should contain “checks for inclusion of ‘bar’”
When I fix “spec/stringspec.rb” by replacing “to include(‘bar’)” with “notto include(‘bar’)”
And I run rspec --next-failure
Then the output should contain “2 examples, 1 failure”
And the output should contain “checks for inclusion of ‘bar’”
And the output should contain “checks for inclusion of ‘foobar’”
When I fix “spec/stringspec.rb” by replacing “to include(‘foobar’)” with “notto include(‘foobar’)”
And I run rspec --next-failure
Then the output should contain “1 example, 0 failures”
And the output should contain “checks for inclusion of ‘foobar’”
When I run rspec --next-failure
Then the output should contain “All examples were filtered out”.
Running rspec --only-failures
with spec files that pass doesn’t run anything
When I run rspec spec/passing_spec.rb --only-failures
Then it should pass with “0 examples, 0 failures”.
Clear error given when using --only-failures
without configuring example_status_persistence_file_path
Given I have not configured example_status_persistence_file_path
When I run rspec --only-failures
Then it should fail with “To use --only-failures
, you must first set config.example_status_persistence_file_path
.”.