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.




BDD con Cucumber y Java 1/2

En esta ocasión me voy a salir un poco del tema habitual de Android y celulares, en mi trabajo hemos estado un bastante ocupados y me pareció una buena oportunidad para hablarles sobre como hacer pruebas de comportamiento usando Java y Cucumber usando el framework (cucumber for jvm). Primero que nada durante el desarrollo de software es muy importante realizar la mayoría de pruebas posibles sobre tu código para asegurar la calidad, no mencionare las diferentes ideas y metodologías que existen sobre desarrollo y prueba de software ya que no es la finalidad de este articulo, cada equipo y/o desarrollador es responsable de como manejar su ciclo y asegurar que su aplicación no falle horriblemente.

Dentro de las diferentes técnicas de desarrollo de software; BDD (Behavior Driven Development) o desarrollo basado en comportamiento, se ha vuelto muy popular en varios proyectos de software grandes. Esta técnica complementa muy bien a la metodología ágil y TDD (Test Driven Development) las cuales son la forma y técnicas mas populares de desarrollar software en la actualidad (a mi parecer). Primero una poca de explicación sobre lo que es BDD. Como el nombre en ingles lo dice, este desarrollo se centra en el comportamiento de las cosas; basándose en que el modulo es una caja negra para el usuario. Esto quiere decir que el comportamiento se evalúa de acuerdo a las salidas que este presenta basado en determinadas entradas. En pocas palabras es describir el comportamiento y asegurarse que este comportamiento sea cumplido. La finalidad es que estos escenarios de comportamiento sean escritos por un agente externo, como un business user o un usuario avanzado, en su propio lenguaje (sin necesidad de un lenguaje de programación) y que estos comportamientos se prueben automáticamente en cierto punto del desarrollo.

Cuando iniciemos el desarrollo tendremos una lista de escenarios escritos por nuestro agente los cuales describirán los puntos a considerar para marcar el desarrollo como éxito o fracaso. Por ejemplo digamos que estamos escribiendo un programa que imite a una calculadora. Nuestro agente podría decir para que una calculadora sea efectiva debe de sumar, restar, multiplicar y dividir correctamente, por lo tanto nuestro usuario nos daría una lista de escenarios parecida a esta:

Escenario: Probar suma Escenario: Probar resta
Cuando escribo 2 en la calculadora Cuando escribo 5 en la calculadora
Y presiono la tecla + Y presiono la tecla -
Y escribo 5 en la calculadora Y escribo 2 en la calculadora
Y presiono la tecla = Y presiono la tecla =
Entonces El resultado sera 7 Entonces El resultado sera 3

Como se puede ver no es necesario ningún lenguaje de programación, nuestro agente puede especificar cualquier numero de escenarios y en cualquier formato (siempre y cuando siga algún tipo de regla que re pueda programar). Si estos pasos se cumplen al momento de ejecutar nuestra calculadora podemos decir que nuestro código ha sido exitoso.

Vean la segunda parte de este articulo para saber como utilizar Behavior Driven Development (BDD) con Cucumber y Java.