Proyecto

General

Perfil

Testing

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

Etiquetado de tests

con @wip (work in progress) podemos etiquetar ciertos tests que queremos correr con

rake cucumber:wip
ignorando 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:ok
ejecutamos todos los tests menos los etiquetados con @wip.

Con @selenium etiquetamos tests que queremos correr con selenium.

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

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.

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"                  |

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)

Resolución de problemas

Cositas que pasan...

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.

Capturas html cuando hay problemas

Se puede marcar un paso con

save_and_open_page
lo 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).

Informes html

Se pueden tener unos lindos listados de esta forma:

cucumber --format html --out report.html
firefox report.html

Links

Modos para tu editor preferido: Rdocs:

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