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