Как вы генерируете отчеты html при работе с parallel_tests?

Я параллельно запускаю кучу тестов rspec с помощью framework_tests. Перед распараллеливанием тестов я выводил результаты тестов в html-файл примерно так:

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

Теперь это выглядит примерно так:

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

Однако теперь, когда тесты выполняются параллельно, каждый тест генерирует свой собственный html-файл, и, поскольку все они используют один и тот же путь (tmp/index.html), последний завершающий тест перезаписывает выходной html-файл, и я осталось с отчетом только об этом тесте. Как я могу сгенерировать либо один HTML-файл, который содержит агрегированные результаты всех моих тестов (это было бы идеально)? И если это невозможно, как я могу вывести каждый тест в свой собственный выходной HTML-файл, чтобы они не перезаписывали друг друга?

Я попытался использовать встроенные средства ведения журнала в проекте parallel_test (ParallelTests::RSpec::RuntimeLogger, ParallelTests::RSpec::SummaryLogger и ParallelTests::RSpec::FailuresLogger), но все они просто генерируют простые текстовые файлы вместо красивого HTML-файлы, как rspec делает. Я также видел этот вопрос здесь, но я не использую огурец, так что это не относится ко мне. Я пытался положить --format html --out tmp/report<%= ENV['TEST_ENV_NUMBER'] %>.html в моем .rspec_parallel файл, но это не имело никакого эффекта.

1 ответ

Решение

Я должен был написать свой собственный форматер, вот код на случай, если кто-то еще столкнется с этой проблемой:

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
Другие вопросы по тегам