Últimamente hemos comenzado a usar Cucumber para realizar los tests funcionales de 3sellers. Cucumber viene con Webrat para simular un navegador. Un problema para nosotros era que Webrat no sabe nada de Javascript, por lo tanto no funciona con AJAX. Habiamos probado usar Selenium, pero aunque funciona mas o menos bien, no me convencía de todo. El último año descubrí Celerity, una gema que ofrece usar HtmlUnit en proyectos de Ruby con una interfaz parecida a Watir. HtmlUnit es un navegador sin la parte gráfica, es decir, carga el HTML, ejecuta el Javascript, simula clicks, manda nuevas peticiónes, pero no abre una ventana para mostrar los resultados. El problema es que como HtmlUnit está implementado en Java, hay que usar JRuby para usar Celerity. Esto puede resultar complicado si tu programa en producción no usa JRuby.
Hace poco descubrí Culerity, una gema que soluciona todos estos problemas. Nos permite usar Celerity sin arrancar 3sellers dentro de un entorno de JRuby. El truco es que Culerity crea otro proceso para arrancar JRuby con Celerity y comunica a traves de DRb. Tu aplicación se queda con el Ruby de siempre, pero en los tests de Cucumber se puede usar la funcionalidad de Celerity.
Para usar Culerity hay que instalar JRuby. Se puede bajar desde la página de descargas de JRuby y la instalación es tan sencilla como descomprimir el archivo y añadir la carpeta jruby-1.3.1/bin al PATH. Luego instalas la gema de Celerity dentro del entorno JRuby. Nosotros usamos la versión mas reciente de celerity que solo existe en Github. Por lo tanto hay que añadir la fuente de gemas de Github.
jruby -S gem sources -a http://gems.github.com
jruby -S gem install jarib-celerity
Con esto la parte de JRuby ya está preparada. Ahora toca preparar la aplicación Rails que quieres testear. Primero instalas las versiones mas recientes de rspec, rspec-rails, cucumber y langalex-culerity. Cucumber y culerity vienen con scripts que preparan la jerarquía de carpetas usado por Cucumber. script/generate cucumber y script/generate culerity crean archivos de soporte dentro de la carpeta features. Como no usamos Webrat, podemos borrar el archivo features/step_definitions/webrat_steps.rb, ya que common_celerity.rb ofrece los mismos steps para usar con celerity. Cucumber por defecto usa su propio RAILS_ENV. Si el generador de Cucumber no te ha actualizado tu database.yml tienes que añadir el codigo para definir la conección a la BBDD.
Cuando has creado un feature, ya se puede probar todo. Un aviso: Para que se efectue el cambio en PATH lo mas fácil es cerrar las consolas que tienes abierto y volver a abrirles. Sin esto, Culerity no puede arrancer el proceso de Celerity. Ahora arrancas el servidor de tu aplicación con script/server -p 3001 -e cucumber. Despues puedes usar cucumber con cucumber features. Culerity va a arrancar un proceso de fondo con JRuby y Celerity, y se conectará al servidor según los pasos que has definido en Cucumber. Aquí otro aviso (algo que me costó algunas horas de descubrir): El entorno RAILS_ENV de cucumber se comporta como el de producción, es decir, cachea todas las clases. Si cambias algo en el codigo, hace falta reiniciar el servidor para ver estos cambios dentro de tus features.
Con todo esto por fin podemos, a parte de los tests de RSpec, testear la aplicación entera, simulando cualquier paso que un usuario normal haría, con AJAX y todo.
