mirror of
https://gitea.invidious.io/iv-org/shard-spectator.git
synced 2024-08-15 00:53:35 +00:00
Initial code for JUnit output
This commit is contained in:
parent
4890cafefa
commit
3776cd917e
7 changed files with 203 additions and 0 deletions
26
src/spectator/formatting/error_junit_test_case.cr
Normal file
26
src/spectator/formatting/error_junit_test_case.cr
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
module Spectator::Formatting
|
||||||
|
private struct ErrorJUnitTestCase
|
||||||
|
def initialize(@result : ErroredResult)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_xml(xml : ::XML::Builder)
|
||||||
|
xml.element("testcase",
|
||||||
|
name: @result.example,
|
||||||
|
status: @result,
|
||||||
|
time: @result.elapsed.total_seconds,
|
||||||
|
classname: classname,
|
||||||
|
assertions: @result.expectations.size) do
|
||||||
|
xml.element("error", message: @result.error.message, type: @result.error.class)
|
||||||
|
@result.expectations.each_unsatisfied do |expectation|
|
||||||
|
xml.element("failure", message: expectation.actual_message) do
|
||||||
|
# TODO: Add values as text to this block.
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private def classname
|
||||||
|
"TODO"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
25
src/spectator/formatting/failure_junit_test_case.cr
Normal file
25
src/spectator/formatting/failure_junit_test_case.cr
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
module Spectator::Formatting
|
||||||
|
private struct FailureJUnitTestCase
|
||||||
|
def initialize(@result : FailedResult)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_xml(xml : ::XML::Builder)
|
||||||
|
xml.element("testcase",
|
||||||
|
name: @result.example,
|
||||||
|
status: @result,
|
||||||
|
time: @result.elapsed.total_seconds,
|
||||||
|
classname: classname,
|
||||||
|
assertions: @result.expectations.size) do
|
||||||
|
@result.expectations.each_unsatisfied do |expectation|
|
||||||
|
xml.element("failure", message: expectation.actual_message) do
|
||||||
|
# TODO: Add values as text to block.
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private def classname
|
||||||
|
"TODO"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
52
src/spectator/formatting/junit_formatter.cr
Normal file
52
src/spectator/formatting/junit_formatter.cr
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
require "xml"
|
||||||
|
|
||||||
|
module Spectator::Formatting
|
||||||
|
# Formatter for producing a JUnit XML report.
|
||||||
|
class JUnitFormatter < Formatter
|
||||||
|
# Name of the JUnit output file.
|
||||||
|
private JUNIT_XML_FILE = "output.xml"
|
||||||
|
|
||||||
|
# Name of the top-level test suites block.
|
||||||
|
private NAME = "AllTests"
|
||||||
|
|
||||||
|
# Creates the formatter.
|
||||||
|
# By default, output is sent to STDOUT.
|
||||||
|
def initialize(output_dir : String)
|
||||||
|
path = File.join(output_dir, JUNIT_XML_FILE)
|
||||||
|
@io = File.open(path, "w")
|
||||||
|
@xml = XML::Builder.new(@io)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Called when a test suite is starting to execute.
|
||||||
|
def start_suite(suite : TestSuite)
|
||||||
|
@xml.start_document(encoding: "UTF-8")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Called when a test suite finishes.
|
||||||
|
# The results from the entire suite are provided.
|
||||||
|
def end_suite(report : Report)
|
||||||
|
@xml.element("testsuites",
|
||||||
|
tests: report.example_count,
|
||||||
|
failures: report.failed_count,
|
||||||
|
errors: report.error_count,
|
||||||
|
time: report.runtime.total_seconds,
|
||||||
|
name: NAME) do
|
||||||
|
report.group_by(&.example.source.path).each do |path, results|
|
||||||
|
JUnitTestSuite.new(path, results).to_xml(@xml)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@xml.end_document
|
||||||
|
@xml.flush
|
||||||
|
@io.close
|
||||||
|
end
|
||||||
|
|
||||||
|
# Called before a test starts.
|
||||||
|
def start_example(example : Example)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Called when a test finishes.
|
||||||
|
# The result of the test is provided.
|
||||||
|
def end_example(result : Result)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
26
src/spectator/formatting/junit_test_case.cr
Normal file
26
src/spectator/formatting/junit_test_case.cr
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
module Spectator::Formatting
|
||||||
|
# Selector for creating a JUnit test case based on a result.
|
||||||
|
private module JUnitTestCase
|
||||||
|
extend self
|
||||||
|
|
||||||
|
# Creates a successful JUnit test case.
|
||||||
|
def success(result)
|
||||||
|
SuccessfulJUnitTestCase.new(result.as(SuccessfulResult))
|
||||||
|
end
|
||||||
|
|
||||||
|
# Creates a failure JUnit test case.
|
||||||
|
def failure(result)
|
||||||
|
FailureJUnitTestCase.new(result.as(FailedResult))
|
||||||
|
end
|
||||||
|
|
||||||
|
# Creates an error JUnit test case.
|
||||||
|
def error(result)
|
||||||
|
ErrorJUnitTestCase.new(result.as(ErroredResult))
|
||||||
|
end
|
||||||
|
|
||||||
|
# Creates a skipped JUnit test case.
|
||||||
|
def pending(result)
|
||||||
|
SkippedJUnitTestCase.new(result.as(PendingResult))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
36
src/spectator/formatting/junit_test_suite.cr
Normal file
36
src/spectator/formatting/junit_test_suite.cr
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
module Spectator::Formatting
|
||||||
|
# Mapping of a single spec file into a JUnit test suite.
|
||||||
|
private struct JUnitTestSuite
|
||||||
|
# Creates the JUnit test suite.
|
||||||
|
# The *path* should be the file that all results are from.
|
||||||
|
# The *results* is a subset of all results that share the path.
|
||||||
|
def initialize(@path : String, results : Array(Result))
|
||||||
|
@report = Report.new(results)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Generates the XML for the test suite (and all nested test cases).
|
||||||
|
def to_xml(xml : ::XML::Builder)
|
||||||
|
xml.element("testsuite",
|
||||||
|
tests: @report.example_count,
|
||||||
|
failures: @report.failed_count,
|
||||||
|
errors: @report.error_count,
|
||||||
|
skipped: @report.pending_count,
|
||||||
|
time: @report.runtime.total_seconds,
|
||||||
|
name: name,
|
||||||
|
package: package) do
|
||||||
|
@report.each do |result|
|
||||||
|
test_case = result.call(JUnitTestCase) { |r| r }
|
||||||
|
test_case.to_xml(xml)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private def name
|
||||||
|
"TODO"
|
||||||
|
end
|
||||||
|
|
||||||
|
private def package
|
||||||
|
"TODO"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
19
src/spectator/formatting/skipped_junit_test_case.cr
Normal file
19
src/spectator/formatting/skipped_junit_test_case.cr
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
module Spectator::Formatting
|
||||||
|
private struct SkippedJUnitTestCase
|
||||||
|
def initialize(@result : PendingResult)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_xml(xml : ::XML::Builder)
|
||||||
|
xml.element("testcase",
|
||||||
|
name: @result.example,
|
||||||
|
status: @result,
|
||||||
|
classname: classname) do
|
||||||
|
xml.element("skipped")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private def classname
|
||||||
|
"TODO"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
19
src/spectator/formatting/successful_junit_test_case.cr
Normal file
19
src/spectator/formatting/successful_junit_test_case.cr
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
module Spectator::Formatting
|
||||||
|
private struct SuccessfulJUnitTestCase
|
||||||
|
def initialize(@result : SuccessfulResult)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_xml(xml : ::XML::Builder)
|
||||||
|
xml.element("testcase",
|
||||||
|
name: @result.example,
|
||||||
|
status: @result,
|
||||||
|
time: @result.elapsed.total_seconds,
|
||||||
|
classname: classname,
|
||||||
|
assertions: @result.expectations.size)
|
||||||
|
end
|
||||||
|
|
||||||
|
private def classname
|
||||||
|
"TODO"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue