TwiP (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: