jueves, 30 de julio de 2009

Parametrizar un test JUnit

Supongamos que queremos ejecutar un test varias veces con distintos valores. Una opción podría ser algo como lo siguiente:

package es.gmr.test;

import java.util.Arrays;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import junit.framework.Assert;

public class TestParametrizar {

private List<Integer> datos;

@Before
public void setUp() throws Exception {
this.datos = Arrays.asList(2, 4, 5, 6);
}

@Test
public void test() {
for (final Integer num : this.datos) {
testEsPar(num);
}
}

public void testEsPar(final Integer x){
Assert.assertEquals(x + " no es un número par", 0, (x % 2));
}
}

Lo malo de esta opción, es que si la ejecutamos (desde Eclipse por ejemplo) veremos lo siguiente:

Es decir, si uno de los valores del listado no supera el test, no se continuará con los siguientes. Para evitar esto, JUnit 4 nos permite generar parámetros para lanzar varias veces un test con dichos parámetros. Para ello, primero deberemos anotar nuestra clase con @RunWith(Parameterized.class). También tendremos que tener un método anotado con @Parameters, que será el encargado de generar la lista de parámetros. Por último, la clase debe tener un constructor con un argumento del tipo de los parámetros, ya que cada vez que se lance un test, se llamará a este constructor para inicializar el parámetro. Con todo esto, obtenemos el siguiente test:

package es.gmr.test;

import java.util.ArrayList;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import junit.framework.Assert;

@RunWith(Parameterized.class)
public class TestParametrizar {

private final Integer num;

public TestParametrizar(final Integer x) {
this.num = x;
}

@Parameters
public static Collection<Integer[]> init() throws Exception {
final Collection<Integer[]> datos = new ArrayList<Integer[]>();
datos.add(new Integer[] {2});
datos.add(new Integer[] {4});
datos.add(new Integer[] {5});
datos.add(new Integer[] {6});
return datos;
}

@Test
public void test() {
Assert.assertEquals(this.num + " no es un número par", 0, (this.num % 2));
}
}

Ahora, se lanzarán tantos tests como parámetros hayamos definido, y el resultado sería algo así:

Vemos que cada parámetro hace que se ejecute un test, y aunque con uno de ellos el test falle, se sigue tratando lo siguientes.

domingo, 26 de julio de 2009

Ser lider (I)

Ya hace bastante que no dedico un rato a escribir algo por aquí, y con varios temas en mente a la espera de tiempo, hoy me voy a poner a ello.

En esta entrada simplemente voy a hacer referencia a dos artículos que a mí personalmente me han hecho reflexionar bastante. El primero es de José Manuel Beas, punto de referencia obligado para todos los que intentamos saber algo sobre metodologías ágiles. Al final del artículo "Liderar mediante el ejemplo" (que recomiendo leer) deja la siguiente reflexión:

Si en tu día a día crees que los demás deberían hacer las cosas de otra manera y estás convencido de que las cosas no se pueden cambiar, quizás podrías intentar seguir el ejemplo de Martin Fowler y liderar mediante el ejemplo

Hay que ser realmente bueno para poder cambiar la filosofía de un equipo con un simple gesto. A mí me hizo pensar como personas como Fowler, pueden hacer cosas grandes con gestos pequeños. Aunque luego José Manuel me contaba (cuando le comenté que iba a hacer referencia a su artículo, hace ya bastante tiempo :S ) que la historia no era realmente así (luego lo explicaba aquí y aquí) yo me sigo quedando con la idea principal, con el hecho de que si creemos realmente en algo y recorremos con paso firme ese camino puede que al final nos acaben siguiendo.

Y si se leen el artículo, decir que la lectura "Reluctant Leader, Reluctant Follower" que recomienda José Manuel es realmente interesante. Yo ya me he dejado una frase anotada en mi lista de citas:

"... like a river—adapting to the rocks but always flowing down hill"

El otro artículo puede ser algo más polémico. Hace más o menos una semana, Leonardo De Seta escribió un artículo titulado "Necesitamos matar a las vacas sagradas". No quiero ni imaginar lo difícil que debe ser para alguien, cuestionar la utilidad de un miembro de su equipo dentro del mismo. Imagina que te toca a ti, y le debes decir a un compañero al que conoces hace años que no está aportando gran cosa al equipo y debes prescindir de él; o se lo debes decir a alguien que te saca años de experiencia, o que lleva más tiempo que tú en la empresa/organización, ... Como dice el autor:

"Pero no es fácil sacar a la luz a nuestras propias vacas sagradas. Suelen ser sagradas por algún motivo (aunque no suele ser muy bueno), y quienes se atrevan a señalar a esta vaca seguramente se encontrarán con rechazo de quienes intentan proteger el pasado de la institución."

En el artículo, hay una frase que me ha gustado bastante, y creo que esta filosofía nos ayudaría/empujaría a todos a mejorar cada día:

"Las organizaciones tiene que creer que si cualquier valor, creencia, proceso, política o mantra corporativo es lo suficientemente valioso para tenerlo, también debería ser lo suficientemente fuerte como para ser desafiado"