10 segundos es mucho tiempo para que se ejecute una sola prueba. Mi intuición es que su objetivo de especificaciones está ejecutando pruebas unitarias y de integración al mismo tiempo. Esto es algo típico en lo que caen los proyectos y, en algún momento, deberá superar esta deuda técnica si desea producir más y más rápido. Hay una serie de estrategias que pueden ayudarlo a hacer esto ... y recomendaré algunas que he usado en el pasado.
1. Unidad separada de las pruebas de integración
Lo primero que haría es separar la unidad de las pruebas de integración. Puede hacer esto por:
- Moverlos (a carpetas separadas en el directorio de especificaciones) y modificar los objetivos de rake
- Etiquetarlos (rspec le permite etiquetar sus pruebas)
La filosofía es que desea que sus compilaciones habituales sean rápidas; de lo contrario, la gente no estará muy feliz de ejecutarlas a menudo. Así que vuelve a ese territorio. Haga que sus pruebas habituales se ejecuten rápidamente y utilice un servidor de integración continua para ejecutar la compilación más completa.
Una prueba de integración es una prueba que involucra dependencias externas (por ejemplo, base de datos, servicio web, cola y algunos argumentarían que FileSystem). Una prueba unitaria solo prueba el elemento de código específico que desea verificar. Debería ejecutarse rápido (es posible 9000 en 45 segundos), es decir, la mayor parte debería ejecutarse en la memoria.
2. Convertir pruebas de integración en pruebas unitarias
Si la mayor parte de sus pruebas unitarias es más pequeña que su conjunto de pruebas de integración, tiene un problema. Lo que esto significa es que las inconsistencias comenzarán a aparecer más fácilmente. Entonces, a partir de aquí, comience a crear más pruebas unitarias para reemplazar las pruebas de integración. Las cosas que puede hacer para ayudar en este proceso son:
- Utilice un marco burlón en lugar del recurso real. Rspec tiene un marco burlón incorporado.
- Ejecute rcov en su suite de pruebas unitarias. Úselo para medir qué tan completo es su conjunto de pruebas unitarias.
Una vez que tenga las pruebas unitarias adecuadas para reemplazar una prueba de integración, elimine la prueba de integración. Las pruebas duplicadas solo empeoran el mantenimiento.
3. No use accesorios
Los accesorios son malvados. En su lugar, utilice una fábrica (maquinista o robot de fábrica). Estos sistemas pueden crear gráficos de datos más adaptables y, lo que es más importante, pueden crear objetos en memoria que puede utilizar, en lugar de cargar cosas desde una fuente de datos externa.
4. Agregar comprobaciones para evitar que las pruebas unitarias se conviertan en pruebas de integración
Ahora que ha implementado pruebas más rápidas, es hora de realizar comprobaciones para DETENER que esto vuelva a ocurrir.
Hay bibliotecas que parchean el registro activo para arrojar un error al intentar acceder a la base de datos (UnitRecord).
También puede probar el emparejamiento y TDD, lo que puede ayudar a obligar a su equipo a escribir pruebas más rápidas porque:
- Alguien está comprobando, para que nadie se vuelva perezoso
- Una TDD adecuada requiere una respuesta rápida. Las pruebas lentas solo hacen que todo sea doloroso.
5. Utilice otras bibliotecas para solucionar el problema
Alguien mencionó spork (acelera los tiempos de carga para el conjunto de pruebas bajo rieles3), hydra / parallel_tests: para ejecutar pruebas unitarias en paralelo (en varios núcleos).
Esto probablemente debería usarse por ÚLTIMO. Su problema real está en los pasos 1, 2, 3. Resuelva eso y estará en una mejor posición para desplegar infraestructura adicional.