Я пытаюсь ускорить тестирование большого проекта 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
мне очень помогло.