miércoles, 27 de febrero de 2013

BDD con Cucumber y Java 2/2

Ya vimos en la primera parte de este post como un escenario puede ser especificado y usado por un desarrollador para dirigir sus desarrollos. Normalmente estos escenarios serán escritos por algún agente externo al desarrollo y podrán ser usados para validar la aplicación en cuestión. La parte importante es que en determinadas aplicaciones un agente puede escribir cientos de escenarios diferentes y el validar cada uno de estos después del desarrollo puede llegar a ser una tarea bastante compleja. Es aquí donde entra en juego la automatización de estos escenarios con la ayuda de Cucumber.

Como ya habiamos descrito BDD esta definido en escenarios que describen el comportamiento deseado. Estos escenarios serán escritos en archivos .feature en cucumber. Cucumber framework permite la integración de muchos lenguajes naturales para escribir el comportamiento, lo que nos permite describir comportamientos en muchos de las lenguas mas utilizadas en el mundo. Un ejemplo de un archivo .feature seria el siguiente.


# language: es
Característica: Calculator ops

Background:
 Dado Ejecuto Limpiar la Calculadora

@calculadora
Escenario: Probar suma
 Cuando escribo 2 en la calculadora
 Y presiono la tecla +
 Y escribo 5 en la calculadora
 Y presiono la tecla =
 Entonces El resultado sera 7
Las etiquetas que se definen sobre cada escenario definen un punto de entrada para la ejecución de las instrucciones. Por cada ejecución de Cucumber-jvm se puede definir una etiqueta la cual ejecutara el o los escenarios marcados y por lo tanto las pruebas correspondientes.

En Cucumber como en todos los lenguajes de programación nada es echo por arte de magia. Por lo tanto Cucumber necesita saber como interpretar las instrucciones en español (en este caso) o en el lenguaje que seleccionamos y ejecutar las tareas determinadas. A esto se le llama "glue code" o código de pegamento. Este código puede ser escrito en varios lenguajes de programación. Cucumber-jvm es tan robusto que acepta varios lenguajes de programación entre ellos: Java, Groovy, JRuby, Cloujure, y mas. Para este ejemplo escribiremos una clase Java que contendrá el código de pegado y la cual se vera mas o menos así.


public class CalculadoraStepDef {

  Calculadora calc = new Calculadora();
  
  @Dado(value="^Ejecuto Limpiar la Calculadora$")
  public void I_reset_the_calculator() throws Throwable{
    calc.reset();
  }
  
  @Cuando(value="^escribo (\\d+) en la calculadora$")
  public void I_add_to_the_calculator(int number) throws Throwable{
    calc.escribirDigito(number);
  }
  
  @Cuando(value="^presiono la tecla (.?)$")
  public void I_press_key(String key) throws Throwable{
    if ("+".equalsIgnoreCase(key)){
      calc.setOperacion(OPERACIONES.SUMA);
    }else if ("-".equalsIgnoreCase(key)){
      calc.setOperacion(OPERACIONES.RESTA);
    }else if ("*".equalsIgnoreCase(key)){
      calc.setOperacion(OPERACIONES.MULTIPLICACION);
    }else if ("/".equalsIgnoreCase(key)){
      calc.setOperacion(OPERACIONES.DIVISION);
    } else if ("=".equalsIgnoreCase(key)){
      
      if (calc.getOperacion() != null){
        calc.ejecutarOperacion();
      }else{
        calc.setOperacion(OPERACIONES.IGUAL);
      }
      
    }
  }
  
  @Entonces(value="^El resultado sera (.*)$")
  public void result_should_be(double number) throws Throwable {
    Assert.assertEquals(number, calc.getTotal());
  }
  
}


Como se puede observar la clase contiene expresiones regulares las cuales corresponden a los escenarios que definimos anteriormente. Este es el código que hace el trabajo pesado y lleva a cabo las pruebas que se definieron en los archivos feature. Las anotaciones que se encuentran el cada método definen que método de esta clase debe de ser ejecutado cuando un paso de cada escenario es interpretado en el archivo feature.

Por ultimo solo es necesario decirle a Cucumber-jvm que se ejecute. El framework Cucumber-jvm cuenta con varias maneras de ejecución. Una es vinculando la ejecución con una Prueba JUnit. Otra es ejecutando la clase Main (cucumber.api.cli.Main) con los parámetros correspondientes. Esto es lo que nosotros realizaremos en este ejemplo al vincular la ejecución de esta clase con la fase de pruebas de un proyecto maven. Lo que se tiene que hacer es vincular el plugin de Java Execution en nuestro archivo pom.xml como se muestra abajo. Una vez que tengamos nuestro archivo pom correctamente configurado solo sera necesario ejecutar en nuestra consola mvn clean test y nuestras pruebas de Comportamiento se ejecutaran automaticamente.



org.codehaus.mojo
exec-maven-plugin
1.2.1


test

exec


java

-Xms512M
-Xmx1024M
-XX:MaxPermSize=512M
-classpath

cucumber.api.cli.Main
features/
--glue
com.bestbuy.test.cucumber_test
--tags
@calculadora/argument>
--format
pretty






Este articulo formado por dos partes es un poco largo y técnico mas sin embargo espero y les sea de utilidad. Como siempre pongo a disposición un link a mi repositorio de github (https://github.com/ti3r/cucumber-tests) donde pueden descargar, modificar, actualizar y jugar con el código que hemos desarrollado en este ejemplo. Cualquier cosa que no este clara no duden en dejar su comentario en el blog o escribirme un correo personal, siempre tratare de ayudar lo mas posible. Si también lo desean pueden agregarme a sus círculos en Google+.

Saludos a todos y gracias por leer.




No hay comentarios:

Publicar un comentario