2012-03-27 12 views
3

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.

Antwort

5

Solange Sie dies nur verwenden, um Ihre Tests zu profilieren, um festzustellen, welche Dateien verbessert werden müssen, sollten Sie diese in Ihre spec_helper.rb Datei werfen können (und diese anschließend entfernen). Ich verstehe völlig, dass dies nicht schön/sauber/elegant/akzeptabel in Produktionsumgebungen ist und ich leugne, dass ich es jemals geschrieben habe :)

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

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. –

+0

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

Verwandte Themen