我想加快一个大的RSpec项目的测试。除了使用RSpec的--profile
选项外,我还想打印出最长的运行测试文件[1]。如何从RSpec获取当前测试文件名?
在我spec_helper.rb
我转储类正在测试,总时间到一个文件,但是因为我们有spec/model
和spec/request
目录我真的希望能够打印当前测试的名而不仅仅是类名(described_class
),以便用户在优化时可以在model/foo_spec.rb
和request/foo_spec.rb
之间消歧。
在spec/spec_helper.rb
的before
块中,如何获取当前测试文件的文件名?
我(重修剪)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
这似乎不是要在curretn RSpec的元数据可用,但我希望有人更熟悉的内部可以想想一个方法来揭露它。谢谢, 戴夫
[1]通常,一个与,比如说文件,100个例子中它产生更加快比从--profile单个例子 - 当大文件的before :each
/before :all
块是针对性的,很明显,即使一个毫秒保存的数量乘以文件中的测试次数。除了--profile
以外,使用这种技术也给了我很多帮助。
谢谢;这并不直接解决我目前的问题,因为我似乎只有一个before:each,而不是:all。但是,我可以重写,直到我足够接近我想要的。 – 2012-03-29 11:50:47
是啊,之前:所有都没有获取元数据,但是实质上这样做的是每当测试/示例出现问题,并且在源文件更改时打印出来。如果你想深入挖掘,在config.before(:all)中放置一个“pp config”调用,然后执行一个测试来转储配置对象中的所有内容。你可能会在那里找到一些有用的东西,我错过了。 – plainjimbo 2012-03-29 17:47:45