Created
June 30, 2014 16:01
-
-
Save jmieleiii/31f21bc9afeec42928ba to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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