2012-03-27 52 views
3

我想加快一个大的RSpec项目的测试。除了使用RSpec的--profile选项外,我还想打印出最长的运行测试文件[1]。如何从RSpec获取当前测试文件名?

在我spec_helper.rb我转储类正在测试,总时间到一个文件,但是因为我们有spec/modelspec/request目录我真的希望能够打印当前测试的而不仅仅是类名(described_class),以便用户在优化时可以在model/foo_spec.rbrequest/foo_spec.rb之间消歧。

spec/spec_helper.rbbefore块中,如何获取当前测试文件的文件名?

我(重修剪)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以外,使用这种技术也给了我很多帮助。

回答

5

只要你使用这个来分析你的测试,以确定哪些文件需要改进,你应该能够把它扔到你的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 
+0

谢谢;这并不直接解决我目前的问题,因为我似乎只有一个before:each,而不是:all。但是,我可以重写,直到我足够接近我想要的。 – 2012-03-29 11:50:47

+0

是啊,之前:所有都没有获取元数据,但是实质上这样做的是每当测试/示例出现问题,并且在源文件更改时打印出来。如果你想深入挖掘,在config.before(:all)中放置一个“pp config”调用,然后执行一个测试来转储配置对象中的所有内容。你可能会在那里找到一些有用的东西,我错过了。 – plainjimbo 2012-03-29 17:47:45

相关问题