2012-03-27 16 views
3

私は大規模なRSpecプロジェクトのテストをスピードアップしようとしています。 RSpecの--profileオプションを使用することに加えて、最長実行テストファイル[1]を印刷したいと思っていました。私spec_helper.rbRSpecから現在のテストファイル名を取得するには?

私たちは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ブロックは、明らかにさえMS標的化さですsavedは、ファイル内のテスト数で乗算されます。 --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

ありがとう;これは私の現在の問題を直接的に分類するものではありません。私は前例のメタデータの例だけを持っているように見えます。しかし、私が欲しいものに十分近づくまで書き直すことができます。 –

+0

えええええええええええええええええええええええええええええええええええええええええええ。もっと深く掘り下げたい場合は、config.before(:all)に "pp config"コールを置き、configオブジェクトにあるすべてのものをダンプするために1つのテストを実行します。あなたは、私が逃したことで役に立つ何かを見つけるかもしれません。 – plainjimbo

関連する問題