retry randomly failing rspec example
Clone or download
Latest commit e3191f7 Jun 12, 2018
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
gemfiles release 0.6.1 Jun 11, 2018
lib release 0.6.1 Jun 11, 2018
spec cleanup Jun 11, 2018
.gitignore Initial commit Jul 21, 2012
.travis.yml Update testing, add ruby 2.5 testing Mar 13, 2018
Appraisals Add support for rspec 3.7.0 Oct 17, 2017
Gemfile Initial commit Jul 21, 2012
Guardfile Initial commit Jul 21, 2012
LICENSE Initial commit Jul 21, 2012
README.md release 0.6.1 Jun 11, 2018
Rakefile add appraisal gem to run specs against rspec 3.2 and 3.3 Jul 9, 2015
changelog.md release 0.6.1 Jun 11, 2018
rspec-retry.gemspec Remove <3.8 constraint on rspec-core Mar 13, 2018

README.md

RSpec::Retry Build Status

RSpec::Retry adds a :retry option for intermittently failing rspec examples. If an example has the :retry option, rspec will retry the example the specified number of times until the example succeeds.

Compatibility

Rspec Version Rspec-Retry Version
> 3.8 0.6.1 but untested
> 3.3, <= 3.8 0.6.1            
3.2       0.4.6            
2.14.8       0.4.4            

Installation

Add this line to your application's Gemfile:

gem 'rspec-retry', group: :test # Unlike rspec, this doesn't need to be included in development group

And then execute:

$ bundle

Or install it yourself as:

$ gem install rspec-retry

require in spec_helper.rb

# spec/spec_helper.rb
require 'rspec/retry'

RSpec.configure do |config|
  # show retry status in spec process
  config.verbose_retry = true
  # show exception that triggers a retry if verbose_retry is set to true
  config.display_try_failure_messages = true

  # run retry only on features
  config.around :each, :js do |ex|
    ex.run_with_retry retry: 3
  end

  # callback to be run between retries  
  config.retry_callback = proc do |ex|
    # run some additional clean up task - can be filtered by example metadata
    if ex.metadata[:js]
      Capybara.reset!     
    end
  end
end

Usage

it 'should randomly succeed', :retry => 3 do
  expect(rand(2)).to eq(1)
end

it 'should succeed after a while', :retry => 3, :retry_wait => 10 do
  expect(command('service myservice status')).to eq('started')
end
# run spec (following log is shown if verbose_retry options is true)
# RSpec::Retry: 2nd try ./spec/lib/random_spec.rb:49
# RSpec::Retry: 3rd try ./spec/lib/random_spec.rb:49

Calling run_with_retry programmatically

You can call ex.run_with_retry(opts) on an individual example.

Configuration

  • :verbose_retry(default: false) Print retry status
  • :display_try_failure_messages (default: false) If verbose retry is enabled, print what reason forced the retry
  • :default_retry_count(default: 1) If retry count is not set in an example, this value is used by default. Note: If this is changed from the default of 0, all examples will be retried.
  • :default_sleep_interval(default: 0) Seconds to wait between retries
  • :clear_lets_on_failure(default: true) Clear memoized values for lets before retrying
  • :exceptions_to_hard_fail(default: []) List of exceptions that will trigger an immediate test failure without retry. Takes precedence over :exceptions_to_retry
  • :exceptions_to_retry(default: []) List of exceptions that will trigger a retry (when empty, all exceptions will)
  • :retry_callback(default: nil) Callback function to be called between retries

Environment Variables

  • RSPEC_RETRY_RETRY_COUNT can override the retry counts even if a retry count is set in an example or default_retry_count is set in a configuration.

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a pull request