2008-09-15 18 views
43

Cada vez que ejecuto las pruebas de rspec para mi aplicación Rails se tarda una eternidad y un día de sobrecarga antes de que realmente comience a ejecutar las pruebas. ¿Por qué rspec es tan lento? ¿Hay alguna manera de acelerar la carga inicial de Rails o seleccionar la parte de mi aplicación Rails que necesito (por ejemplo, solo material ActiveRecord) para que no cargue absolutamente todo para ejecutar algunas pruebas?¿Por qué RSpec es tan lento en Rails?

Respuesta

22

Debería poder acelerar sus llamadas script/spec ejecutando script/spec_server en una ventana de terminal separada, y luego agregando el parámetro adicional -X a sus llamadas de especificación.

+0

Para ser claros, entonces haría algo como esto: spec --color ./spec -X –

+21

spec_server ahora está en desuso en favor de spork. (http://github.com/timcharper/spork) – austinfromboston

+2

https://github.com/sporkrb/spork - nueva fuente de spork – ted

3

¿Lo está ejecutando a través de Rails? Si es así, la inicialización de RSpec no es lenta, sino de Rails. Rails tiene que inicializar la base de código completa y la suya antes de ejecutar las especificaciones. Bueno, no tiene tiene, pero lo hace. RSpec funciona bastante rápido para mí en mis pequeños proyectos sin rieles.

+0

Gracias por esta respuesta. He aclarado que la pregunta es específica de Rails. –

+0

Entonces sí, sus rieles, no rspec, eso te está ralentizando. –

3

Las pruebas en ejecución pueden ser realmente lentas porque todo el entorno de los rieles tiene que cargarse (pruebe el script/consola) y solo entonces se pueden ejecutar todas las pruebas. Debe usar autotest, que mantiene el entorno cargado y verificará qué archivos edita. Cuando edite y guarde un archivo, solo las pruebas que dependen de ellos se ejecutarán de manera automática y rápida.

2

Si está usando una Mac, recomiendo usar Rspactor sobre autotest, ya que utiliza muchos menos recursos para el sondeo de archivos cambiados que el autotest. No es tanto una versión completa Cacao

RSpactor.app

o la versión joya que mantengo en Github

sudo gem install pelle-rspactor 

Si bien estos no aceleran las pruebas rspec individuales, se sienten mucho más rápido, ya que de auto ejecuta las especificaciones afectadas dentro de un segundo de presionar guardar.

+0

idea interesante, pero el enlace necesita actualización y no parece funcionar con la última rspec. –

+0

Recomiendo usar la versión mislavs ahora. sudo gem install mislav-rspactor – Pelle

1

Si se encuentra en un entorno Windows, es probable que poco se pueda hacer ya que Rails parece iniciarse muy lentamente bajo Windows. Tuve la misma experiencia en Windows y tuve que mover mi configuración a una máquina virtual Linux para que realmente fuera muy rápida (también usaba autotest).

+0

+1. Ejecuto Rails y RSpec en Linux y no tengo quejas de lentitud, aunque en una máquina bastante poderosa. Mi colega usa Windows, en hardware idéntico, y puede llevar un minuto completo cargar el entorno Rails. –

4

¿Por qué rspec es tan lento? porque carga todo el entorno, carga accesorios y todo ese jazz.

¿Hay alguna forma de acelerar la carga inicial de Rails? Podría intentar usar simulaciones en lugar de confiar en la base de datos; esto es realmente correcto para las pruebas unitarias y definitivamente acelerará las pruebas unitarias. Additionnaly utilizando el servidor de especificaciones como mencionado por @Scott Matthewman puede ayudar, lo mismo con la prueba automática de ZenTest mencionado por @Marc-Andre Lafortune

¿Hay una manera de destacar la parte de mi aplicación Rails que necesito (sólo por ejemplo cosas ActiveRecord) por lo no carga absolutamente todo para ejecutar algunas pruebas? qué pasa con esto

rake test:recent 

No estoy seguro de cómo la tarea rspec integrar con esto, pero que sin duda podría utilizar la tarea test: reciente como plantilla para hacer lo mismo con las pruebas si el rspec.

rake test:rspec:recent 

aún no existe

+0

Hay una nueva herramienta de autotest para ruby: Infinity test @ http://github.com/tomas-stefano/infinity_test – Jean

+0

@Scott ¿qué estás secundando y por qué? – rogerdpack

4

porque se carga todo por el planeta, carga accesorios y todo ese jazz.

El verdadero culpable es si lo ejecuta usando rake spec, it runs the db:test:prepare task.

Esta tarea descarta toda la base de datos de prueba y la vuelve a crear desde el principio. Esto me parece ridículo, pero eso es lo que hace (lo mismo sucede cuando ejecuta rake:test:units, etc.).

Puede solucionar este problema fácilmente usando la aplicación spec que rspec instala como parte de la gema rspec.

De esta manera:

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

Al soltar la base de datos y volver a crearla, se garantiza que los datos de los dispositivos se cargan correctamente y que no quedan modificaciones de las ejecuciones anteriores. ejecutar especificaciones directamente no garantiza eso. si vas a depender de la base de datos, debes recrearla desde cero, ¡simular objetos! – Jean

4

Creo que la experiencia "zen" que busca es ejecutar spec_server y autospec en el fondo, con el resultado de las pruebas casi instantánea cuando se guarda un archivo.

Sin embargo, tengo problemas para comunicarme con estos dos programas.

He encontrado una explicación here:

me he dado cuenta de que autotest no envía comandos al spec_server. En su lugar, vuelve a cargar todo el entorno de Rails y los complementos de su aplicación cada vez que se ejecuta. Esto hace que el autotest se ejecute significativamente más lento que el servidor de secuencias de comandos, porque cuando ejecuta el comando script/spec las especificaciones se envían al servidor_especificado que ya tiene encendido su entorno Rails y está listo para funcionar. Si instala un nuevo complemento o algo así, entonces tendrá para reiniciar el servidor_especificador.

Pero, ¿cómo solucionamos este problema? Supongo que implicaría descargar ZenTest y cambiar el código para el programa autotest, pero no tengo tiempo para probarlo en este momento.

2

A partir de rspec-rails-1.2.7, spec_server está en desuso en favor de la gema spork.

2

La razón principal es que require toma para siempre en windows, por alguna razón.

Consejos para acelerar: spork ahora funciona con Windows, creo.

Usted puede tratar de "faster_require", que almacena en caché ubicaciones:

http://github.com/rdp/faster_require

GL. -rp

32

Definitivamente, sugiero echar un vistazo a spork.

http://spork.rubyforge.org/

El railstutorial refiere específicamente a esto, y da una solución para conseguir spork funcionando muy bien en raíles 3.0 (a partir de este momento, no es spork carriles 3 dispuestos fuera de la caja). Por supuesto, si no estás en los rieles 3.0, entonces deberías estar listo para ir.

La parte del tutorial que muestra cómo conseguir spork correr en carriles de 3.0

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

registrarse cuando es spork carriles 3.0 listos

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

+1

Spork me ha funcionado muy bien, ha vuelto a hacer las pruebas divertidas. –

+0

Solo hay un detalle que vale la pena mencionar con respecto a spork: no se ejecuta en Windows. – lampak

Cuestiones relacionadas