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
    raise "Couldn't parse test results: #{summary}" unless summary.find { |v| v =~ /(\d+) Tests (\d+) Failures (\d+) Ignored/ }
M
mvandervoord 已提交
102

103
    [Regexp.last_match(1).to_i, Regexp.last_match(2).to_i, Regexp.last_match(3).to_i]
M
Mark VanderVoord 已提交
104 105 106
  end
end

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

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

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

  begin
117
    # look in the specified or current directory for result files
M
Mark VanderVoord 已提交
118
    args[0] ||= './'
119
    targets = "#{ARGV[0].tr('\\', '/')}**/*.test*"
M
Mark VanderVoord 已提交
120
    results = Dir[targets]
M
mvandervoord 已提交
121

M
Mark VanderVoord 已提交
122
    raise "No *.testpass, *.testfail, or *.testresults files found in '#{targets}'" if results.empty?
M
mvandervoord 已提交
123

124
    uts.targets = results
M
Mark VanderVoord 已提交
125

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

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