如何从RSpec获取当前的测试文件名?

时间:2012-03-27 13:57:14

标签: ruby-on-rails ruby rspec rspec2

我正在尝试加速大型RSpec项目的测试。除了使用RSpec的--profile选项之外,我还希望打印出运行时间最长的测试文件[1]。

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

before的{​​{1}}块中,如何获取当前测试文件的文件名?

我的(严重修剪)spec/spec_helper.rb看起来像这样:

spec_helper

这似乎不适用于当前的RSpec元数据,但我希望有更熟悉内部人员的人可以想出一种揭露它的方法。谢谢, 戴夫

[1]通常一个包含100个例子的文件比--profile中的单个例子产生的速度更快 - 当大文件的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 / before :each块被定位时,显然甚至保存的ms也乘以文件中的测试次数。除了before :all之外,使用这种技术对我帮助很大。

1 个答案:

答案 0 :(得分:8)

只要您只是使用它来分析测试以确定哪些文件需要改进,您应该能够将其归入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