unity_test_summary.rb 4.0 KB
Newer Older
M
Mark VanderVoord 已提交
1 2 3 4 5 6
# ==========================================
#   Unity Project - A Test Framework for C
#   Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
#   [Released under MIT License. Please refer to license.txt for details]
# ==========================================

7
# !/usr/bin/ruby
M
Mark VanderVoord 已提交
8 9 10 11 12 13 14 15 16 17
#
# unity_test_summary.rb
#
require 'fileutils'
require 'set'

class UnityTestSummary
  include FileUtils::Verbose

  attr_reader :report, :total_tests, :failures, :ignored
18
  attr_writer :targets, :root
M
Mark VanderVoord 已提交
19

20
  def initialize(_opts = {})
M
Mark VanderVoord 已提交
21 22 23 24 25 26 27 28
    @report = ''
    @total_tests = 0
    @failures = 0
    @ignored = 0
  end

  def run
    # Clean up result file names
29
    results = @targets.map { |target| target.tr('\\', '/') }
M
Mark VanderVoord 已提交
30 31 32 33 34 35

    # Dig through each result file, looking for details on pass/fail:
    failure_output = []
    ignore_output = []

    results.each do |result_file|
36
      lines = File.readlines(result_file).map(&:chomp)
37 38 39 40 41 42 43 44 45 46

      raise "Empty test result file: #{result_file}" if lines.empty?

      output = get_details(result_file, lines)
      failure_output << output[:failures] unless output[:failures].empty?
      ignore_output  << output[:ignores]  unless output[:ignores].empty?
      tests, failures, ignored = parse_test_summary(lines)
      @total_tests += tests
      @failures += failures
      @ignored += ignored
M
Mark VanderVoord 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
    end

    if @ignored > 0
      @report += "\n"
      @report += "--------------------------\n"
      @report += "UNITY IGNORED TEST SUMMARY\n"
      @report += "--------------------------\n"
      @report += ignore_output.flatten.join("\n")
    end

    if @failures > 0
      @report += "\n"
      @report += "--------------------------\n"
      @report += "UNITY FAILED TEST SUMMARY\n"
      @report += "--------------------------\n"
      @report += failure_output.flatten.join("\n")
    end

    @report += "\n"
    @report += "--------------------------\n"
    @report += "OVERALL UNITY TEST SUMMARY\n"
    @report += "--------------------------\n"
    @report += "#{@total_tests} TOTAL TESTS #{@failures} TOTAL FAILURES #{@ignored} IGNORED\n"
    @report += "\n"
  end

73
  def usage(err_msg = nil)
M
Mark VanderVoord 已提交
74 75 76
    puts "\nERROR: "
    puts err_msg if err_msg
    puts "\nUsage: unity_test_summary.rb result_file_directory/ root_path/"
77 78 79 80
    puts '     result_file_directory - The location of your results files.'
    puts '                             Defaults to current directory if not specified.'
    puts '                             Should end in / if specified.'
    puts '     root_path - Helpful for producing more verbose output if using relative paths.'
M
Mark VanderVoord 已提交
81 82 83 84 85
    exit 1
  end

  protected

86 87
  def get_details(_result_file, lines)
    results = { failures: [], ignores: [], successes: [] }
M
Mark VanderVoord 已提交
88
    lines.each do |line|
89
      _src_file, _src_line, _test_name, status, _msg = line.split(/:/)
90 91 92 93 94
      line_out = (@root && (@root != 0) ? "#{@root}#{line}" : line).gsub(/\//, '\\')
      case status
      when 'IGNORE' then results[:ignores]   << line_out
      when 'FAIL'   then results[:failures]  << line_out
      when 'PASS'   then results[:successes] << line_out
M
Mark VanderVoord 已提交
95 96
      end
    end
97
    results
M
Mark VanderVoord 已提交
98 99 100
  end

  def parse_test_summary(summary)
101 102
    raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ }
    [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i]
M
Mark VanderVoord 已提交
103 104 105
  end
end

106
if $0 == __FILE__
M
Mark VanderVoord 已提交
107

108 109 110
  # parse out the command options
  opts, args = ARGV.partition { |v| v =~ /^--\w+/ }
  opts.map! { |v| v[2..-1].to_sym }
M
Mark VanderVoord 已提交
111

112
  # create an instance to work with
M
Mark VanderVoord 已提交
113 114 115
  uts = UnityTestSummary.new(opts)

  begin
116
    # look in the specified or current directory for result files
M
Mark VanderVoord 已提交
117
    args[0] ||= './'
118
    targets = "#{ARGV[0].tr('\\', '/')}**/*.test*"
M
Mark VanderVoord 已提交
119 120
    results = Dir[targets]
    raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty?
121
    uts.targets = results
M
Mark VanderVoord 已提交
122

123
    # set the root path
M
Mark VanderVoord 已提交
124
    args[1] ||= Dir.pwd + '/'
125
    uts.root = ARGV[1]
M
Mark VanderVoord 已提交
126

127
    # run the summarizer
M
Mark VanderVoord 已提交
128
    puts uts.run
129
  rescue StandardError => e
M
Mark VanderVoord 已提交
130 131 132
    uts.usage e.message
  end
end