class Minitest::Ci

Attributes

clean[RW]

Clean the report_dir between test runs? (defaults to true)

report_dir[RW]

Change the report directory. (defaults to “test/reports”)

working_dir[RW]

Change the working directory. (defaults to `$PWD`)

io[RW]
options[RW]
results[RW]

Public Class Methods

new(io = $stdout, options = {}) click to toggle source
# File lib/minitest/ci_plugin.rb, line 70
def initialize io = $stdout, options = {}
  self.io      = io
  self.options = options
  self.results = Hash.new {|h,k| h[k] = []}
end
report!() click to toggle source

Activates minitest/ci plugin as a Minitest reporter

# File lib/minitest/ci_plugin.rb, line 39
def report!
  @report = true
end
report?() click to toggle source

Is minitest/ci activated as a Minitest reporter?

# File lib/minitest/ci_plugin.rb, line 45
def report?
  @report ||= false
end

Public Instance Methods

passed?() click to toggle source
# File lib/minitest/ci_plugin.rb, line 76
def passed?
  true # don't care?
end
record(result) click to toggle source
# File lib/minitest/ci_plugin.rb, line 85
def record result
  key = result.respond_to?(:klass) ? result.klass : result.class
  results[key] << result
end
report() click to toggle source

Generate test report

# File lib/minitest/ci_plugin.rb, line 92
def report
  io.puts
  io.puts '[Minitest::CI] Generating test report in JUnit XML format...'

  Dir.chdir report_dir do
    results.each do |name, result|
      File.open(report_name(name), "w") do |f|
        f.puts( generate_results(name, result) )
      end
    end
  end
end
start() click to toggle source
# File lib/minitest/ci_plugin.rb, line 80
def start # clean
  FileUtils.rm_rf   report_dir if clean?
  FileUtils.mkdir_p report_dir
end

Private Instance Methods

clean?() click to toggle source
# File lib/minitest/ci_plugin.rb, line 174
def clean?
  options.fetch(:ci_clean, self.class.clean)
end
escape(o) click to toggle source
# File lib/minitest/ci_plugin.rb, line 107
def escape o
  CGI.escapeHTML(o.to_s)
end
generate_results(name, results) click to toggle source
# File lib/minitest/ci_plugin.rb, line 111
def generate_results name, results
  total_time = assertions = errors = failures = skips = 0
  timestamp = Time.now.iso8601
  results.each do |result|
    total_time += result.time
    assertions += result.assertions

    case result.failure
    when Skip
      skips += 1
    when UnexpectedError
      errors += 1
    when Assertion
      failures += 1
    end
  end

  base = working_dir + '/'
  xml = []

  xml << '<?xml version="1.0" encoding="UTF-8"?>'
  xml << "<testsuite time='%6f' skipped='%d' failures='%d' errors='%d' name=%p assertions='%d' tests='%d' timestamp=%p>" %
    [total_time, skips, failures, errors, escape(name), assertions, results.count, timestamp]

  results.each do |result|
    location = if result.respond_to? :source_location then
                 result.source_location
               else
                 result.method(result.name).source_location
               end[0].gsub(base, '')
    xml << "  <testcase time='%6f' file=%p name=%p assertions='%s'>" %
      [result.time, escape(location), escape(result.name), result.assertions]
    if failure = result.failure
      label = failure.result_label.downcase

      if failure.is_a?(UnexpectedError)
        failure = failure.error
      end

      klass = failure.class
      msg   = failure.message
      bt    = Minitest::filter_backtrace failure.backtrace

      xml << "    <%s type='%s' message=%s>%s" %
        [label, escape(klass), escape(msg).inspect.gsub('\n', "&#13;&#10;"), escape(bt.join("\n"))]
      xml << "    </%s>" % label
    end
    xml << "  </testcase>"
  end

  xml << "</testsuite>"

  xml
end
report_dir() click to toggle source
# File lib/minitest/ci_plugin.rb, line 170
def report_dir
  options.fetch(:ci_dir, self.class.report_dir)
end
report_name(name) click to toggle source
# File lib/minitest/ci_plugin.rb, line 178
def report_name(name)
  report_name_opt = options.fetch(:report_name, :test_name)
  return report_name_opt.call(name) if report_name_opt.is_a? Proc
  return sha1_report_name(name) if report_name_opt.to_sym == :sha1
  test_name_report_name(name)
end
sha1_report_name(name) click to toggle source
# File lib/minitest/ci_plugin.rb, line 185
def sha1_report_name(name)
  "TEST-#{Digest::SHA1.hexdigest(name.to_s)}.xml"
end
test_name_report_name(name) click to toggle source
# File lib/minitest/ci_plugin.rb, line 189
def test_name_report_name(name)
  "TEST-#{CGI.escape(name.to_s.gsub(/\W+/, '_'))[0, 246]}.xml"
end
working_dir() click to toggle source
# File lib/minitest/ci_plugin.rb, line 166
def working_dir
  options.fetch(:working_dir, self.class.working_dir)
end