class Barthes::Reporter::JunitXml
Public Class Methods
new(opts={})
click to toggle source
# File lib/barthes/reporter/junit_xml.rb, line 7 def initialize(opts={}) @opts = opts @xml = Builder::XmlMarkup.new @xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8" end
Public Instance Methods
after_run(features)
click to toggle source
# File lib/barthes/reporter/junit_xml.rb, line 13 def after_run(features) result = @xml.testsuites do |xml| features.each do |feature| walk_json(feature) end end xml = Nokogiri::XML(result).to_xml(indent: 2) case @opts['output'] when nil, '$stdout' $stdout.puts xml when '$stderr' $stderr.puts xml else File.open(@opts['output'], 'w') do |f| f.puts xml end end end
walk_json(json, parents=[])
click to toggle source
# File lib/barthes/reporter/junit_xml.rb, line 32 def walk_json(json, parents=[]) case json.first when 'feature' if json.last.class == Array @xml.testsuite(name: json[1], tests: json.last.size) do parents.push json[1] json.last.each do |child| walk_json(child, parents) end parents.pop end end when 'scenario' if json.last.class == Array parents.push json[1] json.last.each do |child| walk_json(child, parents) end parents.pop end when 'action' # TODO: zero padding with calculation name = "##{sprintf('%03d', json.last['number'])} #{parents.join(' > ')} #{json[1]}" @xml.testcase(name: name) do case json.last['status'] when 'skipped' @xml.skipped when 'failure' failure = "failed expectations: \n" expectations = json.last['expectations'] || [] expectations.each do |expectation| if expectation['result'] == false failure += JSON.pretty_generate(expectation) + "\n" end end @xml.failure failure when 'error' error = "error:\n" error += "class: #{json.last['error']['class']}\n" error += "message: #{json.last['error']['message']}\n" error += "backtrace: #{json.last['error']['backtrace'].join("\n")}\n" @xml.error error end if json.last['status'] != 'skipped' && json.last['request'] && json.last['response'] stdout = "request:\n" stdout += "#{JSON.pretty_generate(json.last['request'])}\n" stdout += "response:\n" stdout += "#{JSON.pretty_generate(json.last['response'])}\n" @xml.tag!(:'system-out', stdout) end end else puts json end end