Perché RSpec è così lento con Rails?
-
09-06-2019 - |
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?
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.
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
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
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).