私は大規模なRSpecプロジェクトのテストをスピードアップしようとしています。 RSpecの--profile
オプションを使用することに加えて、最長実行テストファイル[1]を印刷したいと思っていました。私spec_helper.rb
でRSpecから現在のテストファイル名を取得するには?
私たちは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
ブロックは、明らかにさえMS標的化さですsavedは、ファイル内のテスト数で乗算されます。 --profile
に加えてこのテクニックを使用すると、私は多くの助けになりました。
ありがとう;これは私の現在の問題を直接的に分類するものではありません。私は前例のメタデータの例だけを持っているように見えます。しかし、私が欲しいものに十分近づくまで書き直すことができます。 –
えええええええええええええええええええええええええええええええええええええええええええ。もっと深く掘り下げたい場合は、config.before(:all)に "pp config"コールを置き、configオブジェクトにあるすべてのものをダンプするために1つのテストを実行します。あなたは、私が逃したことで役に立つ何かを見つけるかもしれません。 – plainjimbo