Skip to content

Instantly share code, notes, and snippets.

@jmieleiii
Created June 30, 2014 16:01
Show Gist options
  • Save jmieleiii/31f21bc9afeec42928ba to your computer and use it in GitHub Desktop.
Save jmieleiii/31f21bc9afeec42928ba to your computer and use it in GitHub Desktop.
class CustomFormatter
RSpec::Core::Formatters.register self, :dump_failures, :retry_command
def initialize(output)
@output = output
end
# create files called rspec_#.failures with a list of failed examples
def dump_failures(notification)
return if notification.failure_notifications.empty?
f = File.new("rspec#{ENV['TEST_ENV_NUMBER']}.failures", "w+")
notification.failure_notifications.each do |example|
f.puts retry_command(example)
end
f.close
end
def retry_command(example)
example_name = example.description.gsub("\"", "\\\"")
"-e \"#{example_name}\""
end
end
def gather_failures
opts = ""
files = Dir.glob("*.failures")
files.each { |file| opts << File.read(file).gsub(/\n/, " ")}
all_failures = "./all.failures"
File.write(all_failures, opts.rstrip)
return File.read all_failures
end
def cleanup(files = "")
system("rm #{files}") unless Dir.glob("#{files}").empty?
end
def launch(params = {})
if params[:test_options].include? "-e"
count = params[:test_options].split(/failed/).count - 1
end
system("parallel_rspec -n #{params[:processes] || 5} \
--test-options '#{params[:test_options]}' critical_path_specs/"
)
end
def run(processes = 5)
launch(
processes: processes,
test_options: "--require ./failure_catcher.rb --format CustomFormatter"
)
end
def rerun(processes = 5)
launch_critical_paths(processes: processes, test_options: gather_failures)
end
desc "parallel test execution with failure retries"
task :run_tests, :number_of_processes do |t, args|
run args[:number_of_processes]
unless $?.success?
rerun args[:number_of_processes]
cleanup "*.failures"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment