summaryrefslogtreecommitdiff
path: root/scripts/failed_tests.rb
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/failed_tests.rb')
-rwxr-xr-xscripts/failed_tests.rb89
1 files changed, 65 insertions, 24 deletions
diff --git a/scripts/failed_tests.rb b/scripts/failed_tests.rb
index 319961d277c..786d3c24c74 100755
--- a/scripts/failed_tests.rb
+++ b/scripts/failed_tests.rb
@@ -8,31 +8,47 @@ require 'json'
require 'set'
class FailedTests
+ DEFAULT_OPTIONS = {
+ previous_tests_report_path: 'test_results/previous/test_reports.json',
+ output_directory: 'tmp/previous_failed_tests/',
+ format: :oneline,
+ rspec_pg_regex: /rspec .+ pg12( .+)?/,
+ rspec_ee_pg_regex: /rspec-ee .+ pg12( .+)?/
+ }.freeze
+
def initialize(options)
@filename = options.delete(:previous_tests_report_path)
@output_directory = options.delete(:output_directory)
+ @format = options.delete(:format).to_sym
@rspec_pg_regex = options.delete(:rspec_pg_regex)
@rspec_ee_pg_regex = options.delete(:rspec_ee_pg_regex)
end
- def output_failed_test_files
+ def output_failed_tests
create_output_dir
- failed_files_for_suite_collection.each do |suite_collection_name, suite_collection_files|
- failed_test_files = suite_collection_files.map { |filepath| filepath.delete_prefix('./') }.join(' ')
+ failed_cases_for_suite_collection.each do |suite_name, suite_tests|
+ puts "[FailedTests] Detected #{suite_tests.size} failed tests in suite #{suite_name}..."
+ suite_tests =
+ case format
+ when :oneline
+ suite_tests.map { |test| test['file'] }.join(' ') # rubocop:disable Rails/Pluck
+ when :json
+ JSON.pretty_generate(suite_tests.to_a)
+ end
- output_file = File.join(output_directory, "#{suite_collection_name}_failed_files.txt")
+ output_file = File.join(output_directory, "#{suite_name}_failed_tests.#{output_file_format}")
File.open(output_file, 'w') do |file|
- file.write(failed_test_files)
+ file.write(suite_tests)
end
end
end
- def failed_files_for_suite_collection
- suite_map.each_with_object(Hash.new { |h, k| h[k] = Set.new }) do |(suite_collection_name, suite_collection_regex), hash|
+ def failed_cases_for_suite_collection
+ suite_map.each_with_object(Hash.new { |h, k| h[k] = Set.new }) do |(suite_name, suite_collection_regex), hash|
failed_suites.each do |suite|
- hash[suite_collection_name].merge(failed_files(suite)) if suite['name'] =~ suite_collection_regex
+ hash[suite_name].merge(failed_cases(suite)) if suite['name'] =~ suite_collection_regex
end
end
end
@@ -47,7 +63,7 @@ class FailedTests
private
- attr_reader :filename, :output_directory, :rspec_pg_regex, :rspec_ee_pg_regex
+ attr_reader :filename, :output_directory, :format, :rspec_pg_regex, :rspec_ee_pg_regex
def file_contents
@file_contents ||= begin
@@ -65,50 +81,75 @@ class FailedTests
end
end
+ def output_file_format
+ case format
+ when :oneline
+ 'txt'
+ when :json
+ 'json'
+ else
+ raise "[FailedTests] Unsupported format `#{format}` (allowed formats: `oneline` and `json`)!"
+ end
+ end
+
def failed_suites
return [] unless file_contents_as_json['suites']
file_contents_as_json['suites'].select { |suite| suite['failed_count'] > 0 }
end
- def failed_files(suite)
+ def failed_cases(suite)
return [] unless suite
- suite['test_cases'].each_with_object([]) do |failure_hash, failed_cases|
- failed_cases << failure_hash['file'] if failure_hash['status'] == 'failed'
+ suite['test_cases'].filter_map do |failure_hash|
+ next if failure_hash['status'] != 'failed'
+
+ failure_hash['job_url'] = suite['job_url']
+ failure_hash['file'] = failure_hash['file'].delete_prefix('./')
+
+ failure_hash
end
end
def create_output_dir
return if File.directory?(output_directory)
- puts 'Creating output directory...'
+ puts '[FailedTests] Creating output directory...'
FileUtils.mkdir_p(output_directory)
end
end
if $PROGRAM_NAME == __FILE__
- options = {
- previous_tests_report_path: 'test_results/previous/test_reports.json',
- output_directory: 'tmp/previous_failed_tests/',
- rspec_pg_regex: /rspec .+ pg12( .+)?/,
- rspec_ee_pg_regex: /rspec-ee .+ pg12( .+)?/
- }
+ options = FailedTests::DEFAULT_OPTIONS.dup
OptionParser.new do |opts|
- opts.on("-p", "--previous-tests-report-path PREVIOUS_TESTS_REPORT_PATH", String, "Path of the file listing previous test failures") do |value|
+ opts.on("-p", "--previous-tests-report-path PREVIOUS_TESTS_REPORT_PATH", String,
+ "Path of the file listing previous test failures (defaults to " \
+ "`#{FailedTests::DEFAULT_OPTIONS[:previous_tests_report_path]}`)") do |value|
options[:previous_tests_report_path] = value
end
- opts.on("-o", "--output-directory OUTPUT_DIRECTORY", String, "Output directory for failed test files") do |value|
+ opts.on("-o", "--output-directory OUTPUT_DIRECTORY", String,
+ "Output directory for failed test files (defaults to " \
+ "`#{FailedTests::DEFAULT_OPTIONS[:output_directory]}`)") do |value|
options[:output_directory] = value
end
- opts.on("--rspec-pg-regex RSPEC_PG_REGEX", Regexp, "Regex to use when finding matching RSpec jobs") do |value|
+ opts.on("-f", "--format [oneline|json]", String,
+ "Format of the output files: oneline (with test filenames) or JSON (defaults to " \
+ "`#{FailedTests::DEFAULT_OPTIONS[:format]}`)") do |value|
+ options[:format] = value
+ end
+
+ opts.on("--rspec-pg-regex RSPEC_PG_REGEX", Regexp,
+ "Regex to use when finding matching RSpec jobs (defaults to " \
+ "`#{FailedTests::DEFAULT_OPTIONS[:rspec_pg_regex]}`)") do |value|
options[:rspec_pg_regex] = value
end
- opts.on("--rspec-ee-pg-regex RSPEC_EE_PG_REGEX", Regexp, "Regex to use when finding matching RSpec EE jobs") do |value|
+ opts.on("--rspec-ee-pg-regex RSPEC_EE_PG_REGEX", Regexp,
+ "Regex to use when finding matching RSpec EE jobs (defaults to " \
+ "`#{FailedTests::DEFAULT_OPTIONS[:rspec_ee_pg_regex]}`)") do |value|
options[:rspec_ee_pg_regex] = value
end
@@ -118,5 +159,5 @@ if $PROGRAM_NAME == __FILE__
end
end.parse!
- FailedTests.new(options).output_failed_test_files
+ FailedTests.new(options).output_failed_tests
end