class Fastlane::Plugin::MergeJunitReport::Merger
Merge several junit reports into one single report
Public Class Methods
new(reports)
click to toggle source
Initializes an instance of Merger
@param [Array<REXML::Document>] junit reports the junit reports to merge from @return [Merger]
# File lib/fastlane/plugin/merge_junit_report/merger.rb, line 9 def initialize(reports) @reports = reports end
Public Instance Methods
merge()
click to toggle source
Merges reports passed in via constructor @return [REXML::Document] merged junit report
# File lib/fastlane/plugin/merge_junit_report/merger.rb, line 15 def merge baseline = @reports.first @reports.drop(1).each do |report| report.elements.each('//testsuite') do |suite_to_merge| suite_name = suite_to_merge.attributes['name'] baseline_suite = REXML::XPath.first(baseline, "//testsuite[@name='#{suite_name}']") next unless baseline_suite suite_to_merge.elements.each('testcase') do |case_to_merge| classname = case_to_merge.attributes['classname'] name = case_to_merge.attributes['name'] baseline_case = REXML::XPath.first(baseline_suite, "testcase[@name='#{name}' and @classname='#{classname}']") # Replace baseline_case with case_to_merge if baseline_case baseline_case.parent.insert_after(baseline_case, case_to_merge) baseline_case.parent.delete_element(baseline_case) end end end end recalculate_failures(baseline) baseline end
Private Instance Methods
recalculate_failures(baseline)
click to toggle source
# File lib/fastlane/plugin/merge_junit_report/merger.rb, line 40 def recalculate_failures(baseline) total_failures = 0 baseline.elements.each('//testsuite') do |suite| failures = 0 suite.elements.each('testcase') { |testcase| failures += 1 unless REXML::XPath.match(testcase, 'failure').empty? } remove_or_update_failures(failures, suite) total_failures += failures end remove_or_update_failures(total_failures, REXML::XPath.first(baseline, '/testsuites')) end
remove_or_update_failures(failures, node)
click to toggle source
# File lib/fastlane/plugin/merge_junit_report/merger.rb, line 51 def remove_or_update_failures(failures, node) if failures.zero? node.delete_attribute('failures') else node.attributes['failures'] = failures.to_s end end