Feature #1206 ยป ruby-changes.patch
lib/test/unit/autorunner.rb (working copy) | ||
---|---|---|
require 'test/unit/ui/tk/testrunner'
|
||
Test::Unit::UI::Tk::TestRunner
|
||
end,
|
||
:xml => proc do |r|
|
||
require 'test/unit/ui/xml/testrunner'
|
||
Test::Unit::UI::Xml::TestRunner
|
||
end,
|
||
|
||
}
|
||
OUTPUT_LEVELS = [
|
lib/test/unit/ui/xml/xml_report.dtd (revision 0) | ||
---|---|---|
<!ELEMENT unit_test (failures,errors)>
|
||
<!ATTLIST unit_test failures CDATA #REQUIRED
|
||
tests CDATA #REQUIRED
|
||
errors CDATA #REQUIRED
|
||
assertions CDATA #REQUIRED
|
||
elapsed_time CDATA #REQUIRED>
|
||
<!ELEMENT failures (failure*)>
|
||
<!ELEMENT failure (message,method,class,location)>
|
||
<!ELEMENT errors (error*)>
|
||
<!ELEMENT error (exception,method,class)>
|
||
<!ELEMENT exception (#PCDATA)>
|
||
<!ELEMENT message (#PCDATA)>
|
||
<!ELEMENT method (#PCDATA)>
|
||
<!ELEMENT class (#PCDATA)>
|
||
<!ELEMENT location (#PCDATA)>
|
||
lib/test/unit/ui/xml/testrunner.rb (revision 0) | ||
---|---|---|
#--
|
||
#
|
||
# Author:: Flavio Castelli.
|
||
# Copyright:: Copyright (c) 2009 Flavio Castelli. All rights reserved.
|
||
# License:: Ruby license.
|
||
require 'test/unit/ui/testrunnermediator'
|
||
require 'test/unit/ui/testrunnerutilities'
|
||
require 'test/unit/ui/console/testrunner'
|
||
require 'rexml/document'
|
||
include REXML
|
||
class Test::Unit::TestResult
|
||
attr_reader :failures, :errors
|
||
end
|
||
module Test
|
||
module Unit
|
||
module UI
|
||
module Xml
|
||
# Behaves like Test::Unit::UI::Console::TestRunner but can create an xml
|
||
# file containing the unit test results.
|
||
# The xml file name is defined using an environment variable called _XML_OUTPUT_FILE_
|
||
#
|
||
# The output xml can be validated using the following DTD:
|
||
# <!ELEMENT unit_test (failures,errors)>
|
||
#
|
||
# <!ATTLIST unit_test failures CDATA #REQUIRED
|
||
# tests CDATA #REQUIRED
|
||
# errors CDATA #REQUIRED
|
||
# assertions CDATA #REQUIRED
|
||
# elapsed_time CDATA #REQUIRED>
|
||
#
|
||
# <!ELEMENT failures (failure*)>
|
||
# <!ELEMENT failure (message,method,class,location)>
|
||
#
|
||
# <!ELEMENT errors (error*)>
|
||
# <!ELEMENT error (exception,method,class)>
|
||
#
|
||
# <!ELEMENT exception (#PCDATA)>
|
||
# <!ELEMENT message (#PCDATA)>
|
||
# <!ELEMENT method (#PCDATA)>
|
||
# <!ELEMENT class (#PCDATA)>
|
||
# <!ELEMENT location (#PCDATA)>
|
||
|
||
class TestRunner < Test::Unit::UI::Console::TestRunner
|
||
|
||
# Creates a new TestRunner for running the passed
|
||
# suite. If quiet_mode is true, the output while
|
||
# running is limited to progress dots, errors and
|
||
# failures, and the final result. io specifies
|
||
# where runner output should go to; defaults to
|
||
# STDOUT.
|
||
def initialize(suite, output_level=NORMAL, io=STDOUT)
|
||
super(suite, output_level, io)
|
||
end
|
||
|
||
def finished(elapsed_time)
|
||
super(elapsed_time)
|
||
|
||
xml_file_path = ENV["XML_OUTPUT_FILE"]
|
||
if xml_file_path.nil?
|
||
nl
|
||
output("Provide XML_OUTPUT_FILE environment variable in order to save unit test result to file")
|
||
nl
|
||
else
|
||
nl
|
||
File.open(xml_file_path,'w') {|file| file.write(generate_xml(elapsed_time)) }
|
||
output("Xml summary saved: #{xml_file_path}")
|
||
nl
|
||
end
|
||
end
|
||
private
|
||
|
||
# Generates the xml file containing the unit test stats
|
||
def generate_xml(elapsed_time)
|
||
xml = Document.new
|
||
unit_test = Element.new "unit_test"
|
||
unit_test.add_attributes( {"tests" => @result.run_count.to_s,
|
||
"assertions" => @result.assertion_count.to_s,
|
||
"failures" => @result.failures.size.to_s,
|
||
"errors" => @result.errors.size.to_s,
|
||
"elapsed_time" => elapsed_time.to_s})
|
||
xml.elements << unit_test
|
||
|
||
failures = Element.new("failures")
|
||
@result.failures.each do |failure|
|
||
failure_element = Element.new("failure")
|
||
|
||
message = failure_element.add_element("message")
|
||
message.text = failure.message
|
||
|
||
method_name = failure_element.add_element "method"
|
||
class_name = failure_element.add_element "class"
|
||
|
||
failure.test_name =~ /(\w+\_\w+)\((.+)\)/
|
||
method_name.text = $1
|
||
class_name.text = $2
|
||
|
||
location = failure_element.add_element("location")
|
||
location.text = failure.location
|
||
|
||
failures.elements << failure_element
|
||
end
|
||
unit_test.elements << failures
|
||
|
||
errors = Element.new("errors")
|
||
@result.errors.each do |error|
|
||
error_element = Element.new("error")
|
||
|
||
exception = error_element.add_element("exception")
|
||
exception.text = error.exception
|
||
|
||
method_name = error_element.add_element "method"
|
||
class_name = error_element.add_element "class"
|
||
|
||
error.test_name =~ /(\w+\_\w+)\((.+)\)/
|
||
method_name.text = $1
|
||
class_name.text = $2
|
||
|
||
errors.elements << error_element
|
||
end
|
||
unit_test.elements << errors
|
||
|
||
xml
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
if __FILE__ == $0
|
||
Test::Unit::UI::Xml::TestRunner.start_command_line_test
|
||
end
|