Introducción a test parametrizados con JUnit 4

1
11854

En este tutorial vamos a ver cómo se pueden emplear las capacidades de JUnit 4 para crear tests con asserts que se obtienen de un conjunto de datos.

Índice de contenidos

1. Introducción

En ocasiones en nuestros test realizan múltiples comprobaciones dentro de un mismo test, simplemente para probar diferentes casos lo cual nos lleva a repetir código dentro de nuestros test, por ejemplo:

MultiplyTest.java
package es.autentia.adictosaltrabajo.test;

public class MultiplyTest {
	@Test
    public void givenTwoNumbersShouldBeMultiplyResult() {
        Assert.assertEquals(4, 2*2);
        Assert.assertEquals(6, 3*2);
        Assert.assertEquals(5, 5*1);
        Assert.assertEquals(10, 5*2);
    }

}

Como podemos comprobar en este caso, puede ser tedioso y repetitivo comprobar todos los casos, ante esto, JUnit nos proporciona la característica de test parametrizados.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro Retina 15′ (2.5 Ghz Intel Core I7, 16GB DDR3).
  • Sistema Operativo: Mac OS X El Capitan Versión 10.11.2
  • Entorno de desarrollo: ItelliJ Idea Comunity
  • JUnit 4.12

3. Qué son y cómo funcionan los test parametrizados en JUnit

Para construir test parametrizados, JUnit, utiliza un custom runner que es Parametrized, que nos permite definir los parámetros de varias ejecuciones de un solo test, veamos cómo funciona:

MultiplyTest.java
package es.autentia.adictosaltrabajo.test;

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

@RunWith(Parameterized.class)
public class MultiplyTest {
    @Parameters
    public static Iterable data(){
        return Arrays.asList(new Object[][]{
                {4,2,2},{6,3,2},{5,5,1},{10,5,2}
        });
    }

    private int multiplierOne;
    private int expected;
    private int multiplierTwo;

    public MultiplyTest(int expected, int multiplierOne, int multiplierTwo) {
        this.multiplierOne = multiplierOne;
        this.expected = expected;
        this.multiplierTwo = multiplierTwo;
    }

    @Test
    public void givenTwoNumbersShouldBeMultiplyResult(){
        Assert.assertEquals(expected,multiplierOne*multiplierTwo);
    }
}

¿Bien?¿Alguna duda? Imagino que sí, así que vayamos por partes.
Como vemos al principio tenemos la linea:

	@RunWith(Parameterized.class)

En esta línea lo que indicamos es que vamos a utilizar el runner de Parameterized, que se encargará de ejecutar el test las veces necesarias dependiendo del número de parámetros configurado. Cosa que vamos a hacer en el siguiente bloque:

	@Parameters

La anotación Parameters indica cual es el método que nos va a devolver el conjunto de parámetros a utilizar por el runner. En nuestro ejemplo, un colección de arrays de objetos, que se utilizarán para construir el test cada vez.

Por supuesto ahora lo que necesitamos es un constructor que permita ser inicializado con los objetos que tenemos en cada elemento de la colección

Finalmente, se ejecutará el test como siempre hemos hecho utilizando los datos que hemos recogido en el constructor.

4. ¿Constructor? Inyectando los parámetros.

JUnit, también nos permite en vez de utilizar el constructor, inyectar los parámetros en propiedades de la clase test mediante la anotación @Parameter, para ello, simplemente omitimos el constructor y anotamos nuestras propiedades con @Parameter (deberán ser propiedades públicas).

   @Parameter(value = 0) //El value indica la posición en el array de objeto que se va a inyectar, en caso de no estar indicado el valor por defecto es 0.
   public int expedted;
   @Parameter(value = 2)
   public int multiplierTwo;

5. ¿Con qué caso está trabajando nuestro test?

Para poder identificar de una manera sencilla qué test se está ejecutando en cada momento, JUnit no da la posibilidad de de dar un nombre a la ejecución utilizando la propiedad “name” de la anotación @Parameters, por ejemplo:

	@Parameters(name = "{index}: a*b --> {1}*{2} = {0}")

Donde {index} nos indica la posición del parámetro actual y {0}, {1} , etc… nos indica el valor del parámetro dentro del array de objetos que estamos pasando a la ejecución del test.
En nuestro ejemplo esto nos daría una salida tal que:

resultado_test

6. Conclusiones

Como hemos podido comprobar en este sencillo tutorial, JUnit, nos proporciona una variedad notable de herramientas para facilitar nuestros test, en este caso con la incursión de un runner que nos ayudará a evitar los test repetitivos con parámetros.

7. Referencias

  • Parametrized API reference.

1 COMENTARIO

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad