Как получить текущее имя файла теста из RSpec? - PullRequest
4 голосов
/ 27 марта 2012

Я пытаюсь ускорить тестирование большого проекта RSpec.В дополнение к использованию опции RSpec --profile я хотел распечатать тестовые файлы с самым продолжительным временем работы [1].

В моем spec_helper.rb я записываю тестируемые классы и общее время в файл, однако, поскольку у нас есть каталоги spec/model и spec/request, я бы очень хотел иметь возможность распечатать текущий тест имя_файла , а не только имя класса (described_class), так что пользователь может устранить неоднозначность между model/foo_spec.rb и request/foo_spec.rb при оптимизации.

В блоке beforeв spec/spec_helper.rb как я могу получить имя файла текущего тестового файла?

Мой (сильно обрезанный) spec_helper выглядит следующим образом:

config.before :all do
  @start_time = Time.now
end

config.after :all do |test|
  timings.push({ :name => test.described_class,
                 :file => 'I do not know how to get this',
                 :duration_in_seconds => (Time.now - @start_time) })
end

config.after :suite do
  timing_logfile_name = 'log/rspec_file_times.log'
  timing_logfile = "#{File.dirname(__FILE__)}/../#{timing_logfile_name}"
  file = File.open(timing_logfile, 'w')
  timings.sort_by{ |timing| timing[:duration_in_seconds].to_f }.reverse!.each do |timing|
    file.write( sprintf("%-25.25s    % 9.3f seconds\n",
                        timing[:name], timing[:duration_in_seconds]) )
  end
  file.close
  tell_if_verbose("Overall test times are logged in '#{timing_logfile_name}'")
end

Это неПохоже, что они доступны в современных метаданных RSpec, но я надеюсь, что кто-то, более знакомый с внутренними компонентами, сможет придумать способ раскрыть его.Спасибо, Дэйв

[1] Зачастую файл с, скажем, 100 примерами в нем дает большую скорость, чем один пример из --profile - когда нацелены блоки before :each / before :all этого большого файлаочевидно, что даже сохраненная мс умножается на количество тестов в файле.Использование этой техники в дополнение к --profile мне очень помогло.

1 Ответ

9 голосов
/ 27 марта 2012

Пока вы просто используете это для профилирования ваших тестов, чтобы определить, какие файлы необходимо улучшить, вы сможете добавить это в свой файл spec_helper.rb (и впоследствии удалить его). Я полностью понимаю, что это не красиво / чисто / элегантно / неприемлемо в производственных средах, и я отрицаю, что когда-либо писал это:

config.before(:each) do
  path = example.metadata[:example_group][:file_path]
  curr_path = config.instance_variable_get(:@curr_file_path)
  if (curr_path.nil? || path != curr_path)
    config.instance_variable_set(:@curr_file_path, path)
    puts path
  end
end
...