Domanda

Ogni volta che eseguo test rspec per la mia applicazione Rails, ci vuole un'eternità e un giorno di sovraccarico prima che inizi effettivamente a eseguire i test.Perché rspec è così lento?Esiste un modo per accelerare il caricamento iniziale di Rails o individuare la parte della mia app Rails di cui ho bisogno (ad es.Solo materiale ActiveRecord) in modo da non caricare assolutamente tutto per eseguire alcuni test?

È stato utile?

Soluzione

Dovresti essere in grado di accelerare il tuo script/spec chiamate correndo script/spec_server in una finestra di terminale separata, quindi aggiungendo il file aggiuntivo -X parametro alle chiamate delle specifiche.

Altri suggerimenti

Consiglio vivamente di dare un'occhiata a Spork.

http://spork.rubyforge.org/

Il railstutorial affronta specificamente questo problema e fornisce una soluzione alternativa per far funzionare bene Spork su Rails 3.0 (a partire da questo momento, Spork non è pronto per Rails 3).Naturalmente, se non sei su Rails 3.0, allora dovresti essere a posto.

La parte del tutorial che mostra come far funzionare Spork su Rails 3.0

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

Controllo quando Spork è pronto per Rails 3.0

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

Perché rspec è così lento? perché carica tutto l'ambiente, carica gli impianti e tutto quel jazz.

Esiste un modo per accelerare il caricamento iniziale di Rails potresti provare a utilizzare mock invece di fare affidamento sul database, questo è effettivamente corretto per i test unitari e accelererà sicuramente i tuoi test unitari.Inoltre utilizzando il server delle specifiche come menzionato da @Scott Matthewmann può aiutare, lo stesso con l'autotest di zentest menzionato da @Marc-André Lafortune

Esiste un modo per individuare la parte della mia app Rails di cui ho bisogno (ad es.Solo materiale ActiveRecord) in modo da non caricare assolutamente tutto per eseguire alcuni test? che dire di questo

rake test:recent 

Non sono sicuro di come l'attività rspec si integri con questa, ma potresti sicuramente utilizzare l'attività test:recent come modello per fare lo stesso con i test rspec se il file.

rake test:rspec:recent

non esiste ancora

perché carica tutto l'ambiente, carica gli impianti e tutto quel jazz.

Il vero colpevole è se lo esegui utilizzando rake spec, esegue il db:test:prepare compito.

Questa attività elimina l'intero database di test e lo ricrea da zero.Mi sembra ridicolo, ma è quello che fa (la stessa cosa accade quando corri rake:test:units eccetera).

Puoi facilmente aggirare questo problema utilizzando il file spec applicazione che rspec installa come parte di rspec gem.

Come questo:

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

Penso che l'esperienza "zen" che stai cercando sia correre spec_server E autospec in background, con il risultato di test quasi istantanei quando si salva un file.

Tuttavia, ho problemi a far comunicare questi due programmi.

Ho trovato una spiegazione Qui:

Ho notato che autotest non invia comandi a spec_server.Invece ricarica l'intero ambiente Rails e i plugin della tua applicazione ogni volta che esegue.Ciò fa sì che Autotest sia significativamente più lento di Script Server, perché quando si esegue il comando Script/Spec, le specifiche vengono inviate allo Spece_Server che ha già acceso l'ambiente di Rails e pronto a partire.Se ti capita di installare un nuovo plugin o qualcosa del genere, dovrai riavviare Spece_Server.

Ma come risolviamo questo problema?Immagino che ciò comporterebbe il download di ZenTest e la modifica del codice per il file autotest programma, ma non ho tempo di provarlo adesso.

Lo stai eseguendo su Rails?Se è così, non è l'inizializzazione di RSpec ad essere lenta, ma quella di Rails.Rails deve inizializzare l'intero codice base e la vostra prima di eseguire le specifiche.Beh, non è così Avere a, ma lo fa.RSpec funziona abbastanza velocemente per me nei miei piccoli progetti non ferroviari.

L'esecuzione dei test può essere molto lenta perché l'intero ambiente rails deve essere caricato (provare script/console) e solo allora tutti i test possono essere eseguiti.Dovresti usare auto test che mantiene caricato l'ambiente e controllerà quali file modifichi.Quando modifichi e salvi un file, solo i test che dipendono da questi verranno eseguiti automaticamente e velocemente.

Se utilizzi un Mac, ti consiglio di utilizzare Rspactor anziché l'autotest poiché utilizza molte meno risorse per il polling dei file modificati rispetto all'autotest.Esiste sia la versione completa di Cocoa

RSpactor.app

o la versione gemma che mantengo Github

sudo gem install pelle-rspactor

Sebbene questi non velocizzino i singoli test rspec, sembrano molto più veloci poiché eseguono automaticamente le specifiche interessate entro un secondo dal salvataggio.

A partire da rspec-rails-1.2.7, spec_server è deprecato a favore di spork gem.

Il motivo principale è che richiedono riprese per sempre su Windows, per qualche motivo.

Suggerimenti per accelerare:spork ora funziona con Windows, credo.

Puoi provare "faster_require" che memorizza nella cache le posizioni:

http://github.com/rdp/faster_require

GL.-rp

Se utilizzi un ambiente Windows, probabilmente c'è poco che puoi fare poiché Rails sembra avviarsi molto lentamente in Windows.Ho avuto la stessa esperienza su Windows e ho dovuto spostare la mia configurazione su una VM Linux per renderla davvero scattante (usavo anche l'autotest).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top