class Fastlane::Actions::PrettyJunitAction
Public Class Methods
available_options()
click to toggle source
# File lib/fastlane/plugin/pretty_junit/actions/pretty_junit_action.rb, line 87 def self.available_options [ FastlaneCore::ConfigItem.new(key: :file_pattern, description: "Glob file pattern to search for junit-style xml files") ] end
description()
click to toggle source
# File lib/fastlane/plugin/pretty_junit/actions/pretty_junit_action.rb, line 75 def self.description "Pretty JUnit test results for your Android projects." end
details()
click to toggle source
# File lib/fastlane/plugin/pretty_junit/actions/pretty_junit_action.rb, line 79 def self.details "Pretty prints JUnit test results for your Android projects. You should make sure that the previous test results are deleted before running the gradle action, and that the grade action does not fail the lane on test failure. To delete the files, you can use the delete_files plugin and pass in the same file pattern that you pass to this action. To prevent the gradle action from failing on test failure, you can hack around it by appending '|| true' to the end of the 'flags' argument." end
is_supported?(platform)
click to toggle source
# File lib/fastlane/plugin/pretty_junit/actions/pretty_junit_action.rb, line 94 def self.is_supported?(platform) true end
run(params)
click to toggle source
# File lib/fastlane/plugin/pretty_junit/actions/pretty_junit_action.rb, line 11 def self.run(params) file_pattern = params[:file_pattern] UI.message "Searching for JUnit XML files with pattern \"#{file_pattern}\"" matching_files = Dir.glob(file_pattern) UI.user_error! "No files found! Did your project compile?" unless matching_files.any? UI.message "Processing files: #{matching_files.join(", ")}" all_results = [] headings = ['', 'Context', 'Test', 'Duration'] table = Terminal::Table.new(title: "Test Results", headings: headings) do |t| matching_files.each do |file| results = nil begin results = Helper::PrettyJunitHelper.parse_junit_xml(file) all_results << results rescue Exception => ex UI.crash! "An error occurred while trying to parse \"#{file}\": #{ex}" end results.passed.each do |result| t.add_row ['✅', result.context.green, result.name.green, result.duration.green] end results.skipped.each do |result| t.add_row ['❔', result.context, result.name, result.duration] end results.failed.each do |result| t.add_row ['❌', result.context.red, result.name.red, result.duration.red] end end end all_failed = all_results.map{ |r| r.failed }.flatten all_failed.each do |failed| UI.error "Failed #{failed.class_path}.#{failed.name} with message: \n#{failed.fail_message}\nStack trace:\n#{failed.stack_trace}\n" end UI.message "\n#{table}\n" all_failed.each do |failed| UI.error "Failed #{failed.class_path}.#{failed.name} with message:\n\n#{failed.fail_message}\nSee above for stack trace.\n" end failed_count = all_results.inject(0) { |sum, r| sum + r.failed.length } skipped_count = all_results.inject(0) { |sum, r| sum + r.skipped.length } passed_count = all_results.inject(0) { |sum, r| sum + r.passed.length } messages = [] messages << "#{passed_count} passed".green messages << "#{skipped_count} skipped" messages << "#{failed_count} failed".red test_counts = "#{messages.join(', ')}" if failed_count == 0 message = "All tests passed!".green UI.message "#{message} #{test_counts}" else message = "You have failing tests!".red UI.user_error! "#{message} #{test_counts}" end end