Ich versuche, die Tests eines großen RSpec-Projekts zu beschleunigen. Zusätzlich zu RSpec --profile
Option wollte ich die am längsten laufenden Testdateien [1] ausgedruckt bekommen.Wie bekomme ich den aktuellen Testdateinamen von RSpec?
In meinem spec_helper.rb
ich Dump die Klassen in einer Datei geprüft und die Gesamtzeit ist, aber als wir spec/model
und spec/request
Verzeichnisse habe ich wirklich Dateiname den aktuellen Test des drucken möchten in der Lage sein, nicht nur den Klassennamen (described_class
), so dass der Benutzer bei der Optimierung zwischen model/foo_spec.rb
und request/foo_spec.rb
disambiguieren kann.
In einem before
Block in der spec/spec_helper.rb
, wie kann ich den Dateinamen der aktuellen Testdatei erhalten?
My (stark beschnitten) spec_helper
sieht wie folgt aus:
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
Dies scheint nicht RSpec Meta-Daten in der curretn verfügbar zu sein, aber ich bin der Hoffnung, jemand besser vertraut mit den Interna können denke an einen Weg, es zu entlarven. Danke, Dave
[1] Oft wird eine Datei mit, sagen wir, 100 Beispiele in es mehr beschleunigen als ein einziges Beispiel aus --profile ergibt - bei, dass große before :each
/before :all
Blöcke der Datei sind targetted, offensichtlich sogar eine ms gespeichert wird mit der Anzahl der Tests in der Datei multipliziert. Die Verwendung dieser Technik neben --profile
hat mir sehr geholfen.
Danke; Dadurch wird mein aktuelles Problem nicht direkt aussortiert, da ich die Beispielmetadaten nur scheinbar in einem Vorher, nämlich jedem, und nicht in dem: All zu haben scheint. Ich kann jedoch neu schreiben, bis ich nahe genug an das bin, was ich möchte. –
yeah, vorher: Alle erhalten keine Metadaten, aber was dies im Wesentlichen tut, ist, jeden Test/jedes Beispiel zu verfolgen und jedes Mal auszudrucken, wenn sich die Quelldatei ändert. Wenn Sie etwas tiefer graben wollen, setzen Sie einen "pp config" Aufruf in config.before (: all) und führen Sie dann einen Test durch, um alles, was im config Objekt ist, auszugeben. Vielleicht findest du darin etwas Nützliches, das ich vermisst habe. – plainjimbo