Implement fail-fast in runner

Report tracks number of omitted tests due to abort.
This commit is contained in:
Michael Miller 2019-03-22 00:05:53 -06:00
parent 9e63c20df2
commit a31d5c8b5b
4 changed files with 82 additions and 7 deletions

View file

@ -17,10 +17,15 @@ module Spectator
# Number of pending examples.
getter pending_count = 0
# Number of remaining tests.
# This will be greater than zero only in fail-fast mode.
getter remaining_count
# Creates the report.
# The *results* are from running the examples in the test suite.
# The *runtime* is the total time it took to execute the suite.
def initialize(@results : Array(Result), @runtime)
# The *remaining_count* is the number of tests skipped due to fail-fast.
def initialize(@results : Array(Result), @runtime, @remaining_count = 0)
@results.each do |result|
case result
when SuccessfulResult
@ -46,6 +51,12 @@ module Spectator
failed_count > 0
end
# Indicates whether there were skipped tests
# because of a failure causing the test to abort.
def remaining?
remaining_count > 0
end
# Returns a set of results for all failed examples.
def failures
@results.each.compact_map(&.as?(FailedResult))

View file

@ -16,20 +16,28 @@ module Spectator
@config.formatter.start_suite(@suite)
# Run all examples and capture the results.
results = [] of Result
results = Array(Result).new(@suite.size)
elapsed = Time.measure do
results = @suite.map do |example|
run_example(example).as(Result)
end
collect_results(results)
end
# Generate a report and pass it along to the formatter.
report = Report.new(results, elapsed)
remaining = @suite.size - results.size
report = Report.new(results, elapsed, remaining)
@config.formatter.end_suite(report)
!report.failed?
end
# Runs all examples and adds results to a list.
private def collect_results(results)
@suite.each do |example|
result = run_example(example).as(Result)
results << result
break if @config.fail_fast? && result.is_a?(FailedResult)
end
end
# Runs a single example and returns the result.
# The formatter is given the example and result information.
private def run_example(example)