2008-09-15 21 views
43

Immer, wenn ich rspec Tests für meine Rails-Anwendung ausführen, dauert es ewig und ein Tag Overhead, bevor es tatsächlich Tests startet. Warum ist rspec so langsam? Gibt es eine Möglichkeit, die anfängliche Belastung von Rails zu beschleunigen oder den Teil meiner Rails-App herauszufiltern, den ich brauche (z. B. nur ActiveRecord-Zeug), damit nicht wirklich alles geladen wird, um ein paar Tests durchzuführen?Warum ist RSpec unter Rails so langsam?

Antwort

22

sollten Sie in der Lage sein, Ihre script/spec Anrufe zu beschleunigen, indem script/spec_server in einem separaten Terminal-Fenster läuft, dann die zusätzlichen -X Parameter auf Ihre spec Anrufe hinzufügen.

+0

Um es klar zu sagen, würden Sie dann so etwas tun: spec --color ./spec -X –

+21

spec_server ist jetzt zugunsten von spork veraltet. (http://github.com/timcharper/spork) – austinfromboston

+2

https://github.com/sporkrb/spork - neue Quelle von Spork – ted

3

Laufen Sie das über Rails? Wenn dies der Fall ist, ist es nicht die Initialisierung von RSpec, sondern Rails '. Rails muss die gesamte Codebasis und Ihre vor dem Ausführen der Spezifikationen initialisieren. Nun, es hat nicht zu, aber es tut. RSpec läuft ziemlich schnell für mich unter meinen kleinen Non-Rails-Projekten.

+0

Dank für diese Antwort. Ich habe die Frage geklärt, dass sie spezifisch für Rails ist. –

+0

Dann ja, seine Schienen, nicht rspec, die Sie sicher verlangsamen. –

3

Lauftests können sehr langsam sein, weil die gesamte Rails-Umgebung geladen werden muss (versuche Skript/Konsole) und erst dann können alle Tests ausgeführt werden. Sie sollten autotest verwenden, die die Umgebung geladen hält und prüfen, welche Dateien Sie bearbeiten. Wenn Sie eine Datei bearbeiten und speichern, werden nur die davon abhängigen Tests automatisch und schnell ausgeführt.

2

Wenn Sie einen Mac verwenden, empfehle ich Rspactor über Autotest, da es viel weniger Ressourcen für die Abfrage geänderter Dateien als Autotest verwendet. Es ist sowohl eine vollständige Cocoa-Version

RSpactor.app

oder der Edelstein-Version, die ich bei Github

sudo gem install pelle-rspactor 

pflegen Während diese einzelnen rspec Tests nicht beschleunigen, fühlen sie sich viel schneller als sie Auto Führen Sie die betroffenen Spezifikationen innerhalb einer Sekunde von Ihnen aus und speichern Sie sie.

+0

coole Idee, aber Link muss aktualisiert werden und es scheint nicht mit der neuesten rspec funktionieren. –

+0

Ich empfehle die Verwendung von mislavs Version jetzt. sudo gem installieren mislav-rspactor – Pelle

1

Wenn Sie in einer Windows-Umgebung sind, dann gibt es wahrscheinlich wenig, was Sie tun können, da Rails unter Windows langsam zu starten scheint. Ich hatte die gleiche Erfahrung unter Windows und musste mein Setup auf eine Linux-VM verschieben, um es wirklich zippy zu machen (ich benutzte auch Autotest).

+0

+1. Ich betreibe Rails und RSpec unter Linux und habe keine Langsamkeitsbeschwerden, wenn auch auf einem ziemlich leistungsfähigen Rechner. Mein Kollege verwendet Windows auf identischer Hardware und es kann eine ganze Minute dauern, bis die Rails-Umgebung geladen ist. –

4

Warum ist rspec so langsam? weil es die ganze Umgebung belädt, Lasten und alles, was Jazz kostet.

Gibt es eine Möglichkeit, die anfängliche Belastung von Rails zu beschleunigen Sie könnten versuchen, Mocks zu verwenden, statt sich auf die Datenbank zu verlassen. Dies ist tatsächlich korrekt für Komponententests und wird Ihre Unit Tests definitiv beschleunigen. Additionnaly mit dem spec Server wie von @Scott Matthewman erwähnt kann, das gleiche mit dem Autotest von ZenTest von @Marc-Andre Lafortune

Gibt es eine Möglichkeit erwähnt helfen, die Teil meiner Rails-Anwendung zu heraus ich brauche (zB Active Sachen nur) so es lädt nicht alles, um ein paar Tests zu machen? was diesen

rake test:recent 

bin ich nicht sicher, wie die rspec Aufgabe mit diesem integrieren, aber man konnte auf jeden Fall den Test verwenden: recent Aufgabe als Vorlage das gleiche mit rspec-Tests, wenn das zu tun.

rake test:rspec:recent 

existiert noch nicht

+0

Es gibt ein neues Autotest-Tool für Ruby: Infinity-Test @ http://github.com/tomas-stefano/infinity_test – Jean

+0

@Scott, was sende ich und warum? – rogerdpack

4

weil es die ganze environement lädt, lädt Armaturen und alle, die Jazz.

Der wahre Schuldige ist, wenn Sie es mit rake spec laufen, it runs the db:test:prepare task.

Mit dieser Task wird die gesamte Testdatenbank gelöscht und von Grund auf neu erstellt. Dies scheint mir lächerlich, aber das ist es, was es tut (das gleiche passiert, wenn Sie rake:test:units etc. laufen lassen).

Sie können dies leicht umgehen mit der spec Anwendung, die rspec als Teil der rspec Gem installiert.

So:

cd railsapp 
spec speC# run all specs without rebuilding the whole damn database 
spec spec/models # run model specs only 

cd spec 
spec controllers/user* # run specs for controllers that start with user 
+4

Durch das Löschen der DB und das erneute Erstellen wird sichergestellt, dass die Daten von den Fixtures korrekt geladen werden und keine Änderungen von vorherigen Läufen übrig bleiben. Running Spec direkt garantiert das nicht. Wenn du von der db abhängig sein willst, musst du sie von Grund auf neu erstellen, mock objects ftw! – Jean

4

Ich denke, die „Zen“ Erfahrung Sie suchen ist spec_server und autospec im Hintergrund laufen zu lassen, mit dem Ergebnis, nahezu sofortige Tests, wenn Sie eine Datei speichern.

Allerdings habe ich Probleme, diese beiden Programme zu kommunizieren.

fand ich eine Erklärung here:

Ich habe bemerkt, dass Autotest keine Befehle an die spec_server senden. Stattdessen wird die gesamte Rails-Umgebung und die Plugins der Anwendung bei jeder Ausführung neu geladen. Dies führt dazu, dass der Autotest deutlich langsamer ausgeführt wird als der Skriptserver, denn wenn Sie den Skript-/Spezifikationsbefehl ausführen, werden die Spezifikationen an den spec_server gesendet, der Ihre Rails-Umgebung bereits hochgefahren und betriebsbereit ist. Wenn Sie zufällig ein neues Plugin oder etwas ähnliches installieren, dann müssen Sie den spec_server neu starten.

Aber, wie beheben wir dieses Problem? Ich nehme an, es würde ZenTest herunterladen und den Code für das autotest Programm ändern, aber ich habe keine Zeit es jetzt auszuprobieren.

2

Ab der Version rspec-rails-1.2.7 wird spec_server zugunsten des Spork gem veraltet.

2

Der Hauptgrund ist, dass erfordert für immer auf Windows, aus irgendeinem Grund.

Tipps für die Beschleunigung: Spork funktioniert jetzt mit Windows, glaube ich.

Sie können versuchen, "faster_require", welche Orte Caches:

http://github.com/rdp/faster_require

GL. -rp

32

Ich empfehle definitiv spork zu überprüfen.

http://spork.rubyforge.org/

Die railstutorial dies speziell an und gibt eine Abhilfe Spork in Schienen laufen 3.0 schön zu bekommen (ab diesem Moment ist Spork nicht Schienen 3 bereit, aus dem Kasten). Natürlich, wenn Sie nicht auf Schienen 3.0 sind, dann sollten Sie gut gehen.

Der Teil des Tutorials zeigt, wie in Schienen 3,0

http://railstutorial.org/chapters/static-pages#sec:spork

prüfen Spork zum Laufen zu bringen, wenn Spork ist Schienen 3.0 bereit

http://www.railsplugins.org/plugins/440-spork

+1

Spork hat super für mich gearbeitet, es hat Tests wieder Spaß gemacht. –

+0

Es gibt nur ein Detail, das in Bezug auf Spork erwähnenswert ist: es läuft nicht unter Windows. – lampak