diff --git a/bin/turbo_rspec b/bin/turbo_rspec index 035fae706a..66464bc67b 100755 --- a/bin/turbo_rspec +++ b/bin/turbo_rspec @@ -1,12 +1,15 @@ #!/usr/bin/env ruby # frozen_string_literal: true +ENV['RAILS_ENV'] ||= 'test' + require './lib/turbo_tests' require 'optparse' requires = [] formatters = [] verbose = false +fail_fast = nil OptionParser.new do |opts| opts.on("-r", "--require PATH", "Require a file.") do |filename| @@ -33,6 +36,12 @@ OptionParser.new do |opts| opts.on("-v", "--verbose", "More output") do verbose = true end + + opts.on("--fail-fast=[N]") do |n| + n = Integer(n) rescue nil + fail_fast = (n.nil? || n < 1) ? 1 : n + end + end.parse!(ARGV) requires.each { |f| require(f) } @@ -54,7 +63,8 @@ success = TurboTests::Runner.run( formatters: formatters, files: ARGV.empty? ? ["spec"] : ARGV, - verbose: verbose + verbose: verbose, + fail_fast: fail_fast ) if success diff --git a/lib/turbo_tests/runner.rb b/lib/turbo_tests/runner.rb index a8c09196e5..0e015bf87d 100644 --- a/lib/turbo_tests/runner.rb +++ b/lib/turbo_tests/runner.rb @@ -7,6 +7,7 @@ module TurboTests formatters = opts[:formatters] start_time = opts.fetch(:start_time) { Time.now } verbose = opts.fetch(:verbose, false) + fail_fast = opts.fetch(:fail_fast, nil) if verbose STDERR.puts "VERBOSE" @@ -17,7 +18,8 @@ module TurboTests new( reporter: reporter, files: files, - verbose: verbose + verbose: verbose, + fail_fast: fail_fast ).run end @@ -25,6 +27,8 @@ module TurboTests @reporter = opts[:reporter] @files = opts[:files] @verbose = opts[:verbose] + @fail_fast = opts[:fail_fast] + @failure_count = 0 @messages = Queue.new @threads = [] @@ -215,6 +219,11 @@ module TurboTests when 'example_failed' example = FakeExample.from_obj(message[:example]) @reporter.example_failed(example) + @failure_count += 1 + if fail_fast_met + @threads.each(&:kill) + break + end when 'seed' when 'close' when 'exit' @@ -231,5 +240,9 @@ module TurboTests rescue Interrupt end end + + def fail_fast_met + !@fail_fast.nil? && @fail_fast >= @failure_count + end end end