h1. Testing
h2. Testing con cucumber+capybara
Actualmente usamos para correr test una serie de gemas que están incluidas en :
config/environments/cucumber.rb
Los tests se corren con
rake cucumber
h3. Etiquetado de tests
con @wip (work in progress) podemos etiquetar ciertos tests que queremos correr con
rake cucumber:wipignorando el resto de tests. Así es más rápido el testing durante el desarrollo de estos.
@wip @selenium Escenario: Borrar un usuario
Con
rake cucumber:okejecutamos todos los tests menos los etiquetados con @wip.
Con @selenium etiquetamos tests que queremos correr con selenium.
h3. Desarrollo de tests
Para desarrollar test, se comienza editando un fichero
feature/controlador.feature
Un ejemplo de test sería:
   Escenario: Sumar dos números
     Dado que he introducido 1 en la calculadora
     Y que he introducido 2 en la calculadora
     Cuando oprimo el igual
     Entonces el resultado debe ser 3 en la pantalla
Una vez escrito lo que esperamos que suceda, corremos
rake cucumber(o simplemente "cucumber") y como salida, nos va a mostrar el código:
Dado /^que he introducido (\d+) en la calculadora$/ do |arg1|                                                                                                 
  pending # express the regexp above with the code you wish you had                                                                                           
end                                                                                                                                                           
                                                                                                                                                              
Cuando /^oprimo el igual$/ do                                                                                                                                 
  pending # express the regexp above with the code you wish you had                                                                                           
end                                                                                                                                                           
                                                                                                                                                              
Entonces /^el resultado debe ser (\d+) en la pantalla$/ do |arg1|                                                                                             
  pending # express the regexp above with the code you wish you had                                                                                           
end   
Esto es lo que tenemos que programar en
features/step_definitions/controlador_steps.rb
Digamos que son como expresiones regulares que indica los pasos que debe hacer cada feature. Por ejemplo, este paso pulsa en la sección:
Cuando /^pulso en la sección (.*)$/ do |seccion| click_link seccion end
h3. Organización del código de tests
features/*.features features/step_definitios/*rb
Por defecto se cargan todos los pasos de
features//es decir, no es necesario incluir unos ficheros de pasos en otros.
Se pueden anidar steps de esta forma:
Cuando /^pulso en la sección (.*)$/ do |seccion|
  click_link seccion
end
(...)
Cuando /^me autentico y voy a la sección (.*) y controlador (.*)$/ do |seccion,controlador|
  Cuando "entro como usuario admin/admin"
  Cuando "pulso en la sección #{seccion}"
  Cuando "pulso en el controlador #{controlador}"
end
Atención a las comillas de los steps anidados.
h3. Más sintaxis
Equivalencias ingles-español en cucumber (que a veces se olvida):
cucumber --i18n es help
      | feature          | "Característica"        |
      | background       | "Antecedentes"          |
      | scenario         | "Escenario"             |
      | scenario_outline | "Esquema del escenario" |
      | examples         | "Ejemplos"              |
      | given            | "* ", "Dado "           |
      | when             | "* ", "Cuando "         |
      | then             | "* ", "Entonces "       |
      | and              | "* ", "Y "              |
      | but              | "* ", "Pero "           |
      | given (code)     | "Dado"                  |
      | when (code)      | "Cuando"                |
      | then (code)      | "Entonces"              |
      | and (code)       | "Y"                     |
      | but (code)       | "Pero"                  |
h3. Factories: cargar datos de forma fácil
Con cucumber_factory se puede cargar datos de forma sencilla (ver "Dados unos datos básicos" en features/gong_steps.rb)
h3. Resolución de problemas
Cositas que pasan...
h4. Selenium y chromium
Cuando se corren tests con selenium (es algo más pesado y lento así que se debería evitar en lo posible) hay que hacer un enlace del tipo
ln -s /usr/bin/chromium-browser /usr/bin/google-chrome
También se puede probar con firefox pero los tests son más lentos aún. Se recomienda crear un profile (-ProfileManager) que se llame "selenium" e instalar allí el webdriver, firebug y otras extensiones de interés.
h4. Capturas html cuando hay problemas
Se puede marcar un paso con
save_and_open_pagelo cual guarda el html de la página actual y permite editar. Esto facilita ver el código actual, los ids, etc, para ver que puede fallar. Los ficheros se encuentran
tmp/capybara/
También puedo usar "Entonces haz una captura" junto con @selenium para ver una captura real (es un pelín lento).
h4. Informes html
Se pueden tener unos lindos listados de esta forma:
cucumber --format html --out report.html firefox report.html
h3. Links
- https://github.com/jnicklas/capybara
- https://github.com/smparkes/capybara-envjs
- http://github.com/aslakhellesoy/cucumber-rails
- https://github.com/makandra/cucumber_factory
- https://github.com/aslakhellesoy/cucumber/wiki/Cucumber-Backgrounder
- https://github.com/aslakhellesoy/cucumber/wiki/Autotest-Integration
- https://github.com/aslakhellesoy/cucumber/wiki/Feature-Introduction
- https://github.com/aslakhellesoy/cucumber/wiki/Step-Argument-Transforms
Modos para tu editor preferido:
Rdocs:
- http://www.rdoc.info/github/aslakhellesoy/cucumber/master/frames
- http://www.rdoc.info/github/jnicklas/capybara/master/frames
h2. Adevertencia para la instalación entorno (ubuntu 9.04)
Para que pueda funcionar capybara:
sudo apt-get install libxslt-dev libxml2-dev
Y para que pueda funcionar la captura de pantallas:
sudo apt-get install scrot