LupaTwiP (iniciales de "Tests with Parameters" o "Pruebas con Parámetros") es una librería Java para extender las pruebas JUnit. TwiP permite agregar parámetros a los métodos de prueba JUnit de forma simple; luego TwiP llama a los métodos con todas las combinaciones posibles de sus parámetros... o por lo menos un subconjunto razonable de los valores comunes en el caso de los Integers, Strings, etc.

Por ejemplo, TwiP permite invocar repetidas veces a un método que recibe un long, variando los valores del long para cubrir casos frontera y demás.

Un pequeño ejemplo

Vamos a hacer un pequeño ejemplo con JUnit 4.5 y TwiP. Crearemos un método de prueba pruebaConUnLong, el cual recibirá un long como parámetro. Al ejecutar la prueba JUnit, TwiP se encargará de ejecutar varias veces a este método, variando los valores del long.

 
package com.dosideas.twip;
 
import net.sf.twip.TwiP;
import org.junit.Test;
import org.junit.runner.RunWith;
 
@RunWith(TwiP.class)
public class TwipDemoTest_1 {
 
    @Test
    public void pruebaConUnLong(long b) {
        System.out.println(b);
    }
}
 

Si lo ejecutamos, obtendremos lo siguiente por consola: 

1
2
3
0
-1
-2
-3
127
-127
1024
-1024
9223372036854775807
-9223372036854775808

Cada ejecución es contada como una prueba JUnit independiente, con lo cual es facil de mirar reportes e identificar fallos.

TwiP usó una lista predeterminada de valores para el long, e invocó varias veces a nuestro método de prueba. TwiP provee una lista predeterminada de valores para los tipos de datos básicos, como int, long, String, etc.

Probando un String

Vamos a probar un String ahora, y de paso forzaremos a que se incluya el valor "null" en los valores predeterminados. Podemos forzar el uso de un null en el conjunto de pruebas con la anotación @Assume.

 
    @Test
    public void pruebaConUnString(@Assume("=null") String b) {
        if (b != null && b.length() == 1) {
            byte c = b.getBytes()[0];
            System.out.println("ASCII: " + c);
        } else {
            System.out.println(b);
        }
    }
 

En este ejemplo, imprimos por consola el valor ASCII del caracter (cuando es 1 solo) o el String por consola. La anotación @Assume("=null") incluye el valor null en la prueba. El resultado de la corrida: 

ASCII: 32
ASCII: 120
xxx
ASCII: 9
ASCII: 13
ASCII: 10
a string of some length with some arbitrary unicode characters: ? ? ? ? € ? ¬ ? ? ? ? ? ?.
null 

Valores propios

Con la anotación @Values es posible usar valores propios para la invocación en lugar de valores predeterminados: 

 
    public static final String[] MI_STRINGS = {null, "A", "B", "C"};
 
    @Test
    public void pruebaConUnString(@Values("MI_STRINGS") String b) {
        System.out.println(b);
    }
 

Creación de objetos complejos

TwiP nos permite invocar a los métodos de prueba creando objetos complejos nuestros. Esto lo hacemos con la anotación @AutoTwip, la cual la declaramos a un método que se encargará de construir el objeto para pasar al método de prueba. Suponemos que tenemos un POJO Persona, con los atributos id, nombre y apellido.

 
    @AutoTwip
    public static Persona crearPersona(long id, String nombre, String apellido) {
        return new Persona(id, nombre, apellido);
    }
 
    @Test
    public void pruebaConObjetoPropio(Persona persona) {
        System.out.println(persona);
    }
 

 Al ejecutar la prueba, TwiP irá invocando repetidas veces al método crearPersona() para obtener un objeto distinto para pasarle al método de prueba pruebaConObjetoPropio. Esta ejecución generará 832 pruebas, ya que TwiP hará automáticamente las distintas combinaciones posibles para construir el objeto.

Aprender más

Pueden aprender más sobre TwiP en: 

Los invitamos a descargar un proyecto de ejemplo de TwiP, que incluye una demo de uso junto con todas las librerías necesarias para su ejecución.

Inspiración.

"Si tú tienes una manzana y yo tengo una manzana e intercambiamos las manzanas, entonces tanto tú como yo seguiremos teniendo una manzana cada uno. Pero si tú tienes una idea y yo tengo una idea, e intercambiamos las ideas, entonces ambos tendremos dos ideas"

Bernard Shaw