Ir al contenido principal

Cucumber en Java

Cucumber en Java

Cucumber es una herramienta software utilizada para la ejecución de pruebas automáticas escritas siguiendo los principios del desarrollo guiado por el comportamiento (BDD). El enfoque central de Cucumber es su analizador en lenguaje natural llamado Gherkin. Gracias a él se pueden especificar los comportamientos esperados en un lenguaje fácil de comprender por los clientes.
Cucumber fue escrito originalmente en Ruby, pero es compatible con una variedad de lenguajes de programación diferentes a través de varias implementaciones, incluida Java.

El lenguaje Gerkin

Gherkin es un lenguaje que define la estructura y una sintaxis básica para la descripción de las pruebas que pueden ser entendidas tanto por los integrantes técnicos del equipo como así también por los representantes del área de negocio. De esta manera mientras se generan pruebas se está generando documentación viva que describe perfectamente cómo se comporta el sistema enriqueciendo y manteniendo la documentación. Así, entre las ventajas que nos proporciona usar validaciones escritas en Gherkin estarían:
  • Fáciles de leer
  • Fáciles de entender
  • Fáciles de Parsear
  • Fáciles de discutir
Lo bueno de Gherkin es que para empezar a hacer BDD sólo nos hace falta conocer unas pocas palabras, con las que construiremos sentencias con las que vamos a describir las funcionalidades. Además Gherkin está localizado en más de 60 idiomas, y marcando el fichero con la etiqueta # language: es se podrán usar dichas palabras en el idioma de las áreas de negocio.
  • Feature (Caracteristica): Indica el nombre de la funcionalidad que vamos a probar. Debe ser un título claro y explícito. Incluímos aquí una descripción en forma de historia de usuario: “Como [rol ] quiero [ característica ] para que [los beneficios]”. Sobre esta descripción empezaremos a construir nuestros escenarios de prueba.
  • Scenario (Escenario): Describe cada escenario que vamos a probar.
  • Background (Antecedentes): permite definir precondiciones para cada uno de los escenarios a correr y así no ser repetitivos y focalizar los escenarios en la prueba específica.
  • Given (|Dado|Dada|Dados|Dadas): Provee contexto para el escenario en que se va a ejecutar el test, tales como punto donde se ejecuta el test, o prerequisitos en los datos. Incluye los pasos necesarios para poner al sistema en el estado que se desea probar.
  • When (Cuando): Especifica el conjunto de acciones que lanzan el test. La interacción del usuario que acciona la funcionalidad que deseamos testear.
  • Then (Entonces): Específica el resultado esperado en el test. Observamos los cambios en el sistema y vemos si son los deseados.
  • But (Pero) o And (Y): Añade condiciones adicionales a los tres anteriores (Given, When o Then).
Gherkin es un lenguaje que usa el indentado para definir la estructura, de manera que los saltos de línea dividen las diferentes declaraciones, la mayoría de las líneas empiezan con palabras clave.
    Característica: Servir café
        El café no se debe servir hasta que se pague
        El café no se debe servir hasta que se haya pulsado el botón
        Si no queda café entonces el dinero debe ser devuelto
        Antecedentes:
            Dado que estoy frente a la maquina de café
            Y tengo 1$ para depositar
        Escenario: Comprar último café
            Dado que hay 1 café que quedan en la máquina
            Y he depositado 1 $
            Cuando presiono el botón de café
            Entonces 1 café debería ser servido
También es posible definir un esquema de escenario (Scenario Outline). Con ello se agrupa un escenario parametrizado, y un conjunto de valores.
    Esquema del escenario: Comprar último café
        Dado que hay <CafeRestante> café que quedan en la máquina
        Y he depositado <MontoADepositar> $
        Cuando presiono el botón de café
        Entonces <CantidadDeCafeARecibir>café debería ser servido
    Ejemplos:
        |CafeRestante|MontoADepositar|CantidadDeCafeARecibir|
        |      1     |       1       |          1           |
        |     99     |      99       |         99           |
De esa forma, en el ejemplo anterior se está indicando dos escenarios, uno con 1 café y 1$, y otro con 99 cafés y 99$.

JUnit y Cucumber

Ejecutar un conjunto de pruebas es trivial:
import org.junit.runner.RunWith;
import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;

@RunWith(Cucumber.class)
@CucumberOptions()

public class TestRunner {
}
En Cucumber options se indica el directorio con los ficheros de características escritos con Gherkin, y poco más.
Las clases de Cucumber se encargaran de buscar métodos anotados con @When, @Given, @Then… y traducirá automáticamente los escenarios de Gherkin en llamadas a esos métodos. Esos métodos anotados son llamados Steps o Pasos.
package CucumberJava; 

import cucumber.annotation.en.Given; 
import cucumber.annotation.en.Then; 
import cucumber.annotation.en.When; 

public class cucumberJava {
   int cantidad_cafe;
   int cantidad_dinero;
   int cafe_esperado;

   @Given("^que hay (\\d+) café que quedan en la máquina$") 
   public void cafe_en_la_maquina(int cafe) { 
     cantidad_cafe = cafe;
   }
   @Given("^ he depositado ( \\d+) \\$") 
   public void dinero_depositado(int dinero) { 
     cantidad_dinerio = dinero;
   } 
   @When("^presiono el botón de café$") 
   public void presiono_el_boton_de_cafe() { 
     cafe_esperado = Math.min(cantidad_cafe, cantidad_dinero);
   } 
   @Then("^(\\d+) café debería ser servido$") 
   public void cafe_servido(int cafe) { 
     Assert.equals(cafe, cafe_esperado);
   } 
}

Comentarios