Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you generate html reports when running with parallel_tests?

I'm running a bunch of rspec tests in parallel using the parallel_tests framework. Before I parallelized the tests, I was outputting the results from the tests into an html file like so:

rspec --format html --out tmp/index.html <pattern>

Now it looks more like this:

parallel:spec --format html --out tmp/index.html <pattern>

However, now that the tests are running in parallel, each test is generating its own html file, and since they all use the same path (tmp/index.html), the last test to finish overwrites the output html file and I'm left with a report of only that one test. How can I generate either a single html file which contains the aggregated results of all of my tests (this would be ideal)? And if that's not possible, how can I output each test to its own output html file so they don't all overwrite each other?

I tried using the built-in loggers in the parallel_test project (ParallelTests::RSpec::RuntimeLogger, ParallelTests::RSpec::SummaryLogger, and ParallelTests::RSpec::FailuresLogger) but those all just generate simple text files instead of the nice html files like rspec does. I also saw this question here but I'm not using cucumber, so this doesn't really apply to me. I tried putting --format html --out tmp/report<%= ENV['TEST_ENV_NUMBER'] %>.html in my .rspec_parallel file, but that didn't have any effect.

like image 660
Dasmowenator Avatar asked Aug 02 '14 00:08

Dasmowenator


1 Answers

I had to write my own formatter, here's the code in case anyone else runs into this problem:

require 'fileutils'
RSpec::Support.require_rspec_core "formatters"
RSpec::Support.require_rspec_core "formatters/helpers"
RSpec::Support.require_rspec_core "formatters/base_text_formatter"
RSpec::Support.require_rspec_core "formatters/html_printer"
RSpec::Support.require_rspec_core "formatters/html_formatter"

# Overrides functionality from base class to generate separate html files for each test suite
# https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/formatters/html_formatter.rb
class ParallelFormatter < RSpec::Core::Formatters::HtmlFormatter

  RSpec::Core::Formatters.register self, :start, :example_group_started, :start_dump,
                                         :example_started, :example_passed, :example_failed,
                                         :example_pending, :dump_summary

  # TEST_ENV_NUMBER will be empty for the first one, then start at 2 (continues up by 1 from there)
  def initialize(param=nil)
    output_dir = ENV['OUTPUT_DIR']
    FileUtils.mkpath(output_dir) unless File.directory?(output_dir)
    raise "Invalid output directory: #{output_dir}" unless File.directory?(output_dir)

    id = (ENV['TEST_ENV_NUMBER'].empty?) ? 1 : ENV['TEST_ENV_NUMBER'] # defaults to 1
    output_file = File.join(output_dir, "result#{id}.html")
    opened_file = File.open(output_file, 'w+')
    super(opened_file)
  end

end
like image 174
Dasmowenator Avatar answered Oct 14 '22 05:10

Dasmowenator