Forrest, un runner para stories con rails
Monday, 22 March , 2010
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!
Autotest desde linux como en una Mac
Sunday, 17 February , 2008
Mirando algunos videos de rspec y autotest, noté que al correr los tests, en la pantalla de la notebook del video salían unos hermosos mensajes con transparencias, investigando un poco encontré que esto se hace con un programa llamado growl que sólo viene para usuarios de Mac OS X :( luego de tal desilusión comencé a buscar una alternativa en GNU/Linux … sí! hay un programa llamado aosd_cat que sirve para mostrar mensajes de texto UTF8 en la pantalla, vamos al grano:
apt-get install aosd_cat
Para probarlo podemos abrir una consola y ejecutar:
echo "Probando..." | aosd_cat --back-color=black \
--fore-color=red \
--back-opacity=135 --padding=50
Ahora vamos a configurar autotest para que use aosd_cat
editamos el archivo ~/.autotest y ponemos lo siguiente:
module Autotest::Growl
def self.aosd_cat title, msg, color
params = "--back-color=black --fade-in=20 --fade-out=100 \
--fore-color=#{color} --back-opacity=200 \
--padding=30 \ --shadow-offset=0 \
--x-offset=0 --y-offset=0"
system "echo \"#{title} #{msg} \" | aosd_cat #{params}"
end
Autotest.add_hook :run do |at|
aosd_cat "Autotest running", "Started", "Orange"
end
Autotest.add_hook :ran_command do |at|
results = [at.results].flatten.join("\n")
output = results\
.slice(/(\d+)\s+examples?,\s*(\d+)\s+failures?(,\s*(\d+)\s+pending)?/)
if output
if $~[2].to_i > 0
aosd_cat "FAIL !!!", "#{output}", "red"
else
color = output =~ /[1-9]\spending?/ ? "yellow" : "green"
aosd_cat "Pass", "#{output}", "#{color}"
end
end
end
Listo, ya podemos usar autotest y ver los mensajes como en una mac ;)
autotest path-al-proyecto/
Les dejo un screencast para que vean como quedó.
