miércoles, 11 de noviembre de 2009

JUnit 4.7: @Rule

En mi empresa nos estamos tomando bastante enserio el tema de los tests, así que he dedicado algunos ratos libres a buscar herramientas que nos ayuden en esta tarea. Entre otras cosas, he leído sobre la versión 4.7 de JUnit, y descubrí una característica bastante interesante. Para presentarla, voy a seguir un ejemplo que probablemente haga que se les ponga los pelos de punta a muchos, pero creo que es un ejemplo bastante sencillo y claro.

Supongamos que tenemos una batería de test, y de alguna forma queremos hacer que ciertos tests se ejecuten los días pares y el resto los impares. Lo primero es definir una nueva anotación para poder anotar en los test si se deben ejecutar los días pares o los impares.

package es.gmr.junit;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface DateAnnotation {
  boolean ejecutarDiasPares() default true;
}


Esta nueva funcionalidad de JUnit, requiere que creemos una clase que implemente la interfaz MethodRule. Esta clase interceptará las llamadas a los métodos del test y realizará las acciones convenientes, que en nuestro caso es ejecutar el método si se cumple la condición adecuada (día par o impar).

package es.gmr.junit;

import java.util.Calendar;

import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;

public class ManejadorEjecucion implements MethodRule {
  @Override
  public Statement apply(Statement stament, final FrameworkMethod frameworkMethod, final Object obj) {
    return new Statement() {
        @Override
public void evaluate() throws Throwable {
DateAnnotation dateAnnotation = frameworkMethod.getAnnotation(DateAnnotation.class);
if (dateAnnotation == null) {
frameworkMethod.invokeExplosively(obj);
else {
Calendar calendar = Calendar.getInstance();
boolean hoyEsPar = calendar.get(Calendar.DAY_OF_MONTH== 0;
boolean ejecutarDiasPares = dateAnnotation.ejecutarDiasPares();

if hoyEsPar && ejecutarDiasPares || !hoyEsPar && !ejecutarDiasPares){
frameworkMethod.invokeExplosively(obj);
}
}
            }
        };
}
}



Por último, en la clase donde se implementan los test, debe haber declarada una variable pública del tipo de la clase que hemos implementado en el punto anterior (ManejadorEjecucion) y anotada con @Rule.

package es.gmr.junit;

import org.junit.Rule;
import org.junit.Test;

public class TestPruebas {

  @Rule
  public ManejadorEjecucion manejadorEjecucion = 
    new ManejadorEjecucion();

  @Test
  @DateAnnotation(ejecutarDiasPares = true)
  public void diasParesTest(){
    System.out.println("Hoy es par");
    // ...
  }

  @Test
  @DateAnnotation(ejecutarDiasPares = false)
  public void diasImparesTest(){
    System.out.println("Hoy es impar");
    //...
  }
}



Al ejecutar, veremos que hoy sólo se lanzará el test diasImparesTest.

Como comentaba al principio, esto es sólo un ejemplo para "jugar" con esta anotación. He estado haciendo pruebas para crear mocks, o probar concurrencia, pero son ejemplos que seguro que se llevarían muchas más líneas.

martes, 3 de noviembre de 2009

¿Cómo hacerlo posible?

Desde que empecé a interesarme por las metodologías ágiles, he leído varias veces que la gente habla de un problema recurrente: el rechazo al cambio.

Para poder entrar en estas metodologías se requiere un cambio importante, ya que debemos modificar la forma de pensar, organizarnos, realizar las tareas, enfocar los objetivos, etc. Todo esto sumado a un considerable esfuerzo orienado a la formación, ya que se hacen imprescindibles ciertas herramientas y se deben aplicar nuevas metodologías de programación.

Personalmente creo que el primer error en este camino es preguntarnos si es posible el cambio en nuestro equipo. Puede que lleve poco tiempo en el negocio como para que mi forma de pensar se haya amoldado a la realidad, y por eso yo creo que la respuesta a esta pregunta es SÍ, por lo que sobra.

Nos solemos encontrar con el típico problema del tiempo, pero debemos ser realistas, y pensar que nuestros días tienen las mismas horas que los del resto de las empresas, sobre todo aquellas situadas en países en los que, con bastante ventaja sobre nosotros, estas metodologías se han impuesto con excelentes resultados. No se trata de experimentar, estamos hablando de algo que ha demostrado su valor. Por todo esto, cada vez que debamos plantear un cambio que nos haga mejorar, creo que se debería cambiar la pregunta ¿es posible? por esta otra: ¿cómo lo hago posible?.

Si crees que esto que he dicho no tiene mucho sentido, piensa por un momento si como usuario de un metro, podrías cambiar la forma de pensar del resto de usuarios para que en vez de saturar las escaleras mecánicas prefirieran subir y bajar caminando. O hacer cambiar la mentalidad de los usuarios de un parque, para que hagan uso de las papeleras... ¿Parece imposible verdad? La gente de "The fun Theory", una iniciativa que recomiendo seguir, probablemente no se preguntaron si era posible, simplemente pensaron en cómo hacerlo.




De vuelta...

Tras varias semanas moviditas, ya casi puedo dar por finalizado uno de los proyectos más importantes a los que me he enfrentado: comprar mi propio piso y mudarme. Mi novia y yo no pensábamos que conllevara tanto trabajo. Nos decidimos por un piso que estaba completamente vacío, así que tuvimos que invertir bastante tiempo en comprar los electrodomésticos, luces, muebles, camas, etc., etc., etc.

En un equipo de dos personas, ambos pasamos por todos los roles: electricistas, albañiles, pintores, carpinteros, ... ;) Y sumando, al final nos damos cuenta de que hemos invertido muchas horas.

En cuanto al papeleo, es otro tema que se llevó su tiempo. Probablemente haya un arbolito menos por nuestra culpa :S

Pero ya CASI todo está en su sitio, y por fin las cosas volverán a la normalidad. Actualizar el blog es una de tantas tareas que he tenido que dejar de lado, pero espero volver a retomarla. Intentaré que el contenido vaya mejorando, y ser constante. De momento, he cambiado la imagen (etapa nueva, look nuevo) y por lo menos ya hay una referencia a quién escribe "About", que ya han sido varias las personas que me han comentado que debería estar. Aunque me queda como tarea pendiente actualizar mi CV, ya que según lo que consta en él, todavía trabajo en la empresa que dejé hace más de un año :S