Forrest, un runner para stories con rails

by Gastón Ramos

Estoy trabajando en un proyecto en el cual estamos usando stories como  framework para los tests de aceptación, resulta que me encontré con un pequeño incoveniente: los tests eran un poco lentos y no tenía forma de correr un test para un sólo scenario, si bien como son tests de aceptación o integración sabemos que hay que correrlos todos juntos, a veces cuando hay un error o failure es útil poder correr sólamente ese test y no todos. Entonces comencé a escribir un pequeño script para poder correr un sólo scenario de un story en particular, el script creció un poquito así que decidí crear una pequeña gema que se llama “Forrest” así que les muestro un poquito como funciona, es muy simple:

$ sudo gem install forrest

Successfully installed forrest-0.1.1
1 gem installed
Installing ri documentation for forrest-0.1.1...
Installing RDoc documentation for forrest-0.1.1...
Successfully installed forrest-0.1.11 gem installedInstalling ri documentation for forrest-0.1.1...Installing RDoc documentation for forrest-0.1.1...
$ cd /rails/my-project
$ forrest test/stories/auth-stories-test.rb

+ ClientSiteStoriesTest::TestAsAnAccountIWantToLoginToMyClientSiteSoICanStart
ManagingMyServices
|__ ClientSiteStoriesTest::TestAsAnAccountIWantToLoginToMyClientSiteSoICanStart
ManagingMyServices#test_Given_bad_params
|__ ClientSiteStoriesTest::TestAsAnAccountIWantToLoginToMyClientSiteSoICanStart
ManagingMyServices#test_Given_good_params

Para correr un scenario en particular simplemente copiamos y pegamos uno de las lista impresa más arriba y ejecutamos forrest así:

forrest ClientSiteStoriesTest::TestAsAnAccountIWantToLoginToMyClientSiteSoI
CanStartManagingMyServices#test_Given_good_params

o por ejemplo si estamos buscando un storie en particular podemos usar grep:

$ forrest test/stories/client_site_stories_test.rb | grep -y good_params

|__ ClientSiteStoriesTest::TestAsAnAccountIWantToLoginToMyClientSiteSoICan
StartManagingMyServices#test_Given_good_params

Otra opción es correr todos los scenarios de un story en particular, para esto tenemos que ejecutar forrest con el nombre del story, que también lo podemos copiar del listado impreso
cuando ejecutamos forrest con un archivo de stories como argumento, asi:


forrest ClientSiteStoriesTest::TestAsAnAccountIWantToLoginToMyClientSiteSoICanStart
ManagingMyServices

Otro inconveniente era que cuando había un error se mostraba toda lá página de error de rails lo cual era bastante molesto, con forresto los errores se ven un poquito más lindos:

forrest CustomerStoriesTest::TestAsACustomerIWantToResetMyPasswordIfIForgotItSo
ThatICanRecoverAccessToTheSite#test_Given_an_exisitng_account_email_but_without_
fill_in_the_company
==> Runing scenario...
================================================================================

- As a customer I want to reset my password if I forgot it so that I can recover 
  access to the site 

    Given an exisitng account email but without fill in the company
================================================================================

Finished in 0.061427 seconds.

  1) Error:
NoMethodError: undefined method `closed?' for nil:NilClass...
/usr/lib/ruby/1.8/net/http.rb:1060:in `request'
    /usr/lib/ruby/1.8/net/http.rb:772:in `get'
    lib/active_resource_extensions.rb:77:in `last'
    test/stories/customer_stories_test.rb:9:in `setup'

Cabe destacar que cuando estaba escribiendo forrest me encontré con este bug en rails:
https://rails.lighthouseapp.com/projects/8994/tickets/3153-actioncontrollerintegrationsession-broken-in-234

que si no lo fixean no van a poder usar forrest, por lo menos yo no pude.

Bueno esto fue todo, cualquier sugerencia comenten!