Class: Danger::DangerJunit

Inherits:
Plugin
  • Object
show all
Defined in:
lib/junit/plugin.rb

Overview

Report, or inspect any JUnit XML formatted test suite report.

Testing frameworks have standardized on the JUnit XML format for reporting results, this means that projects using Rspec, Jasmine, Mocha, XCTest and more - can all use the same Danger error reporting. Perfect.

You can see some examples on [this page from Circle CI](circleci.com/docs/test-metadata/) about how you can add JUnit XML output for your testing projects.

Examples:

Parse the XML file, and let the plugin do your reporting


junit.parse "/path/to/output.xml"
junit.report

Let the plugin parse the XML file, and report yourself


junit.parse "/path/to/output.xml"
fail("Tests failed") unless junit.fails.empty?

Warn on a report about skipped tests


junit.parse "/path/to/output.xml"
junit.show_skipped_tests = true
junit.report

See Also:

  • danger/danger, artsy/eigen

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#errorsArray<Ox::Element>

An array of XML elements that represent passed tests.

Returns:

  • (Array<Ox::Element>)


44
45
46
# File 'lib/junit/plugin.rb', line 44

def errors
  @errors
end

#failuresArray<Ox::Element>

An array of XML elements that represent failed tests.

Returns:

  • (Array<Ox::Element>)


39
40
41
# File 'lib/junit/plugin.rb', line 39

def failures
  @failures
end

#passesArray<Ox::Element>

An array of XML elements that represent passed tests.

Returns:

  • (Array<Ox::Element>)


34
35
36
# File 'lib/junit/plugin.rb', line 34

def passes
  @passes
end

#show_skipped_testsBool

An attribute to make the plugin show a warning on skipped tests.

Returns:

  • (Bool)


54
55
56
# File 'lib/junit/plugin.rb', line 54

def show_skipped_tests
  @show_skipped_tests
end

#skippedArray<Ox::Element>

An array of XML elements that represent skipped tests.

Returns:

  • (Array<Ox::Element>)


49
50
51
# File 'lib/junit/plugin.rb', line 49

def skipped
  @skipped
end

Instance Method Details

#parse(file) ⇒ void

This method returns an undefined value.

Parses an XML file, which fills all the attributes will ‘raise` for errors



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/junit/plugin.rb', line 59

def parse(file)
  require 'ox'
  raise "No Junit file was found at #{file}" unless File.exist? file

  xml_string = File.read file
  @doc = Ox.parse xml_string

  suite_root = @doc.nodes.first.value == 'testsuites' ? @doc.nodes.first : @doc
  tests = suite_root.nodes.map(&:nodes).flatten.select { |node| node.value == 'testcase' }

  failed_suites = suite_root.nodes.select { |suite| suite[:failures].to_i > 0 || suite[:errors].to_i > 0 }
  failed_tests = failed_suites.map(&:nodes).flatten.select { |node| node.value == 'testcase' }

  @failures = failed_tests.select { |test| test.nodes.count > 0 }.select { |test| test.nodes.first.value == 'failure' }

  @errors = failed_tests.select { |test| test.nodes.count > 0 }.select { |test| test.nodes.first.value == 'error' }

  @skipped = tests.select { |test| test.nodes.count > 0 }.select { |test| test.nodes.first.value == 'skipped' }

  @passes = tests - @failures - @errors - @skipped
end

#reportvoid

This method returns an undefined value.

Causes a build fail if there are test failures, and outputs a markdown table of the results.



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/junit/plugin.rb', line 85

def report
  warn("Skipped #{skipped.count} tests.") if show_skipped_tests && skipped.count > 0

  unless failures.empty? && errors.empty?
    fail("Tests have failed, see below for more information.", sticky: false)
    message = "### Tests: \n\n"

    tests = (failures + errors)
    keys = tests.first.attributes.keys
    attributes = keys.map(&:to_s).map(&:capitalize)

    # Create the header
    message << attributes.join(' | ') + "|\n"
    message << attributes.map { |_| '---' }.join(' | ') + "|\n"

    tests.each do |test|
      message << test.attributes.values.join(' | ') + "|\n"
    end

    markdown message
  end
end