class Minitest::Junit::Reporter
Public Class Methods
new(io, options)
click to toggle source
# File lib/minitest/junit.rb, line 12 def initialize(io, options) @io = io @results = [] @options = options @options[:timestamp] = options.fetch(:timestamp, Time.now.iso8601) @options[:hostname] = options.fetch(:hostname, Socket.gethostname) end
Public Instance Methods
format(result, parent = nil)
click to toggle source
# File lib/minitest/junit.rb, line 57 def format(result, parent = nil) testcase = Ox::Element.new('testcase') testcase['classname'] = format_class(result) testcase['name'] = format_name(result) testcase['time'] = format_time(result.time) testcase['file'] = relative_to_cwd(result.source_location.first) testcase['line'] = result.source_location.last testcase['assertions'] = result.assertions if result.skipped? skipped = Ox::Element.new('skipped') skipped['message'] = result skipped << "" testcase << skipped else result.failures.each do |failure| failure_tag = Ox::Element.new(classify(failure)) failure_tag['message'] = result failure_tag << format_backtrace(failure) testcase << failure_tag end end # Minitest 5.19 supports metadata # Rails 7.1 adds `failure_screenshot_path` to metadata # Output according to Gitlab format # https://docs.gitlab.com/ee/ci/testing/unit_test_reports.html#view-junit-screenshots-on-gitlab if result.respond_to?("metadata") && result.metadata[:failure_screenshot_path] screenshot = Ox::Element.new("system-out") screenshot << "[[ATTACHMENT|#{result.metadata[:failure_screenshot_path]}]]" testcase << screenshot end testcase end
passed?()
click to toggle source
# File lib/minitest/junit.rb, line 20 def passed? true end
record(result)
click to toggle source
# File lib/minitest/junit.rb, line 26 def record(result) @results << result end
report()
click to toggle source
# File lib/minitest/junit.rb, line 30 def report doc = Ox::Document.new(version: '1.0', encoding: 'UTF-8') instruct = Ox::Instruct.new(:xml) instruct[:version] = '1.0' instruct[:encoding] = 'UTF-8' doc << instruct testsuite = Ox::Element.new('testsuite') testsuite['name'] = @options[:name] || 'minitest' testsuite['timestamp'] = @options[:timestamp] testsuite['hostname'] = @options[:hostname] testsuite['tests'] = @results.size testsuite['skipped'] = @results.count(&:skipped?) testsuite['failures'] = @results.count { |result| !result.error? && result.failure } testsuite['errors'] = @results.count(&:error?) testsuite['time'] = format_time(@results.map(&:time).inject(0, :+)) @results.each do |result| testsuite << format(result) end testsuites = Ox::Element.new('testsuites') testsuites << testsuite doc << testsuites @io << Ox.dump(doc) end
start()
click to toggle source
# File lib/minitest/junit.rb, line 24 def start; end
Private Instance Methods
classify(failure)
click to toggle source
# File lib/minitest/junit.rb, line 95 def classify(failure) if failure.instance_of? UnexpectedError 'error' else 'failure' end end
format_backtrace(failure)
click to toggle source
# File lib/minitest/junit.rb, line 111 def format_backtrace(failure) Minitest.filter_backtrace(failure.backtrace).map do |line| relative_to_cwd(line) end.join("\n") end
format_class(result)
click to toggle source
# File lib/minitest/junit.rb, line 117 def format_class(result) if @options[:junit_jenkins] result.klass.to_s.gsub(/(.*)::(.*)/, '\1.\2') else result.klass end end
format_name(result)
click to toggle source
# File lib/minitest/junit.rb, line 125 def format_name(result) result.name end
format_time(time)
click to toggle source
# File lib/minitest/junit.rb, line 129 def format_time(time) Kernel::format('%.6f', time) end
relative_to_cwd(path)
click to toggle source
# File lib/minitest/junit.rb, line 107 def relative_to_cwd(path) path.sub(working_directory, '.') end
working_directory()
click to toggle source
# File lib/minitest/junit.rb, line 103 def working_directory @working_directory ||= Dir.getwd end